编程实现对一个单向链表的结点进行反转,也就是将链表结点按逆序排列,排序后链头将成为链尾,而链尾将成为链头。自定义函数名称及函数功能要求如下: (1)定义“createNode”函数,实现创建一个新结点。 (2)定义“createList”函数,实现一个单向链表的创建。 ● 在创建结点时通过键盘输入为每个结点的数据成员value进行赋值。 ● 使用“头插法”将每个结点逐一插入到链表中。 (3)定义“display”的函数,实现对链表所有结点的遍历输出。 (4)定义“reverse”的函数,实现对链表结点的反转。 目前,已经编辑完成“createNode”函数、“createList”函数和“main”函数,请编程实现“display”函数和“reverse”函数。
时间: 2024-02-11 13:07:53 浏览: 91
以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node *next;
} Node;
Node* createNode(int value) {
Node* node = (Node*)malloc(sizeof(Node));
node->value = value;
node->next = NULL;
return node;
}
Node* createList(int n) {
Node* head = NULL;
Node* p = NULL;
int value;
for (int i = 0; i < n; i++) {
scanf("%d", &value);
Node* node = createNode(value);
if (head == NULL) {
head = node;
} else {
p->next = node;
}
p = node;
}
return head;
}
void display(Node* head) {
Node* p = head;
while (p != NULL) {
printf("%d ", p->value);
p = p->next;
}
printf("\n");
}
Node* reverse(Node* head) {
Node *prev = NULL, *curr = head, *next = NULL;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
int main() {
int n;
scanf("%d", &n);
Node* head = createList(n);
display(head);
head = reverse(head);
display(head);
return 0;
}
```
首先定义了一个结构体 `Node` ,包含一个 `value` 数据成员和一个指向下一个结点的指针 `next` 。
然后实现了 `createNode` 函数,用于创建一个新的结点,并为 `value` 赋值后将其插入链表中。
接着实现了 `createList` 函数,用于创建一个包含 `n` 个结点的链表。在创建结点时,使用头插法将其逐一插入到链表中。
然后实现了 `display` 函数,用于遍历输出链表中所有结点的 `value` 值。
最后实现了 `reverse` 函数,用于反转链表中的结点。使用三个指针 `prev`、`curr` 和 `next` 进行迭代操作,将当前结点的 `next` 指针指向前一个结点,并将三个指针向后移动一位。
在 `main` 函数中,先调用 `createList` 函数创建一个链表,然后调用 `display` 函数输出原始链表中所有结点的 `value` 值。接着调用 `reverse` 函数反转链表中的结点,并再次调用 `display` 函数输出反转后链表中所有结点的 `value` 值。
阅读全文