C语言链表无法连续打印struct结构体数据,代码应如何修改
你代码中存在以下几处核心问题,修改后即可实现预期效果:
- 结构体初始化错误:你定义的全局
arr是Node类型,第一个成员是Group classmate[3]数组,原有初始化方式没有正确嵌套赋值给数组,修正后的初始化应该为:
Node arr = { .classmate = { {"mike",17}, {"john",19}, {"mary",21} } };
- 链表创建逻辑冗余错误:你的需求只需要存3个学生数据,且已经存在
arr节点的classmate数组里,不需要额外循环malloc3个空节点,原有逻辑中malloc的节点没有赋值任何学生数据,还错误覆盖了head指针,直接把head指向已经初始化好的arr即可。 - 打印逻辑双重错误:
- 遍历循环里你用
node指针移动,但打印用的是固定不变的now指针,永远只会打印头节点数据 - 你只访问了
classmate->name等价于classmate[0].name,没有遍历classmate数组的3个元素
- 遍历循环里你用
修改后的完整代码(基于你原有设计的最小改动)
#include <stdio.h> #include <stdlib.h> typedef struct t_group Group; struct t_group{ char *name; int grade; }; typedef struct t_node Node; struct t_node{ Group classmate[3]; Node *next; }; Node arr = { .classmate = { {"mike",17}, {"john",19}, {"mary",21} } }; Node *head, *now, *previous; int main(void) { // 直接用已经初始化好的arr作为头结点即可 head = &arr; head->next = NULL; //打印逻辑 Node *node = head; if(head == NULL){ printf("List is empty\n"); } else{ while(node!=NULL){ // 遍历当前节点里的classmate数组 for(int i=0; i<3; i++){ printf("%s\t%d\n", node->classmate[i].name, node->classmate[i].grade); } node = node->next; } } return 0; }
如果你要练习多节点链表能力,可以把Node结构体中的classmate改成单个Group对象而非数组,每个节点存1个学生数据,循环初始化3个节点分别赋值即可。
内容的提问来源于stack exchange,提问作者YMont
相关产品推荐
相关产品推荐

