执行代码时,它不会打印列表,因此在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);
}
答案 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>
中声明。