C语言链表反转scanf输入+注释(完整代码)
时间: 2024-10-24 08:14:37 浏览: 12
当然可以。在C语言中,链表反转是一个常见的算法练习。下面是一个简单的链表反转函数,它使用`scanf`输入节点值,并添加了必要的注释以帮助理解:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = value;
newNode->next = NULL;
}
return newNode;
}
// 链表反转函数
Node* reverseList(Node* head) {
Node* prev = NULL; // 初始化前驱指针为NULL
Node* current = head; // 初始化当前指针为头结点
while (current != NULL) { // 当链表非空时循环
Node* nextTemp = current->next; // 临时保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向prev
prev = current; // 更新前驱指针为当前节点
current = nextTemp; // 移动当前指针到下一个节点
}
return prev; // 返回新的头结点,原头结点现在是最后一个节点
}
// 主函数,用于接收用户输入并测试链表反转
int main() {
Node* head = NULL;
printf("请输入链表元素(输入0表示结束):\n");
int value;
while (scanf("%d", &value) == 1 && value != 0) { // 输入节点值直到遇到0
head = createNode(value);
head->next = head; // 初始化新节点为头结点(如果这是第一个节点)
// 如果链表已存在,将新节点连接到最后
if (head->next != NULL) {
head->next->next = head;
}
}
head = reverseList(head); // 反转链表
if (head != NULL) {
printf("反转后的链表: ");
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
} else {
printf("链表为空。\n");
}
return 0;
}
```
阅读全文