C语言求助:用链表打印嵌套结构体值及elemtype存入LNODE并打印
搞定C语言链表嵌套结构体的存储与打印问题
嘿,针对你提出的两个问题——用链表打印嵌套结构体值,以及把已有的elemtype变量存入链表并打印,我整理了一套完整的解决方案,咱们一步步来:
核心需求拆解
你需要完成两件事:
- 把已经初始化好的
n1、n2这两个elemtype变量,存入基于LNODE结构体的链表中 - 实现一个
printlist函数,遍历链表并打印每个节点里嵌套的elemtype数据
完整修改后的代码
直接上能运行的代码,注释里写清了关键细节:
#include <stdio.h> #include <stdlib.h> // 定义存储数据的嵌套结构体 typedef struct elemtype{ int no; char* name; double score; }elemtype; // 定义链表节点结构体,嵌套elemtype typedef struct tagnode{ elemtype data; struct tagnode* next; }LNODE; // 辅助函数:打印单个elemtype数据 void print_single_elem(elemtype data){ printf("%d-%s-%lf ", data.no, data.name, data.score); } // 你需要的printlist函数:遍历链表打印所有嵌套结构体值 void printlist(LNODE* head){ // 先判断链表是否为空(咱们用了头哨兵节点,所以看next是否为NULL) if (head == NULL || head->next == NULL) { printf("链表是空的哦~\n"); return; } // 从第一个有效节点开始遍历 LNODE* current_node = head->next; while (current_node != NULL) { // 打印当前节点的嵌套结构体数据 print_single_elem(current_node->data); current_node = current_node->next; } printf("\n"); } // 原有的创建链表函数(保留,也可以用来批量创建节点) void creat_link(LNODE** head, int n, void (*input)(elemtype*)){ LNODE* new_node; *head = (LNODE*)malloc(sizeof(LNODE)); (*head)->next = NULL; for(;n>0;n--){ new_node = (LNODE*)malloc(sizeof(LNODE)); input(&(new_node->data)); new_node->next = (*head)->next; (*head)->next = new_node; } } // 新增辅助函数:把现成的elemtype变量插入链表 void insert_elem_to_link(LNODE** head, elemtype elem){ LNODE* new_node = (LNODE*)malloc(sizeof(LNODE)); // 直接拷贝整个elemtype结构体到节点的data字段 new_node->data = elem; // 用头插法插入(如果要顺序插入可以改尾插,后面会说) new_node->next = (*head)->next; (*head)->next = new_node; } int main() { // 初始化两个elemtype变量,这里不用堆内存,栈上分配更省心 elemtype n1, n2; n1.name = "nick"; n1.no = 10; n1.score = 90.5; n2.name = "wilson"; n2.no = 20; n2.score = 100.5; // 初始化链表的头哨兵节点 LNODE* head = NULL; creat_link(&head, 0, NULL); // 创建一个空链表(只有头节点) // 把n1、n2插入链表 insert_elem_to_link(&head, n1); insert_elem_to_link(&head, n2); // 调用printlist打印所有数据 printf("链表中的所有数据:"); printlist(head); // 别忘了释放链表内存,避免内存泄漏 LNODE* temp_node; while (head != NULL) { temp_node = head; head = head->next; free(temp_node); } return 0; }
关键细节解释
printlist函数的逻辑- 咱们的链表用了头哨兵节点(不存有效数据的头节点),所以遍历要从
head->next开始,不能直接从头节点遍历 - 遍历过程中,每个节点的
data就是嵌套的elemtype结构体,直接访问它的字段打印就行
- 咱们的链表用了头哨兵节点(不存有效数据的头节点),所以遍历要从
把现成变量存入链表
- 新增的
insert_elem_to_link函数专门干这事:创建新节点,把传入的elemtype结构体直接拷贝到节点的data字段,然后插入链表 - 这里用的是头插法,所以后插入的
n2会排在链表前面,打印顺序是20-wilson-100.500000 10-nick-90.500000。如果想要和插入顺序一致(先n1后n2),可以改成尾插法,代码如下:
用这个函数插入n1再插入n2,打印顺序就和你原代码的输出一致了void insert_elem_to_link_tail(LNODE** head, elemtype elem){ LNODE* new_node = (LNODE*)malloc(sizeof(LNODE)); new_node->data = elem; new_node->next = NULL; // 找到链表的尾节点 LNODE* tail = *head; while (tail->next != NULL) { tail = tail->next; } tail->next = new_node; }
- 新增的
内存优化
- 原代码里
n1、n2用了malloc分配堆内存,其实完全没必要,直接用栈上的结构体变量就行,不用手动free,程序结束后会自动释放
- 原代码里
运行结果
用头插法的话,运行后输出:
链表中的所有数据:20-wilson-100.500000 10-nick-90.500000
用尾插法的话,输出就是你想要的:
链表中的所有数据:10-nick-90.500000 20-wilson-100.500000
内容的提问来源于stack exchange,提问作者nickwilson
相关产品推荐
相关产品推荐

