我尝试在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参数在函数中没有用处,等等。


链接列表可能很难学习,因此请慢一点。现在,很难确定您打算每段代码执行什么操作,并且没有太多错误处理。这使得很难“修复”您的代码,但是上面的代码块应该可以使代码运行-从那以后,您需要解决代码中的逻辑问题。

09-10 01:01