以带表头结点单链表为存储结构编写程序实现单链表的逆置操作
时间: 2024-05-16 16:15:24 浏览: 104
单链表逆置
以下是使用C语言实现的带表头结点单链表逆置操作的程序:
```c
#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node, *List;
List createList() {
// 创建带表头结点的单链表
List head = (List)malloc(sizeof(Node));
head->next = NULL;
return head;
}
void insertList(List head, int data) {
// 在表头插入新节点
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = head->next;
head->next = newNode;
}
void printList(List head) {
// 遍历并输出单链表
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void reverseList(List head) {
// 将单链表逆置
Node *p = head->next, *q = NULL;
head->next = NULL;
while (p != NULL) {
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}
int main() {
List myList = createList();
insertList(myList, 1);
insertList(myList, 2);
insertList(myList, 3);
insertList(myList, 4);
printf("原链表:");
printList(myList);
reverseList(myList);
printf("逆置后的链表:");
printList(myList);
return 0;
}
```
在这个程序中,我们首先定义了一个结构体 `Node` 来表示单链表的节点,我们使用 `typedef` 关键字将 `Node` 定义为 `List` 类型,这样 `List` 就可以作为单链表的类型使用。在创建单链表时,我们需要为其加上一个表头结点,因此定义了 `createList` 函数来创建带表头结点的单链表,并返回表头结点的指针。
在插入新节点时,我们是在表头插入的,因此定义了 `insertList` 函数来实现在表头插入新节点。在输出单链表时,我们使用 `printList` 函数来遍历单链表,并输出每个节点的值。
在逆置单链表时,我们使用 `reverseList` 函数来实现。我们首先定义两个指针 `p` 和 `q`,分别指向当前节点和它的前驱节点。我们从头节点开始,将头节点的下一个节点断开,然后将这个节点移到头节点之后,重复这个过程,直到整个单链表都被遍历完毕,最后头节点的下一个节点就是逆置后的单链表的头节点。
在主函数中,我们先创建一个带表头结点的单链表,然后插入一些节点,输出原始单链表,调用 `reverseList` 函数逆置单链表,输出逆置后的单链表。
阅读全文