利用线性链表基本操作完成两个有序线性表的合并
生活随笔
收集整理的這篇文章主要介紹了
利用线性链表基本操作完成两个有序线性表的合并
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
La、Lb線性鏈表升序排列,將結果放在Lc鏈表里。之前有文章寫過兩個有序鏈表的合并
區別在于,前面的做法是保留La的頭節點,free掉Lb的頭節點,將余下節點串起來。這種方法是面向過程編程
而現在討論的做法,是單獨建立一個Lc鏈表,利用一些已經寫好的基本操作函數來完成,這種模塊化編程做法實際上還簡單些。不光模塊函數里寫不了幾行,在調用這些函數時減少了不必要的瑣碎過程的思考時間。
?
該做法的核心思想:將每輪比較過后偏小的那個節點從相應鏈表中刪除(這是頭節點的指針不會指向該節點了,但該節點的空間依舊保留),append(附加)到Lc鏈表。pa、pb始終指向當前La、Lb鏈表的第一個節點(頭節點后面那個),最后會free掉La、Lb的頭節點
?
代碼如下:
#define ERROR 0 #define OK 1 typedef int Status; typedef struct LNode {ElementType data;struct LNode *next; } *PtrToNode;typedef struct //查下struct的格式 {PtrToNode head,tail;int len; }LinkList;Status initList(LinkList &L) {//申明結構體變量要不要malloc?L.len = 0;L.head = L.tail = (struct LinkList *)malloc(sizeof(struct LinkList));//shi bu shi struct LinkList return OK; }int getCurElem(PtrToNode p) {return p->data; }PtrToNode getHead(LinkList &L) {return L.head; }PtrToNode NextPos(LinkList &L,PtrToNode node) {return node->next; }void delFirst(LinkList &L,PtrToNode q) {head = getHead(L);q = head->next;head->next = head->next->next; }void append(LinkList &L,PtrToNode q) {L.tail->next = q;L.tail = q; }void freeNode(PtrToNode node) {free(node); }Status MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {PtrToNode p;int a,b;if(!initList(Lc)) return ERROR;PtrToNode ha = getHead(La);PtrToNode hb = getHead(Lb);PtrToNode pa = NextPos(La,ha);PtrToNode pb = NextPos(Lb,hb);while(pa && pb) {a = getCurElem(pa);b = getCurElem(pb);if(a <= b) {delFirst(La,q);//將首節點刪除,并將地址賦給q append(Lc,q);pa = NextPos(La,ha);} else {delFirst(Lb,q);append(Lc,q);pb = NextPos(Lb,hb);}}if(pa) {append(Lc,pa);} else {append(Lc,pb);}freeNode(ha); freeNode(hb);return OK; } View Code?
轉載于:https://www.cnblogs.com/gabygoole/p/5554866.html
總結
以上是生活随笔為你收集整理的利用线性链表基本操作完成两个有序线性表的合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查某个类是否实现了某个协议
- 下一篇: iOS开发网络篇—搭建本地服务器