基础知识
循环链表是单链表的另一种形式,它是一个首尾相接的链表,其特点是将单链表最后一个结点的指针域由NULL改为指向头结点或线性表中的第一个结点,就得到了单链形式的循环链表,并称为循环单链表。
循环链表的图解
合并思路
先找到两个链表的尾,并分别由指针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);
}