设有一线性表e={e1,e2,...,en-1,en),其逆线性表定义为e'={en,en-1,...,e2,e1}。请设计一个算法,将线性表逆置,要求逆线性表仍占用原线性表的空间,并且用顺序表来表示,写出逆置函数。用C语言实现
时间: 2024-09-17 22:01:30 浏览: 63
在C语言中,我们可以使用两个指针,一个指向当前元素,另一个指向下一个待处理的位置,然后交换它们所指向的元素并同时移动这两个指针,直到达到线性表的末尾。这里是一个简单的算法描述及C语言实现:
```c
#include <stdio.h>
// 定义一个结构体来表示线性表的节点
typedef struct Node {
int data;
struct Node* next;
} Node;
// 用于逆序线性表的函数
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个元素,则无需反转
return;
}
Node* prev = NULL; // 初始化前一个节点为NULL
Node* current = *head; // 当前节点初始化为头节点
while (current != NULL) { // 遍历整个链表
Node* nextTemp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前一个节点
prev = current; // 更新前一个节点为当前节点
current = nextTemp; // 移动到下一个节点
}
*head = prev; // 最后,头节点变成了原链表的最后一个元素
}
// 打印链表函数
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建示例线性表
Node* list = (Node*)malloc(sizeof(Node));
list->data = 1;
list->next = (Node*)malloc(sizeof(Node));
list->next->data = 2;
list->next->next = (Node*)malloc(sizeof(Node));
list->next->next->data = 3;
list->next->next->next = NULL;
printf("Original List: ");
printList(list);
reverseList(&list); // 逆序操作
printf("\nReversed List: ");
printList(list);
return 0;
}
```
这个程序首先创建了一个简单的顺序列表,然后通过`reverseList`函数将其逆序。最后打印出原链表和逆序后的链表以验证结果。
阅读全文