对线性表中的前M个元素和后N个元素整体互换。 【实验要求】 (1)采用顺序表存储结构实现。 (2)采用链表存储结构实现。写一个c语言程序
时间: 2024-09-13 14:03:03 浏览: 128
桂电数据结构实验一-线性表.doc
在C语言中,对线性表(无论是顺序表还是链表)中的前M个元素和后N个元素整体互换可以采用不同的策略,取决于数据结构:
**对于顺序表(数组)实现:**
```c
#include <stdio.h>
void swapElements(int arr[], int n, int m) {
if (m <= n && m > 0) {
int temp = 0;
for (int i = 0; i < n - m + 1; i++) {
temp = arr[i];
arr[i] = arr[i+m-1] = temp; // 将移动后的元素放到原位置
}
}
}
// 示例
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int M = 3, N = 4;
printf("Before swap: ");
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
swapElements(arr, 10, M);
printf("\nAfter swap: ");
for (int i = 0; i < 10; i++)
printf("%d ", arr[i]);
return 0;
}
```
**对于单向链表实现:**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void swapElements(Node** head, int M, int N) {
Node* prevMthNode = NULL;
Node* current = *head;
while (current != NULL && M--) {
prevMthNode = current;
current = current->next;
}
// 分割链表
prevMthNode->next = NULL;
Node* tail = current;
current = tail->next;
tail->next = NULL;
// 交换后N个节点
Node* newTail = current;
for (int i = 0; i < N-1; i++) {
Node* temp = current->next;
current->next = current->next->next;
temp->next = newTail;
newTail = temp;
}
// 合并链表
prevMthNode->next = newTail;
current = tail;
while (current->next != NULL)
current = current->next;
current->next = tail;
}
// 示例
int main() {
Node* head = createLinkedList(); // 创建链表函数省略
// 添加元素...
int M = 3, N = 4;
printf("Before swap: \n");
printLinkedList(head); // 打印链表函数省略
swapElements(&head, M, N);
printf("\nAfter swap: \n");
printLinkedList(head); // 打印链表函数省略
return 0;
}
```
注意,以上代码仅给出了基本的实现思路,实际项目中可能需要考虑边界条件、链表空的情况等细节。
阅读全文