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