代码改变世界

合并循环链表A和B

2013-06-09 21:22  Keiven_LY  阅读(3368)  评论(0)    收藏  举报

目的:

    将两个用尾指针表示的循环链表A和B合并成一个新的循环链表C

思想:

  1、将A的尾指针reara指向B的首元节点,同时释放B的头节点的存储空间;

  2、将B的尾指针rearb指向A的头节点

  3、合并后的链表C的尾指针仍为rearb

程序源码:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef int elementtype;   /* 自定义类型  这里将elementtype定义为int类型 */

typedef struct CNode 
{
    elementtype data;
    struct CNode *next;
    
}CNode;


CNode *crt_linklist()  /* 创建尾指针表示的循环链表 */
{
    CNode *rear;   /* 定义尾指针 */
    int a;     /* 链表节点数据元素 */
    CNode *p;
    rear=(CNode*)malloc(sizeof(CNode));   /* 为为指针节点分配内存空间 */

    rear->data=-1;    /* 区分节点为尾指针节点的标志 */
    rear->next =rear;
    printf("请输入循环链表的元素(以-1结束):\n");
    scanf_s("%d ",&a);

    while(a!=-1)
    {
        p=(CNode*)malloc(sizeof(CNode));
        p->data=a;
        p->next=rear->next;
        rear->next=p;
        scanf_s("%d",&a);
    }
    p=rear;
    while(p->next!=rear)
    {
        p=p->next;
    }
    return p;

}

CNode *merge_rear(CNode *reara, CNode *rearb)  //将两个循环链表合并成一个新的循环链表
{
    CNode *p;
    p=reara->next; //指针p用来保存链表a的头节点地址
    reara->next=rearb->next->next; //链表a的尾节点下一节点接链表b的第一个数据节点
    free(rearb->next); //释放链表b的头节点的存储空间
    rearb->next=p; //链表b的尾节点的下一节点接链表a的头节点
    return rearb; //返回新链表的尾指针
}

void print(CNode *cl)
{
    CNode *p;
    p=cl->next->next;
    while(p!=cl->next)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}


main()
{

    CNode *clista,*clistb,*clistc;

    printf("建立循环链表A,请输入数据!\n");
    clista=crt_linklist();
    printf("建立的循环链表A为:\n");
    print(clista);

    printf("\n建立循环链表B,请输入数据!\n");
    clistb=crt_linklist();
    printf("建立的循环链表B为:\n");
    print(clistb);

    clistc=merge_rear(clista,clistb);
    printf("\n链表A和B合并后的新链表C为:\n");
    print(clistc);

    system("pause");
}

结果显示: