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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1135004584/article/details/79329519

循环链表的和并:只需把将链表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;
}


运行结果:



猜你喜欢

转载自blog.csdn.net/a1135004584/article/details/79329519
今日推荐