用C语言分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1,a2,…,an)逆置为(an, an-1,…,a1)。 (2)以单链表作存储结构。
时间: 2024-11-30 11:19:39 浏览: 22
在C语言中,使用单链表作为存储结构实现线性表的就地逆置(也称为反转)可以分为以下几个步骤:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} ListNode;
// 就地逆置链表函数
void reverseList(ListNode** head) {
ListNode* prev = NULL; // 初始化前驱节点为空
ListNode* current = *head; // 当前节点初始化为头节点
ListNode* next_temp; // 临时储存当前节点的下一个
while (current != NULL) { // 只要还有节点
next_temp = current->next; // 记录当前节点的下一个
current->next = prev; // 将当前节点的指针指向前驱
prev = current; // 前驱节点移动到当前节点
current = next_temp; // 当前节点移动到下一个
}
*head = prev; // 最后更新头节点为新头(原尾)
}
// 示例:创建链表并逆置
void createList(ListNode** head) {
ListNode* node1 = (ListNode*)malloc(sizeof(ListNode));
ListNode* node2 = (ListNode*)malloc(sizeof(ListNode));
ListNode* node3 = (ListNode*)malloc(sizeof(ListNode));
node1->data = 1;
node2->data = 2;
node3->data = 3;
node1->next = node2;
node2->next = node3;
*head = node1; // 设置初始头节点
}
int main() {
ListNode* head = NULL;
createList(&head);
printf("Original list: ");
printList(head); // 打印原始链表
reverseList(&head); // 逆置链表
printf("\nReversed list: ");
printList(head); // 打印逆置后的链表
return 0;
}
// 辅助函数:打印链表
void printList(ListNode* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
```
在这个例子中,`reverseList` 函数通过迭代修改每个节点的 `next` 指针实现了链表的反转。
阅读全文