我尝试在C中创建一个自排序链表,但是运行create_a_node函数后,系统提示我两次输入数字,然后该程序停止运行,似乎没有结束或出现分段错误,它只是停止了,我不知道为什么,我在做什么错
node* create_a_node(int input){
node *head = NULL;
node *curptr = NULL;
node *newptr = NULL;
node *prvptr;
int NTA;
printf("please enter a number to add: ");
scanf("%i",&NTA);
while(NTA != -1){
newptr = (node*)malloc(sizeof(node)); // create a new node
newptr->data = NTA;
newptr->next = NULL;
if (head == NULL){
head = (node*)malloc(sizeof(node));
head->next = newptr;
}
else{ // if a head exists
curptr = head;
while(curptr->next!= NULL){
prvptr = curptr;
curptr = curptr->next;
if(curptr->data > NTA){
prvptr->next = newptr;
newptr->next = curptr;
}
else{
if(curptr->next == NULL){
curptr->next = newptr;
}
else{
curptr = curptr->next;
}
}
}
}
printf("please enter a number to add: ");
scanf("%i",&NTA);
}
return head;
}
最佳答案
问题出在您的内部while()循环-while(curptr->next!=NULL)
。即,它永不中断!这是一个无限循环。要使代码正常工作,您应该尝试以下操作:
while(curptr->next!= NULL) {
prvptr = curptr;
curptr = curptr->next;
if(curptr->data > NTA) {
prvptr->next = newptr;
newptr->next = curptr;
break;
}
else if(curptr->next == NULL){
curptr->next = newptr;
break;
}
}
一些注意事项:
我添加了两个
break
语句。现在,循环将继续直到curptr->next
为空,但是您将节点插入到第一个if()
语句中。在那之后继续循环将导致两次插入,这可能不是您想要的。您当前正在while()循环的开始执行
curptr = curptr->next;
,然后在嵌套的else
块中再次执行它-这将跳过两个列表项,这又可能不是您想要的。我强烈建议您花一些时间先在纸上写出程序的逻辑。您的
head
指针将永远不会有关联的数据,这在链接列表中并不常见。您不能处理while(curptr->next!=NULL)
循环不插入而存在的情况(这显然是循环的意图),input
参数在函数中没有用处,等等。链接列表可能很难学习,因此请慢一点。现在,很难确定您打算每段代码执行什么操作,并且没有太多错误处理。这使得很难“修复”您的代码,但是上面的代码块应该可以使代码运行-从那以后,您需要解决代码中的逻辑问题。