利用線性鏈表基本操作完成兩個有序線性表的合並


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM