c语言循环链表合并,循环单向链表-合并算法

基础知识

循环链表是单链表的另一种形式,它是一个首尾相接的链表,其特点是将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点,就得到了单链形式的循环链表,并称为循环单链表。

循环链表的图解

1f1e839043f1fdc0eec7c608ee2c3bb6.png

合并思路

先找到两个链表的尾,并分别由指针p、q指向他们,然后将第一个链表的尾与第二个链表的第一个结点链接起来,并修改第二个表的尾Q,使它的链域指向第一个表的头结点。

注意:链表合并后,需记得释放被合并链表的头结点。

代码实现

#include

#include

typedef struct Node {

int data;

struct Node * next;

} Node, *LinkList;

void initLink(LinkList *link);

void create(LinkList link, int start);

void fusion(LinkList linkA, LinkList linkB);

int main(int argc, char *argv[]) {

LinkList LinkA, LinkB;

initLink(&LinkA);

initLink(&LinkB);

create(LinkA, 1);

create(LinkB, 10);

fusion(LinkA, LinkB);

Node *p;

p = LinkA->next;

while (p != LinkA) {

printf("%d\n", p->data);

p = p->next;

}

return 0;

}

/**

* 初始化链表

*/

void initLink(LinkList *link) {

*link = (LinkList)malloc(sizeof(Node));

(*link)->next = NULL;

}

/**

* 创建循环链表

*/

void create(LinkList link, int start) {

Node *node, *q;

q = link;

int i;

for (i = start; i < start + 5; i++) {

node = (Node *)malloc(sizeof(Node));

node->data = i;

link->next = node;

link = node;

}

link->next = q;

}

/***

* 合并循环链表

*/

void fusion(LinkList linkA, LinkList linkB) {

Node *p, *q;

p = linkA->next;

q = linkB->next;

while (p->next != linkA) {

p = p->next;

}

while (q->next != linkB) {

q = q->next;

}

p->next = linkB->next;

q->next = linkA;

/*释放LinkB的头结点*/

free(linkB);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值