You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语言逻辑:

  1. 创建新节点
    • 用malloc为单个节点分配内存(注意是1个,不是多个)
    • 检查内存分配是否失败:如果malloc返回NULL,说明内存不足,打印提示后返回
    • 给新节点的DATA赋值为传入的item,LINK设为NULL(标记为当前尾节点)
  2. 判断链表是否为空
    • 如果头指针HEAD是NULL,说明链表无节点,直接让头指针指向新节点
  3. 链表非空时插入到末尾
    • 定义临时指针temp,从头节点开始遍历
    • 循环移动temp,直到temp->LINK为NULL(此时temp指向最后一个节点)
    • 把最后一个节点的LINK指向新节点,完成插入
  4. 结束流程

代码问题修正与完整实现

你的代码存在几个关键错误,以下是修正后的完整可运行代码,附带注释:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:50:23