C编程分段故障链表程序



我对c(和这个网站(还很陌生,我遇到了很多分割错误的问题。我正在编写一个程序,创建一个数字链表,并按升序插入值。

     void insert(struct element **head, struct element *new){   
            if((*head)->next == NULL && (*new).i > (*(*head)->next).i){
                (*head)->next = new;
                return;     
            }
            if((*head)->next == NULL && (*new).i < (*(*head)->next).i){
                new->next = (*head)->next;
                *head = new;    
                return;
            }
            struct element *prev = *head;
            struct element *current = (*head)->next;
            while(current->next != NULL){
                if((*new).i < (*current).i){
                    prev = current;
                    current = current->next;
                } else if((*new).i > (*current).i){
                    new->next = current;
                    prev->next = new;
                }
            }
        }
        int main (void){
            struct element **head;
            int value;
            printf("%s", "TEST" );
            printf("%s" , "Please type in an integer value. ");
            scanf("%d" , &value);
            printf("%s", "TEST" );
            do{
                printf("%s", "TEST" );
                struct element *new;
                if((new = malloc(sizeof(struct element))) == NULL){
                return(NULL);
                }
                printf("%s", "TEST" );
                (*new).i = value;
                printf("%s", "TEST" );
                if(head == NULL){
                    *head = new;
                    printList(*head);
                }  else if(value <= 0){
                    printListBackwards(*head);
                }   
                else {
                    insert(head, new);
                    printList(*head);
                }
                } while(value > 0);

我不需要关于插入或其他操作的逻辑是否正确的帮助。我甚至还没有机会真正测试它,因为在提示后输入整数后,我会立即出现分段错误。我知道这看起来很时髦,但规范要求你使用指向结构(链表的头(的指针。

您确定要头是element**而不是element*吗?这种额外的分离度会给您带来问题,尤其是读取代码非常困难。

以下是我突然想到的主要内容:

if(head == NULL){
    *head = new;
    printList(*head);
}

您确认head是一个NULL指针,然后立即尝试用*取消引用它。如果你真的坚持head是一个双指针,那么你需要在取消引用之前动态分配它

if(head == NULL){
    head = malloc(sizeof(element*));
    *head = new;
    printList(*head);
}

这实际上可能在语法上并不完美(我来自C++(,但你已经明白了。然而,说到C++,在C中将变量命名为"new"通常被认为是不好的做法,因为new是C++中的一个关键字。

struct element **head;

你不想那样。相反,

struct element *head = NULL;

然后,当您调用insert时,使用

insert(&head, new);

您还有许多其他错误和糟糕的用法,但这是您特定问题的开始。

后的第二行出现seg故障

if((*head)->next == NULL && (*new).i > (*(*head)->next).i){
    (*head)->next = new;
    return;     
}

分段错误表示您正在尝试访问不允许访问的内存。例如,您不能取消引用NULL指针。

您的if语句是这样评估的。检查(*head)->next是否为空。

如果不为NULL,则跳过其余部分。

如果它为NULL,则可以将以下每个(*head)->next替换为NULL。这意味着以下部分&& (*new).i > (*(*head)->next.i)可以重写为以下&& (*new).i > ((*NULL).i)。。。

简而言之,您正在尝试取消引用NULL指针值。

也请参考@Parker Kemp的帖子。有很多次,您正确地检查了NULL,但误解了它的含义。

我可以为你重写代码,但我认为你会从学习这样的教程或中受益更多

我强烈建议绘制数据结构图,并为指针绘制箭头。

相关内容

  • 没有找到相关文章