合併單鏈表

天勤論壇高分筆記 2016 版,第 28 頁,例 2-3。
描述:A和B是兩個單鏈表(帶表頭結點),其中元素遞增有序。設計一個算法將A和B歸併成一個按元素值非遞減有序的鏈表C,C由A和B中的結點組成。算法

尾插法實現:函數

c/*
Page 28, Example 2-3.
描述:A和B是兩個單鏈表(帶表頭結點),其中元素遞增有序。
    設計一個算法將A和B歸併成一個按元素值非遞減有序的鏈表C,C由A和B中的結點組成。
*/

#include "stdio.h"
#include "stdlib.h" // 使用了malloc函數

typedef struct LNode
{
    int data;
    struct LNode *next; // 別漏寫 struct
}LNode;

void createLinkedListR(LNode *&LL, int a[], int n)  // 尾插法建立鏈表
{
    LNode *s, *r;
    int i;

    LL=(LNode *)malloc(sizeof(LNode));  // 頭結點
    LL->next=NULL;

    r=LL;
    for(i=0; i<n; i++)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=a[i];
        s->next=NULL;

        r->next=s;
        r=r->next;  // r=s;
    }
    // r->next=NULL;
}

void printLinkedList(LNode *LL) // 打印單鏈表
{
    LNode *p=LL;
    int count=0;

    if(p->next != NULL){    // 若是鏈表非空
        p=p->next;
    }
    else
    {
        return ;
    }

    do
    {
        printf("%d, ", p->data);
        count++;
        p=p->next;
    }while(p != NULL);  // 使用 do-while 語句,while 語句沒法打印最後一個結點
    printf("Node Count: %d. \n", count);
}

void mergeLinkedList(LNode *A, LNode *B, LNode *&C)
{
    LNode *p=A->next, *q=B->next, *r;   // p和q都跳過了頭結點

    C=A;    // 把A的頭結點拿過來利用
    C->next=NULL;
    free(B);    // 釋放單鏈表B的頭結點

    r=C;    // r一直指向C的尾結點
    while(p != NULL && q !=NULL)
    {
        if(p->data < q->data)
        {
            r->next=p;  // 連接上
            p=p->next;  // A的下一個結點
            r=r->next;  // 尾結點跟蹤
        }
        else
        {
            r->next=q;
            q=q->next;
            r=r->next;
        }
    }
    r->next=NULL;
    if(p!=NULL)
        r->next=p;
    if(q!=NULL)
        r->next=q;
}

int main()
{
    LNode *A=NULL, *B=NULL, *C=NULL;
    int a[]={1,4,5,7,9,13,16,19,23,24,32};  // 11
    int b[]={1,6,15,19,27,32,40};   // 7

    createLinkedListR(A, a, 11);
    createLinkedListR(B, b, 7);

    printLinkedList(A);
    printLinkedList(B);

    mergeLinkedList(A, B, C);   // 該函數事後釋放掉了B,不能再打印了
    printLinkedList(C);

    return 0;
}
相關文章
相關標籤/搜索