c语言连接两个循环单链表(尾指针)
时间: 2023-05-26 08:07:45 浏览: 154
循环单链表是一种特殊的单链表,其尾节点的指针指向头节点,形成一个环形结构。因此,连接两个循环单链表的过程和连接两个普通的单链表类似,只需要将第一个循环单链表的尾节点指向第二个循环单链表的头节点即可。
具体实现可以参考以下代码:
```c
struct Node {
int data;
struct Node* next;
};
typedef struct Node Node;
// 连接两个循环单链表
Node* connect(Node* head1, Node* head2) {
// 找到第一个循环单链表的尾节点
Node* tail1 = head1->next;
while (tail1->next != head1) {
tail1 = tail1->next;
}
// 找到第二个循环单链表的尾节点
Node* tail2 = head2->next;
while (tail2->next != head2) {
tail2 = tail2->next;
}
// 连接两个循环单链表
tail1->next = head2;
tail2->next = head1;
return head1;
}
```
其中,`head1`和`head2`分别表示两个循环单链表的头节点。首先,通过遍历找到两个循环单链表的尾节点`tail1`和`tail2`,然后将`tail1`的`next`指针指向`head2`,将`tail2`的`next`指针指向`head1`,这样就连接了两个循环单链表。最后返回第一个循环单链表的头节点`head1`,作为连接后的循环单链表的头。
使用示例:
```c
Node* createList(int data[], int n) {
Node* head = (Node*) malloc(sizeof(Node)); // 创建头节点
head->data = -1;
head->next = head; // 初始化为空的循环单链表
for (int i = 0; i < n; i++) {
Node* node = (Node*) malloc(sizeof(Node));
node->data = data[i];
node->next = head->next; // 新节点指向头节点的下一个节点
head->next = node; // 头节点指向新节点
}
return head;
}
int main() {
int data1[] = {1, 2, 3};
int data2[] = {4, 5, 6};
Node* head1 = createList(data1, 3);
Node* head2 = createList(data2, 3);
connect(head1, head2);
// 遍历输出连接后的循环单链表
Node* p = head1->next;
while (p != head1) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return 0;
}
```
输出结果:
```
1 2 3 4 5 6
```
可以看出,连接后的循环单链表中包括两个原来的循环单链表中的所有节点。
阅读全文