我试图使用链接列表计数到20。我编写了代码,有2个函数。将节点添加到链接列表的功能和打印整个节点的功能。然而,它处于无限循环中,我不知道为什么。
我尝试过多次调试,我相信它的添加功能,可能是printlist,而永远不会变为null,因此无休止地打印?我认为add函数没有正确实现节点,但我不确定如何修复。
这是我的结构:
struct node
{
int number;
struct node *next;
};
typedef struct node NODE;
这是主要的,它会调用函数add并将其传递给i(0-20)以及列表。
int main(){
int i, size=20;
struct node* mylist = malloc(sizeof(struct node));
mylist->number = NULL;
mylist->next = NULL;
for(i=0;i<size;i++){
mylist = add(mylist,i);
}
printList(mylist);
return 0;
}
添加函数,它将temp作为传递的数据,然后迭代遍历链表到最后。当我在while循环中删除(&amp;&amp; iter-&gt; next-&gt; number&lt; number)时,它只打印出来,但它有无限循环
struct node* add(struct node *first, int number){
struct node* temp;
struct node* iter;
temp= malloc(sizeof(struct node));
temp->number=number;
temp->next=NULL;
if(first==NULL)
return temp;
iter=first;
while(iter->next!=NULL && iter->next->number < number){
iter=iter->next;}
temp->next=iter->next;
iter->next=temp;
return first;
}
这是printlist函数,我认为是正确的,我认为问题在于添加节点函数。
struct node* printList(struct node *mylist){
struct node *helpptr;
helpptr = mylist;
while (helpptr != NULL){
printf("%d", helpptr->number);
helpptr = helpptr->next;
}
return 0;
}
提前感谢您的帮助
答案 0 :(得分:1)
您通过使用通过malloc()
分配但未初始化的缓冲区中的值来调用未定义的行为。
您应该使用mylist
初始化main()
中的NULL
,而不是malloc()
返回的内容。
答案 1 :(得分:0)
你的结构定义很好,尽管你可以省略typedef,因为你以后不再使用它。
struct node
{
int number;
struct node *next;
};
// typedef struct node NODE;
你在程序的主要部分犯了两个错误。首先 - 正如@MikeCAT已经提到的 - 您必须更改使用malloc创建的结构以避免未定义的行为。你可以通过简单地将myList设置为NULL来实现这一点,因为你的add函数会照顾它。当您添加项目0-20时,您必须将for循环的条件调整为i<=size
。
int main(void){
int i, size=20;
struct node* mylist = NULL;
for(i=0;i=<size;i++){
mylist = add(mylist,i);
}
printList(mylist);
return 0;
}
您的添加功能没问题,此处无需更改。
printList功能也很好。您可能希望将返回类型更改为void,因为此函数到目前为止未返回任何有意义的信息。实际上,您不需要创建新的指针变量helpptr,因为C中的参数是按值调用的。因此,更改myList参数不会更改main函数中的值。
void printList(struct node *mylist){
while (mylist != NULL){
printf("%d, ", mylist->number);
mylist = mylist->next;
}
}