提问人:Linas 提问时间:4/12/2023 最后编辑:Vlad from MoscowLinas 更新时间:4/17/2023 访问量:61
显示链表的元素
Displaying an element of a linked list
问:
我想再问一遍,为什么我没有通过尝试通过链表显示我的元素来显示它。
我正在遵循一个教程,但在我看来,我按照视频中显示的所有操作都完成了,但它仍然不起作用。
因此,我正在尝试通过我的结构student_t显示数组 feld[N] 中的数据。 我知道对于链表,我需要多个节点,但我只想打印出第一个节点,看看它是否有效。
我的代码在妈妈那里看起来像这样:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#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
{
struct student;
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; // Anzahl benutzter Elemente im Feld
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));
anker->nummer;
anker->name;
anker->link = NULL;
printf(" Nummer: %d, Name: %s", anker->nummer, anker->name);
return 0;
}
答:
1赞
ryyker
4/12/2023
#1
"...但我只想打印出第一个,看看它是否有效。
如果要打印出任何内容,成员需要包含一些东西。printf
从内存分配开始,对代码进行以下更改:
...
struct listelem* anker = malloc(sizeof(* anker));//no need to cast return of malloc
if(anker)//check for success before using
{
memset(anker, 0, sizeof(* anker));//initialize allocated memory
//anker = (struct listelem*)malloc(sizeof(struct listelem));
//assign values to members before calling printf
anker->nummer = 10;
strcpy(anker->name, "some name");
//anker->link = NULL;
printf(" Nummer: %d, Name: %s", anker->nummer, anker->name);
...
//free memory when finished using it
free(anker);
}
...
(为什么我建议不要铸造 malloc)
并且,要输出排序后的数组,请在 :feld
printf
sortiere(feld, n);
for(int i=0;i<n;i++)
{
printf(" Nummer: %d, Name: %s\n", feld[i].nummer, feld[i].name);
}
0赞
Vlad from Moscow
4/12/2023
#2
对于初学者来说,这个结构声明
struct listelem
{
struct student;
struct listelem *link;
};
不正确。这条线
struct student;
声明结构的数据成员。
看来你的意思是
struct listelem
{
student_t student;
struct listelem *link;
};
所以至少这些陈述
anker->nummer;
anker->name;
无效。
你可以写例如
anker = malloc(sizeof(struct listelem));
anker->student = feld[0];
anker->link = NULL;
printf(" Nummer: %d, Name: %s\n", anker->student.nummer, anker->student.name)
评论
anker
anker->nummer = 5
anker->name="test"
#include <string.h>
main