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

如何在链表中插入多条数据?实现姓名与ID的链表存储及遍历输出

嘿,我来帮你搞定链表插入多条数据的问题,还会把你给出的代码片段补全修正,写出能直接运行的完整程序~

链表插入多条数据的核心思路

要实现多条数据插入链表,最常用的是尾插法——每次把新节点挂到链表的最后面,这样输入的顺序和链表存储的顺序一致,也方便后续遍历输出。具体步骤如下:

  • 先定义好存储数据的结构体和链表节点结构体
  • 初始化链表的头指针(一开始是空的)
  • 循环接收用户输入的姓名和ID,直到用户输入结束
  • 为每组数据创建新的链表节点,分配内存并赋值
  • 把新节点链接到链表的尾部
  • 遍历整个链表,逐个输出所有数据
  • 最后记得释放链表的内存,避免内存泄漏
完整修正后的代码

先把你给的代码里的错误(比如拼写错误TNodo、未完成的赋值)修正,再补充完整的插入、遍历、内存释放逻辑:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 存储姓名和ID的结构体
struct Test {
    char name[16];
    int id;
};

// 链表节点结构体
typedef struct Node {
    struct Test structure;
    struct Node *next;
} TNode;

// 简化节点指针类型名
typedef TNode* Node;

// 创建新节点,返回节点指针
Node createNode(struct Test data) {
    Node newNode = (Node)malloc(sizeof(TNode));
    if (newNode == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
    // 复制数据到节点
    strcpy(newNode->structure.name, data.name);
    newNode->structure.id = data.id;
    newNode->next = NULL;
    return newNode;
}

// 尾插法插入节点到链表
void insertTail(Node *head, struct Test data) {
    Node newNode = createNode(data);
    // 如果链表为空,新节点就是头节点
    if (*head == NULL) {
        *head = newNode;
        return;
    }
    // 找到链表的最后一个节点
    Node current = *head;
    while (current->next != NULL) {
        current = current->next;
    }
    // 把新节点挂到尾部
    current->next = newNode;
}

// 遍历链表并输出所有数据
void printList(Node head) {
    if (head == NULL) {
        printf("链表为空!\n");
        return;
    }
    Node current = head;
    printf("所有存储的数据:\n");
    while (current != NULL) {
        printf("姓名:%s,ID:%d\n", current->structure.name, current->structure.id);
        current = current->next;
    }
}

// 释放链表所有节点的内存
void freeList(Node head) {
    Node temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }
}

int main() {
    Node head = NULL; // 初始化头指针为空
    struct Test inputData;
    
    printf("请输入姓名和ID(输入姓名为q时退出):\n");
    while (1) {
        printf("姓名:");
        scanf("%s", inputData.name);
        // 输入q退出循环
        if (strcmp(inputData.name, "q") == 0) {
            break;
        }
        printf("ID:");
        scanf("%d", &inputData.id);
        // 插入到链表
        insertTail(&head, inputData);
    }
    
    // 输出所有数据
    printList(head);
    // 释放内存
    freeList(head);
    
    return 0;
}
代码关键点说明
  • 结构体定义:struct Test专门用来存储姓名和ID,TNode作为链表节点,包含Test数据和下一个节点的指针,用typedef简化类型名让代码更简洁
  • 内存分配:createNode函数负责给新节点分配内存,还要判断分配是否成功,避免程序崩溃
  • 尾插逻辑:insertTail函数会先判断链表是否为空,为空就把新节点设为头节点;不为空就遍历到最后一个节点,把新节点挂上去
  • 遍历输出:printList函数从头节点开始,逐个遍历每个节点,输出里面的姓名和ID
  • 内存释放:freeList函数遍历整个链表,逐个释放每个节点的内存,避免内存泄漏

你可以把这段代码编译运行,输入多组姓名和ID,输入姓名为q时停止输入,程序就会输出所有存储的数据啦~

内容的提问来源于stack exchange,提问作者St3ve R0nix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:19