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; }