链表元素无法显示求助:仅输出首个节点失败
链表无法显示元素的问题分析与修复
你的代码存在几个关键问题,导致无法正确显示链表节点内容:
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
相关产品推荐
相关产品推荐

