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

链表元素无法显示求助:仅输出首个节点失败

链表无法显示元素的问题分析与修复

你的代码存在几个关键问题,导致无法正确显示链表节点内容:

1. 链表节点结构体定义错误

struct listelem里的struct student;是无效写法,这只是不完全类型声明,并未将student结构体的成员嵌入到listelem中。正确写法需声明一个student类型的成员:

struct listelem
{
    student_t data;  // 用typedef后的student_t更简洁
    struct listelem *link;
};

修改后才能通过anker->data.nummer和anker->data.name访问学生数据。

2. 未将数组数据赋值给链表节点

你申请了链表节点内存,但anker->nummer;这类语句没有实际赋值逻辑,完全无效。需要把数组feld里的学生数据复制到节点中:

// 复制学号
anker->data.nummer = feld[0].nummer;
// 复制名字,使用strcpy完成字符串拷贝
strcpy(anker->data.name, feld[0].name);

3. 缺少必要头文件

代码中使用了strcpy函数,但未包含<string.h>头文件,会导致编译错误或未定义行为,需添加:

#include <string.h>

4. 输出语句换行符错误

原代码printf中的换行符是 ,需改为标准的\n才能正确换行。


修正后的完整代码

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>  // 添加strcpy所需头文件

#define MAX_NAME_LEN 50
#define N 20

struct student {
    unsigned int nummer;
    char name[MAX_NAME_LEN];
};

typedef struct student student_t;

int element_vergleich(const void* p1, const void* p2)
{
    student_t* sp1, * sp2;
    sp1 = (student_t*)p1;
    sp2 = (student_t*)p2;

    if (sp1->nummer < sp2->nummer)
        return -1;
    else  if (sp1->nummer > sp2->nummer)
        return 1;
    else
        return 0;
}

void sortiere(student_t* f, int n)
{
    qsort(f, n, sizeof(student_t), element_vergleich);
}

// 修正链表节点结构体定义
struct listelem
{
    student_t data;
    struct listelem *link;
};

int main(void)
{
    student_t feld[N] = { {59112, "Peter Lustig"}, {45181, "Fritz Fuchs"}, {38984, "Bibi Blocksberg"},
                          {87191, "Bernd Brot"}, {58731, "Katie Sommer"}, {75442, "Hein Klug"} };
    int n = 7;   // 已使用的元素数量

    strcpy(feld[6].name, "Linas Dagys");
    feld[6].nummer = 50846;

    printf("Das Feld wurde fuer %d Elemente deklariert. Davon werden %d Elemente benutzt.\n", N, n);


    struct listelem* anker = NULL;

    anker = (struct listelem*)malloc(sizeof(struct listelem));
    // 检查内存分配是否成功(推荐添加)
    if (anker == NULL) {
        printf("Speicherzuweisung fehlgeschlagen!\n");
        return 1;
    }

    // 将数组第一个元素的数据复制到链表节点
    anker->data.nummer = feld[0].nummer;
    strcpy(anker->data.name, feld[0].name);
    anker->link = NULL;
    
    printf(" Nummer: %d, Name: %s\n", anker->data.nummer, anker->data.name);

    // 释放内存,避免内存泄漏
    free(anker);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:52:39