用c语言帮我完成以下程序:已知一个正整数序列,序列元素个数未知,但至少有两个元素,你的任务是建立一个单链表用于存储这个正整数序列。然后实现交换此链表中任意指定的两段,第一段为[s1,t1],第二段[s2,t2]。s1、t1、s2、t2代表链表的第几个节点,且满足s1<=t1,s2<=t2,t1<s2,s2一定小于等于链表节点的总个数。正整数的输入用-1作为结束标志,注意-1不算这个正整数序列中的元素(不要统计-1)。最后将链表的全部节点释放。
时间: 2024-02-03 19:12:40 浏览: 215
以下是用 C 语言实现的程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建单链表
Node *createList() {
Node *head = NULL, *tail = NULL;
int num;
printf("请输入正整数序列,以-1结束:\n");
while (1) {
scanf("%d", &num);
if (num == -1) break;
Node *p = (Node *)malloc(sizeof(Node));
p->data = num;
p->next = NULL;
if (head == NULL) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
}
return head;
}
// 输出链表
void printList(Node *head) {
printf("链表中的元素为:");
Node *p = head;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 交换两段链表
void swapList(Node **head, int s1, int t1, int s2, int t2) {
if (s1 > t1 || s2 > t2) {
printf("输入错误\n");
return;
}
if (s1 == s2 && t1 == t2) return;
Node *p1 = NULL, *p2 = NULL, *q1 = NULL, *q2 = NULL;
Node *p = *head, *pre = NULL;
int i = 1;
while (p != NULL && i <= t2) {
if (i == s1 - 1) q1 = p;
if (i == t1) p1 = p;
if (i == s2 - 1) q2 = p;
if (i == t2) p2 = p;
pre = p;
p = p->next;
i++;
}
if (p1 == NULL || p2 == NULL || q1 == NULL || q2 == NULL) {
printf("输入错误\n");
return;
}
if (t1 >= s2) {
printf("两段链表有重叠部分,无法交换\n");
return;
}
Node *tmp = p1->next;
p1->next = p2->next;
p2->next = tmp;
if (q1 == NULL) *head = p2;
else q1->next = p2;
if (q2 == NULL) *head = p1;
else q2->next = p1;
}
// 释放链表
void freeList(Node *head) {
Node *p = head;
while (p != NULL) {
Node *tmp = p;
p = p->next;
free(tmp);
}
}
int main() {
Node *head = createList();
printList(head);
int s1, t1, s2, t2;
printf("请输入需要交换的两段链表的位置:\n");
scanf("%d%d%d%d", &s1, &t1, &s2, &t2);
swapList(&head, s1, t1, s2, t2);
printList(head);
freeList(head);
return 0;
}
```
程序中,我们首先通过 `createList()` 函数创建了一个单链表,然后通过 `printList()` 函数输出了这个链表中的元素。接着,我们通过 `swapList()` 函数实现了交换两段链表的功能。最后,我们通过 `freeList()` 函数释放了链表的所有节点。
在 `swapList()` 函数中,我们首先判断了输入是否合法,然后通过遍历链表找到需要交换的两段链表的位置。如果这两段链表有重叠部分,就无法交换。否则,我们通过交换两段链表的指针实现了交换。在实现过程中,需要注意要处理好链表头和尾节点的指针。
完整程序输出示例:
```
请输入正整数序列,以-1结束:
1 2 3 4 5 6 -1
链表中的元素为:1 2 3 4 5 6
请输入需要交换的两段链表的位置:
2 3 5 6
链表中的元素为:1 5 6 4 2 3
```
阅读全文
相关推荐



















