编程实现对一个单向链表的结点进行反转,也就是将链表结点按逆序排列,排序后链头将成为链尾,而链尾将成为链头。自定义函数名称及函数功能要求如下: (1)定义“createNode”函数,实现创建一个新结点。 (2)定义“createList”函数,实现一个单向链表的创建。 ● 在创建结点时通过键盘输入为每个结点的数据成员value进行赋值。 ● 使用“头插法”将每个结点逐一插入到链表中。 (3)定义“display”的函数,实现对链表所有结点的遍历输出。 (4)定义“reverse”的函数,实现对链表结点的反转 c语言不用for循环
时间: 2023-12-10 15:37:23 浏览: 90
以下是实现要求的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单向链表结点结构体
struct ListNode {
int value; // 数据成员
struct ListNode *next; // 指向下一个结点的指针
};
// 创建新结点
struct ListNode *createNode(int value) {
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->value = value;
node->next = NULL;
return node;
}
// 创建单向链表
struct ListNode *createList(int n) {
struct ListNode *head = NULL;
struct ListNode *node = NULL;
for (int i = 0; i < n; i++) {
int value;
printf("请输入第%d个结点的值:", i+1);
scanf("%d", &value);
node = createNode(value);
node->next = head;
head = node;
}
return head;
}
// 遍历输出链表
void display(struct ListNode *head) {
struct ListNode *p = head;
while (p != NULL) {
printf("%d ", p->value);
p = p->next;
}
printf("\n");
}
// 反转链表
struct ListNode *reverse(struct ListNode *head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
struct ListNode *temp = NULL;
while (curr != NULL) {
temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
return prev;
}
int main() {
int n;
printf("请输入链表的结点数:");
scanf("%d", &n);
struct ListNode *head = createList(n);
printf("原链表:");
display(head);
head = reverse(head);
printf("反转后的链表:");
display(head);
return 0;
}
```
代码中使用了头插法创建链表,可以保证新插入的结点一直在链表头部,最后链表的顺序就是倒序。在反转链表时,使用了三个指针prev、curr、temp,分别指向前一个结点、当前结点和下一个结点。每次循环中,将当前结点的指针指向前一个结点,然后依次向后遍历。最后返回prev指针,即为反转后的链表头。
阅读全文