显示链表的元素

Displaying an element of a linked list

提问人:Linas 提问时间:4/12/2023 最后编辑:Vlad from MoscowLinas 更新时间:4/17/2023 访问量:61

问:

我想再问一遍,为什么我没有通过尝试通过链表显示我的元素来显示它。

我正在遵循一个教程,但在我看来,我按照视频中显示的所有操作都完成了,但它仍然不起作用。

因此,我正在尝试通过我的结构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 链接列表 malloc 声明

评论

1赞 edtheprogrammerguy 4/12/2023
您没有将任何数据放入 。你可以这样说,然后你会看到一些输出ankeranker->nummer = 5anker->name="test"
0赞 Some programmer dude 4/12/2023
我建议您创建函数以将节点添加到列表顶部,从列表中打印一个节点,并打印列表中的所有节点。为此,请拿一些纸和铅笔,并记下您需要执行的所有操作。对节点使用带标签的小框,对所有指针和链接使用箭头。在对箭头进行操作时擦除并重新绘制箭头。一旦你把它弄好了,就开始制作代码,按照你在纸上想出的东西。
0赞 Refugnic Eternium 4/12/2023
“视频”很少是一个非常好的老师。试着给自己写一本关于C语言的好书。 此外:你应该收到警告。尊重他们。
0赞 Jabberwocky 4/12/2023
你忘记了#include <string.h>
0赞 ryyker 4/12/2023
该函数不调用任何函数。main

答:

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)

并且,要输出排序后的数组,请在 :feldprintf

    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)