数据结构(c语言版)分别实现顺序表和单链表的元素逆置,如原来是1,2,3,4,5,6,逆置后变为6,5,4,3,2,1,要求算法空间复杂度为0(1)。↔ 2.具体要求:分别在实验2、3的基础上,新增一个Reverse函数用于顺序表和单链表的逆置。
时间: 2024-09-20 15:06:01 浏览: 48
在C语言中,我们可以分别通过循环和指针操作来实现顺序表(数组)和单链表的元素逆置。
**顺序表(数组)逆置元素:**
```c
void ReverseArray(int arr[], int size) {
int start = 0;
int end = size - 1;
while (start < end) {
// 交换开始和结束位置的元素
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
// 移动边界
start++;
end--;
}
}
```
**单链表逆置元素(假设链表节点包含整数成员data和next):**
由于链表的特性,我们不能像数组那样直接访问任意位置的元素,需要借助额外的临时节点。这里可以使用迭代法实现:
```c
typedef struct Node {
int data;
struct Node* next;
} ListNode;
void ReverseList(ListNode** head) {
ListNode* prev = NULL;
ListNode* current = *head;
ListNode* nextTemp = NULL;
while (current != NULL) {
// 保存当前节点的下一个节点
nextTemp = current->next;
// 反转当前节点指向prev
current->next = prev;
// 更新prev和current
prev = current;
current = nextTemp;
}
// 设置新头
if (prev != NULL)
*head = prev;
}
```
这两个函数都满足了空间复杂度为O(1),因为它们只使用了几个固定的额外变量。
**实验要求实现Reverse函数:**
对于实验2和3,你可以创建两个函数,分别为`ReverseArray`和`ReverseList`,然后在主程序中分别调用这两个函数,传入相应的数据结构实例。例如:
```c
int main() {
// 实例化并初始化顺序表或链表
int arr[] = {1, 2, 3, 4, 5, 6};
int size = sizeof(arr) / sizeof(arr[0]);
ListNode* listHead = createLinkedList(arr, size); // 创建链表
// 新增的Reverse函数调用
ReverseArray(arr, size);
ReverseList(&listHead);
// 打印逆置后的结果
printArray(arr, size);
printLinkedList(listHead);
return 0;
}
```
阅读全文