C语言数据结构之循环链表的合并操作

循环链表的和并:只需把将链表2的最后一个节点的下一个节点等于链表1的头结点的下一个节点,

                链表1的头结点的下一个节点 = 链表2的头结点的下一个节点,

                最后将链表2的头结点给释放掉就实现了循环链表的合并操作。


图示:

图画的比较潦草。汗!


实现代码:

main5.c

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

/**
 * 循环链表
 */
typedef struct cirNode{
    int id;//标号
    struct cirNode * next;
} *CirLinkList;


//尾插法添加元素
void addNode(CirLinkList cirLinkList,int id);

//两个循环链表合并
void sumLinkList(CirLinkList cl1,CirLinkList cl2);

void traverse(CirLinkList cll,void(*pfun)(int));

void initLinkList(struct cirNode ** linkList);

/**
 * 随机生成节点
 * @param cll
 * @param count
 */
void randomGenerated(CirLinkList cll,int count);

void pfun(int data)
;

int main(void)
{
    CirLinkList cl1=NULL,cl2=NULL;
    initLinkList(&cl1);
    initLinkList(&cl2);

    randomGenerated(cl1,10);
    randomGenerated(cl2,10);

    traverse(cl1,pfun);
    printf("\n");
    traverse(cl2,pfun);
    printf("\n");
    sumLinkList(cl1,cl2);

    traverse(cl1,pfun);
    printf("\n");

    return 0;
}

void pfun(int data)
{
    printf("%d ",data);
}

//头插法添加元素
void addNode(CirLinkList cirLinkList,int id)
{
    struct cirNode * cn = (struct cirNode *)malloc(sizeof(struct cirNode));
    cn->id = id;
    cn->next = cirLinkList->next;
    cirLinkList->next = cn;
}

/**
 * 将两个不空的循环链表拼接起来
 * @param cl1
 * @param cl2
 */
void sumLinkList(CirLinkList cl1,CirLinkList cl2)
{
    struct cirNode *cn1,*cn2;
    cn2 = cl1->next;
    cl1->next = cl2->next;

    cn1 = cl2->next;
    while(cn1->next != cl2)
        cn1 = cn1->next;
    cn1->next = cn2;
    free(cl2);
}

void traverse(CirLinkList cll,void(*pfun)(int))
{
    struct cirNode *cn = cll->next;

    while(cn != cll)
    {
        pfun(cn->id);
        cn = cn->next;
    }
}

void randomGenerated(CirLinkList cll,int count)
{

    //srand((unsigned)time(NULL));//置随机数种子

    int k=0;
    for(int i=0;i<count;i++)
    {
        k = rand()%count;//获取0-count以内的数
        addNode(cll,k);
    }
}

void initLinkList(struct cirNode ** linkList)
{
    (*linkList) = (CirLinkList)malloc(sizeof(struct cirNode));//生成一个头结点
    (*linkList)->next = *linkList;
}


运行结果:



  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值