用C语言将一个带头结点的数据域依次为al,a2,…, an(n>3)的单链表的所有结点逆置, 即第一个结点的数据域变为an,…,最后一个结点的数据域为al。编程实现以上功能要求。
时间: 2024-03-15 18:46:55 浏览: 46
单链表的逆置(c语言)
好的,以下是用C语言实现单链表逆置的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct node {
int data;
struct node *next;
} Node;
// 构建带头结点的单链表
Node *createList(int n) {
Node *head = (Node *)malloc(sizeof(Node));
head->next = NULL;
Node *tail = head;
for (int i = 0; i < n; i++) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = i + 1;
node->next = NULL;
tail->next = node;
tail = node;
}
return head;
}
// 输出链表
void printList(Node *head) {
Node *p = head->next;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// 单链表逆置
void reverseList(Node *head) {
Node *p = head->next;
Node *q = p->next;
p->next = NULL;
while (q != NULL) {
Node *temp = q->next;
q->next = p;
p = q;
q = temp;
}
head->next = p;
}
int main() {
int n = 5;
Node *head = createList(n);
printf("原链表:");
printList(head);
reverseList(head);
printf("逆置后的链表:");
printList(head);
return 0;
}
```
这段代码中,我们首先定义了一个链表结构体 `Node`,其中包含了数据域和指向下一个节点的指针。然后我们通过 `createList` 函数创建了一个带头结点的单链表,其中头结点的数据域为 0。接着我们通过 `printList` 函数输出了原链表,然后通过 `reverseList` 函数实现了单链表的逆置操作,并最终通过 `printList` 函数输出逆置后的链表。
需要注意的是,在逆置链表时,我们需要使用三个指针 `p`,`q`,`temp`。`p` 指向当前逆置后的链表头节点,`q` 指向原链表当前节点的下一个节点,`temp` 用于保存 `q` 的下一个节点,以便我们在逆置 `q` 的时候不丢失后续节点。
阅读全文