c语言编程,使用链表储存新数组来解决下列问题:将线性表(顺序存储)中前 m 个元素和后 n 个元素进行互换(m+n<length), 控制台输入的第一行是线性表元素的个数,第二行是线性表内容,第三行分别是m和n。 输出互换后的数组。给出完整代码
时间: 2024-10-16 07:20:05 浏览: 32
在C语言中,可以使用链表来模拟这个操作,因为数组的直接交换在大规模数据下可能会导致性能问题,特别是当内存大小有限时。这里是一个简单的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建链表并添加元素
Node* createList(int size) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0; // 初始化第一个元素为0
head->next = NULL;
for (int i = 1; i < size; ++i) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = i;
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 交换链表前后部分
void swapParts(Node* head, int m, int n) {
if (m == 0 || n == 0 || m + n >= head->next != NULL) return; // 防止越界
Node* start1 = head;
Node* end1 = head;
advance(end1, m - 1); // 找到m位置
Node* start2 = end1->next;
Node* end2 = start2 + n - 1;
advance(end2, -1); // 找到最后n位置
while (end1 != start2) {
// 临时存储start1的数据
int temp = start1->data;
start1->data = start2->data;
start2->data = temp;
start1 = start1->next;
start2 = start2->next;
}
}
// 移动指针到特定位置
void advance(Node** node, int steps) {
for (int i = 0; i < steps && *node != NULL; ++i) {
(*node) = (*node)->next;
}
}
// 打印链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
int length;
scanf("%d", &length);
Node* list = createList(length);
int m, n;
scanf("%d %d", &m, &n);
swapParts(list, m, n);
printf("互换后的数组: ");
printList(list);
free(list); // 清理内存
return 0;
}
```
在这个代码中,我们首先创建了一个链表,然后通过`swapParts`函数来交换链表的前后部分,最后打印出交换后的结果。
阅读全文