利用线性链表基本操作完成两个有序线性表的合并
生活随笔
收集整理的這篇文章主要介紹了
利用线性链表基本操作完成两个有序线性表的合并
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
La、Lb線性鏈表升序排列,將結(jié)果放在Lc鏈表里。之前有文章寫過兩個有序鏈表的合并
區(qū)別在于,前面的做法是保留La的頭節(jié)點,free掉Lb的頭節(jié)點,將余下節(jié)點串起來。這種方法是面向過程編程
而現(xiàn)在討論的做法,是單獨(dú)建立一個Lc鏈表,利用一些已經(jīng)寫好的基本操作函數(shù)來完成,這種模塊化編程做法實際上還簡單些。不光模塊函數(shù)里寫不了幾行,在調(diào)用這些函數(shù)時減少了不必要的瑣碎過程的思考時間。
?
該做法的核心思想:將每輪比較過后偏小的那個節(jié)點從相應(yīng)鏈表中刪除(這是頭節(jié)點的指針不會指向該節(jié)點了,但該節(jié)點的空間依舊保留),append(附加)到Lc鏈表。pa、pb始終指向當(dāng)前La、Lb鏈表的第一個節(jié)點(頭節(jié)點后面那個),最后會free掉La、Lb的頭節(jié)點
?
代碼如下:
#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) {//申明結(jié)構(gòu)體變量要不要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);//將首節(jié)點刪除,并將地址賦給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?
轉(zhuǎn)載于:https://www.cnblogs.com/gabygoole/p/5554866.html
總結(jié)
以上是生活随笔為你收集整理的利用线性链表基本操作完成两个有序线性表的合并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查某个类是否实现了某个协议
- 下一篇: iOS开发网络篇—搭建本地服务器