设单链表结点类型 node 定义如下: struct node { int data; struct node *next; }; 请编写程序,完成下列功能: ⑴ 建立一支单链表 A,共包含 200 个结点,每个结点对应的 data 信息由用户确定,并输出单链表 A。 ⑵ 将单链表 A 分解为两个单链表 A 和 B,其头指针分别为 head1 和 head2,使得 A 链表中含原链表 A 中序号为奇数的元素,而 B 链表中含原链表 A 中序号为偶数的元素, 且保持原来的相对顺序,并输出单链表 A、B。
时间: 2024-04-14 21:27:56 浏览: 56
下面是一个示例程序,实现了你所描述的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结点类型
struct node
{
int data;
struct node *next;
};
// 建立单链表
struct node *createLinkedList(int n)
{
struct node *head = NULL;
struct node *current = NULL;
for (int i = 0; i < n; i++)
{
// 创建新结点
struct node *newNode = (struct node *)malloc(sizeof(struct node));
// 获取用户输入的 data 信息
printf("请输入第 %d 个结点的 data:", i + 1);
scanf("%d", &(newNode->data));
newNode->next = NULL;
if (head == NULL)
{
// 第一个结点
head = newNode;
current = newNode;
}
else
{
// 将新结点添加到链表末尾
current->next = newNode;
current = newNode;
}
}
return head;
}
// 分解单链表为奇数链表和偶数链表
void splitLinkedList(struct node *head, struct node **head1, struct node **head2)
{
struct node *oddHead = NULL; // 奇数链表头指针
struct node *oddCurrent = NULL; // 奇数链表当前结点指针
struct node *evenHead = NULL; // 偶数链表头指针
struct node *evenCurrent = NULL; // 偶数链表当前结点指针
struct node *current = head;
int index = 1;
while (current != NULL)
{
if (index % 2 == 1)
{
// 奇数结点
if (oddHead == NULL)
{
oddHead = current;
oddCurrent = current;
}
else
{
oddCurrent->next = current;
oddCurrent = current;
}
}
else
{
// 偶数结点
if (evenHead == NULL)
{
evenHead = current;
evenCurrent = current;
}
else
{
evenCurrent->next = current;
evenCurrent = current;
}
}
current = current->next;
index++;
}
if (oddCurrent != NULL)
{
oddCurrent->next = NULL;
}
if (evenCurrent != NULL)
{
evenCurrent->next = NULL;
}
*head1 = oddHead;
*head2 = evenHead;
}
// 输出单链表
void printLinkedList(struct node *head)
{
struct node *current = head;
while (current != NULL)
{
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main()
{
int n = 200; // 结点个数
// 建立单链表 A
struct node *headA = createLinkedList(n);
// 输出单链表 A
printf("单链表 A:");
printLinkedList(headA);
// 分解单链表 A 为奇数链表 A 和偶数链表 B
struct node *head1 = NULL; // 奇数链表头指针
struct node *head2 = NULL; // 偶数链表头指针
splitLinkedList(headA, &head1, &head2);
// 输出单链表 A 和 B
printf("单链表 A:");
printLinkedList(head1);
printf("单链表 B:");
printLinkedList(head2);
return 0;
}
```
这个程序首先通过 `createLinkedList` 函数建立一个包含 200 个结点的单链表 A,并将其头指针返回。然后通过 `splitLinkedList` 函数将单链表 A 分解为奇数链表 A 和偶数链表 B,同时返回它们的头指针。最后,通过 `printLinkedList` 函数输出单链表 A 和 B 的内容。
请注意,这个程序中的链表索引从1开始,奇数索引对应奇数结点,偶数索引对应偶数结点。
阅读全文