显示链表的元素

问题描述 投票:0回答:2

我想再问一些关于为什么我没有通过尝试通过链接列表来显示我的元素。

我正在学习一个教程来解决这个问题,但尽管在我看来我已经按照视频中所示完成了所有操作,但它仍然不起作用。

所以我试图通过我的结构 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;
}
c struct linked-list malloc declaration
2个回答
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


0
投票

对于初学者这个结构声明

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)
© www.soinside.com 2019 - 2024. All rights reserved.