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

C语言链表无法连续打印struct结构体数据,代码应如何修改

你代码中存在以下几处核心问题,修改后即可实现预期效果:

  • 结构体初始化错误:你定义的全局arr是Node类型,第一个成员是Group classmate[3]数组,原有初始化方式没有正确嵌套赋值给数组,修正后的初始化应该为:
Node arr = {
    .classmate = {
        {"mike",17},
        {"john",19},
        {"mary",21}
    }
};
  • 链表创建逻辑冗余错误:你的需求只需要存3个学生数据,且已经存在arr节点的classmate数组里,不需要额外循环malloc3个空节点,原有逻辑中malloc的节点没有赋值任何学生数据,还错误覆盖了head指针,直接把head指向已经初始化好的arr即可。
  • 打印逻辑双重错误:
    1. 遍历循环里你用node指针移动,但打印用的是固定不变的now指针,永远只会打印头节点数据
    2. 你只访问了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:18:01