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

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;
}

关键细节解释

  1. printlist函数的逻辑

    • 咱们的链表用了头哨兵节点(不存有效数据的头节点),所以遍历要从head->next开始,不能直接从头节点遍历
    • 遍历过程中,每个节点的data就是嵌套的elemtype结构体,直接访问它的字段打印就行
  2. 把现成变量存入链表

    • 新增的insert_elem_to_link函数专门干这事:创建新节点,把传入的elemtype结构体直接拷贝到节点的data字段,然后插入链表
    • 这里用的是头插法,所以后插入的n2会排在链表前面,打印顺序是20-wilson-100.500000 10-nick-90.500000。如果想要和插入顺序一致(先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,打印顺序就和你原代码的输出一致了
  3. 内存优化

    • 原代码里n1、n2用了malloc分配堆内存,其实完全没必要,直接用栈上的结构体变量就行,不用手动free,程序结束后会自动释放

运行结果

用头插法的话,运行后输出:

链表中的所有数据:20-wilson-100.500000 10-nick-90.500000 

用尾插法的话,输出就是你想要的:

链表中的所有数据:10-nick-90.500000 20-wilson-100.500000 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:47:50