c语言连接两个循环单链表(尾指针)
时间: 2023-05-26 18:07:49 浏览: 160
以下是两个循环单链表(尾指针)的连接示例代码:
```
#include <stdio.h>
#include <stdlib.h>
// 定义循环单链表结构体
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
// 创建循环单链表
ListNode *createList() {
ListNode *head = NULL; // 头结点
ListNode *tail = NULL; // 尾结点
// 输入循环单链表的数据,以-1结束
int x;
scanf("%d", &x);
while (x != -1) {
ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));
newNode->data = x;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
tail->next = head; // 尾结点指向头结点形成循环
} else {
tail->next = newNode;
tail = newNode;
tail->next = head; // 尾结点指向头结点形成循环
}
scanf("%d", &x);
}
return head;
}
// 合并两个循环单链表
ListNode *mergeList(ListNode *head1, ListNode *head2) {
ListNode *p = head1;
while (p->next != head1) { // 找到第一个循环单链表尾结点
p = p->next;
}
p->next = head2; // 第一个循环单链表的尾结点指向第二个循环单链表的头结点
p = head2;
while (p->next != head2) { // 找到第二个循环单链表尾结点
p = p->next;
}
p->next = head1; // 第二个循环单链表的尾结点指向第一个循环单链表的头结点
return head1;
}
// 遍历循环单链表
void traverseList(ListNode *head) {
ListNode *p = head;
printf("List: ");
do {
printf("%d ", p->data);
p = p->next;
} while (p != head);
printf("\n");
}
int main() {
// 创建第一个循环单链表
printf("Input List 1:\n");
ListNode *head1 = createList();
traverseList(head1);
// 创建第二个循环单链表
printf("Input List 2:\n");
ListNode *head2 = createList();
traverseList(head2);
// 合并两个循环单链表
ListNode *head = mergeList(head1, head2);
traverseList(head);
return 0;
}
```
示例输入:
```
Input List 1:
1 2 3 -1
Input List 2:
4 5 6 -1
```
示例输出:
```
List: 1 2 3
List: 4 5 6
List: 1 2 3 4 5 6
```
阅读全文