当我执行代码时,它不会打印列表,因此在 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("errorn");
}
elem *p = list;
while(p!=NULL){
printf("%dn",p->key);
p=p->next;
}
}
main(){
struct _elem *list=NULL;
Lcreate(list);
Lread(list);
}
对于初学者来说,函数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>
中声明。