数据结构中建立两个用尾指针表示带头结点单循环链表A和B,其中A=(28,34,58,67,99)B=(50,60,70,45,88)用c语言编写代码
时间: 2024-09-21 09:08:18 浏览: 21
在C语言中,我们可以创建一个函数来合并两个单循环链表,这里使用尾指针是为了操作方便。首先,我们需要定义链表节点结构体,并创建两个链表头节点`headA`, `headB`。然后,我们将分别遍历两个链表,找到尾节点并链接它们。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化新节点
Node* newNode(int val) {
Node* node = (Node*)malloc(sizeof(Node));
if (!node) {
printf("Memory allocation failed.\n");
return NULL;
}
node->data = val;
node->next = NULL;
return node;
}
// 尾指针操作:找到链表尾部
Node* findTail(Node* head) {
while (head->next != head) {
head = head->next;
}
return head;
}
// 合并两个链表
Node* mergeLists(Node* headA, Node* headB) {
Node* tailA = findTail(headA);
Node* tailB = findTail(headB);
// 如果B的链表为空,直接将A的链表连接到B上
if (tailB == headB) {
tailB->next = headA;
return tailA;
}
// 否则,将B的尾部连接到A的尾部
tailA->next = headB;
tailA = tailA->next;
// 继续合并B剩余部分
while (tailA->next != tailB) {
tailA = tailA->next;
}
tailA->next = headA; // 连接A的剩余部分
return tailA;
}
void printList(Node* head) {
Node* temp = head;
while (temp != temp->next) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表 A 和 B
Node* headA = newNode(28);
headA->next = newNode(34);
headA->next->next = newNode(58);
headA->next->next->next = newNode(67);
headA->next->next->next->next = newNode(99); // 设置A的最后一个元素为自身
Node* headB = newNode(50);
headB->next = newNode(60);
headB->next->next = newNode(70);
headB->next->next->next = newNode(45);
headB->next->next->next->next = newNode(88); // 设置B的最后一个元素为自身
Node* mergedHead = mergeLists(headA, headB);
printf("Merged list A + B:\n");
printList(mergedHead);
return 0;
}
```
这段代码会合并两个链表,并以尾指针的方式保持单循环链表的特点。运行`main`函数可以看到合并后的链表。