天勤论坛高分笔记 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;
}

土卜皿
341 声望8 粉丝

栽花种树,潜水跑酷。


引用和评论

0 条评论