创建列表时出现问题

时间:2019-08-20 16:51:09

标签: c list struct linked-list singly-linked-list

执行代码时,它不会打印列表,因此在Lread函数中添加IF时,我发现* list在读取时仍然为NULL! 您能告诉我为什么Lcreate函数无法创建列表吗? 非常感谢你!

#include <stdio.h> 
#include <stdlib.h>
#include <malloc.h>

typedef struct _elem {
    int key;
    struct _elem *next;
} elem;

elem* Lcreate(elem *list) {
    int listsize;
    scanf("%d",&listsize);
    elem *p = NULL;
    p = list;
    elem *nuovo = NULL;
    int counter=0;
    while(counter<listsize){
        nuovo = (elem *) malloc(sizeof(elem));
        scanf("%d",&(nuovo->key));
        nuovo->next=NULL;
        if(p==NULL){
            p=nuovo;}
        else{
            while(p->next!=NULL){
                p=p->next;}
            p->next=nuovo;}
        counter++;}
}

elem* Lread(elem *list){
    if (list==NULL){
        printf("error\n");
    }
    elem *p = list;
    while(p!=NULL){        
        printf("%d\n",p->key);
        p=p->next;
    }
}


main(){
    struct _elem *list=NULL;
    Lcreate(list);
    Lread(list);
}

1 个答案:

答案 0 :(得分:1)

对于初学者来说,函数Lcreate不会返回任何内容,尽管其返回类型为elem *

elem* Lcreate(elem *list);

在该函数中,指向列表开头的原始指针未更改。

该函数将添加的元素数返回到列表中更好。

可以通过以下方式定义功能

size_t Lcreate( elem **list ) 
{
    size_t listsize;

    scanf( "%zu", &listsize );

    for ( size_t i = 0; i < listsize; i++ )
    {
        *list = ( elem * )malloc( sizeof( elem ) );

        scanf( "%d", &( *list )->key );
        ( *list )->next = NULL;

        list = &( *list )->next;
    }

    return listsize;
}

并称呼为

elem *list = NULL;
Lcreate( &list );

elem *list = NULL;
size_t n = Lcreate( &list );

或者您可以在功能中添加一个检查,以确认下一个节点已成功分配。例如

size_t Lcreate( elem **list ) 
{
    size_t listsize;

    scanf( "%zu", &listsize );

    size_t i = 0;

    for ( ; i < listsize && ( *list = malloc( sizeof( elem ) ) ) != NULL; i++ )
    {
        scanf( "%d", &( *list )->key );
        ( *list )->next = NULL;

        list = &( *list )->next;
    }

    return i;
}

请注意,标头<malloc.h>不是标准标头。应该将其删除。分配函数在标头<stdlib.h>中声明。