C语言单链表创建算法实现求助:箭头映射含义及代码问题
C语言单链表创建算法解析与代码修正
关于算法中→符号的说明
算法里的→是伪代码写法,对应C语言里的结构体指针成员访问运算符->。当你持有指向结构体的指针(比如node_t *new_node),要访问它的成员(如DATA或LINK),必须用->;如果是直接的结构体变量(比如node_t temp),则用.访问。示例:
- 伪代码
NEW→DATA = ITEM→ C代码new_node->DATA = item; - 伪代码
Temp→LINK ≠ NULL→ C代码temp->LINK != NULL
原算法逻辑拆解(对应C语言实现)
原算法是尾插法构建单链表,每调用一次就往链表末尾添加一个节点,步骤对应C语言逻辑:
- 创建新节点
- 用
malloc为单个节点分配内存(注意是1个,不是多个) - 检查内存分配是否失败:如果
malloc返回NULL,说明内存不足,打印提示后返回 - 给新节点的
DATA赋值为传入的item,LINK设为NULL(标记为当前尾节点)
- 用
- 判断链表是否为空
- 如果头指针
HEAD是NULL,说明链表无节点,直接让头指针指向新节点
- 如果头指针
- 链表非空时插入到末尾
- 定义临时指针
temp,从头节点开始遍历 - 循环移动
temp,直到temp->LINK为NULL(此时temp指向最后一个节点) - 把最后一个节点的
LINK指向新节点,完成插入
- 定义临时指针
- 结束流程
代码问题修正与完整实现
你的代码存在几个关键错误,以下是修正后的完整可运行代码,附带注释:
#include <stdlib.h> #include <stdio.h> // 定义链表节点结构体 typedef struct node { int DATA; struct node *LINK; } node_t; // 注意:要修改外部头指针,必须传指针的指针(**head),否则内部修改无法同步到外部 void create(node_t **head, int item) { // 1. 创建新节点 node_t *new_node = malloc(sizeof(node_t)); // 仅分配1个节点内存,C中无需强制转换 if (new_node == NULL) { printf("Memory not available\n"); return; } new_node->DATA = item; new_node->LINK = NULL; // 2. 处理空链表情况 if (*head == NULL) { *head = new_node; // 空链表直接让头指针指向新节点 return; } // 3. 遍历到尾节点并插入新节点 node_t *temp = *head; while (temp->LINK != NULL) { temp = temp->LINK; // 移动到下一个节点,直到找到尾节点 } temp->LINK = new_node; // 将新节点挂到尾节点后 } // 测试用:打印链表所有节点 void print_list(node_t *head) { node_t *temp = head; while (temp != NULL) { printf("%d ", temp->DATA); temp = temp->LINK; } printf("\n"); } int main() { node_t *head = NULL; // 初始化头指针为空 // 添加测试节点 create(&head, 10); create(&head, 20); create(&head, 30); // 打印链表验证结果 printf("链表内容:"); print_list(head); return 0; }
核心修正点说明
- 参数修正:原函数参数
int head完全错误,头指针是node_t *类型,且要修改外部头指针必须传node_t **head(指针的指针),否则内部修改无法影响外部变量 - malloc修正:原代码分配了5个节点内存,实际仅需1个;C标准中
malloc返回的void*可直接赋值给结构体指针,无需强制转换 - 返回值修正:原函数返回
node_t *却返回-1,类型不匹配,这里改为void类型,直接通过指针的指针修改外部头指针 - 拼写修正:
prtinf改为printf - 逻辑补全:添加了空链表、非空链表的插入逻辑,以及测试用的打印函数
运行结果
编译运行后,输出为:
链表内容:10 20 30
内容的提问来源于stack exchange,提问作者Dollar X
相关产品推荐
相关产品推荐

