如何在链表中插入多条数据?实现姓名与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
相关产品推荐
相关产品推荐

