2.3线性表的链式存储和运算—单链表应用举例
例2.5 已知單鏈表H,寫一算法將其倒置。即實(shí)現(xiàn)如圖2.22的操作。(a)為倒置前,(b)為倒置后。
算法思路:依次取原鏈表中的每個(gè)結(jié)點(diǎn),將其作為第一個(gè)結(jié)點(diǎn)插入到新鏈表中去,指針p用來(lái)指向當(dāng)前結(jié)點(diǎn),p為空時(shí)結(jié)束。
算法如下:
1 void reverse (Linklist H) 2 { 3 LNode *p; 4 p=H->next; /*p指向第一個(gè)數(shù)據(jù)結(jié)點(diǎn)*/ 5 H->next=NULL; /*將原鏈表置為空表H*/ 6 while (p) /*p結(jié)點(diǎn)不為空,循環(huán)*/ 7 { 8 q=p; /*用另一個(gè)結(jié)點(diǎn)q存儲(chǔ)p結(jié)點(diǎn)的信息*/ 9 p=p->next; /*不斷后移*/ 10 q->next=H->next; /*將當(dāng)前結(jié)點(diǎn)插到頭結(jié)點(diǎn)的后面*/ 11 H->next=q; /*將頭結(jié)點(diǎn)與當(dāng)前結(jié)點(diǎn)相連*/ 12 } 13 }算法2.15
該算法只是對(duì)鏈表中順序掃描一邊即完成了倒置,所以時(shí)間性能為O(n)。
例2.6 已知單鏈表L,寫一算法,刪除其重復(fù)結(jié)點(diǎn),即實(shí)現(xiàn)如圖2.23的操作。(a)為刪除前,(b)為刪除后。
算法思路:用指針p 指向第一個(gè)數(shù)據(jù)結(jié)點(diǎn),從它的后繼結(jié)點(diǎn)開始到表的結(jié)束,找與其值相同的結(jié)點(diǎn)并刪除之;p 指向下一個(gè);依此類推,p 指向最后結(jié)點(diǎn)時(shí)算法結(jié)束。
算法如下:
1 void pur_LinkList(LinkList H) 2 { 3 LNode *p,*q,*r; 4 p=H->next; /*p指向第一個(gè)結(jié)點(diǎn)*/ 5 if(p==NULL) 6 return; 7 while (p->next) 8 { 9 q=p; 10 while (q->next) /* 從*p的后繼開始找重復(fù)結(jié)點(diǎn)*/ 11 { 12 if (q->next->data==p->data) 13 { 14 r=q->next; /*找到重復(fù)結(jié)點(diǎn),用r指向,刪除*r */ 15 q->next=r->next; 16 free(r); 17 } 18 else 19 q=q->next; 20 } 21 p=p->next; /*p指向下一個(gè),繼續(xù)*/ 22 } 23 }算法2.16
該算法的時(shí)間性能為O(n2)。
例2.7 設(shè)有兩個(gè)單鏈表A、B,其中元素遞增有序,編寫算法將A、B歸并成一個(gè)按元素值遞減(允許有相同值)有序的鏈表C,要求用A、B中的原結(jié)點(diǎn)形成,不能重新申請(qǐng)結(jié)點(diǎn)。
算法思路:利用A、B兩表有序的特點(diǎn),依次進(jìn)行比較,將當(dāng)前值較小者摘下,插入到C表的頭部,得到的C表則為遞減有序的。
算法如下:
1 LinkList merge(LinkList A,LinkList B) 2 /*設(shè)A、B均為帶頭結(jié)點(diǎn)的單鏈表*/ 3 { 4 LinkList C; 5 LNode *p,*q; 6 p=A->next; /*A的第一個(gè)結(jié)點(diǎn)*/ 7 q=B->next; /*B的第一個(gè)結(jié)點(diǎn)*/ 8 C=A; /*C表的頭結(jié)點(diǎn)*/ 9 C->next=NULL; /*C表置空*/ 10 free(B); /*釋放B的頭結(jié)點(diǎn)*/ 11 while (p&&q) /*p和q結(jié)點(diǎn)都存在*/ 12 { 13 if(p->data<q->data) /*從原AB表上摘下較小者*/ 14 { 15 s=p; /*臨時(shí)結(jié)點(diǎn)s指向p*/ 16 p=p->next; 17 } 18 else 19 { 20 s=q; 21 q=q->next; 22 } 23 s->next=C->next; /*C表的第一個(gè)結(jié)點(diǎn)賦給結(jié)點(diǎn)s的后繼*/ 24 C->next=s; /*將結(jié)點(diǎn)s賦給C表頭結(jié)點(diǎn)的后繼*/ 25 } 26 if (p==NULL) 27 p=q; 28 while (p) /* 將剩余的結(jié)點(diǎn)一個(gè)個(gè)摘下,插入到C表的頭部*/ 29 { 30 s=p; 31 p=p->next; 32 s->next=C->next; 33 C->next=s; 34 } 35 }算法2.17
該算法的時(shí)間性能為O(m+n)。
轉(zhuǎn)載于:https://www.cnblogs.com/chunlanse2014/articles/4439661.html
總結(jié)
以上是生活随笔為你收集整理的2.3线性表的链式存储和运算—单链表应用举例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全国计算机等级考试题库二级C操作题100
- 下一篇: 全国计算机等级考试题库二级C操作题100