c - C中的Seg故障链表递归

标签 c recursion linked-list segmentation-fault

我不明白为什么我会出现段错误。基本思想是使用链表递归地插入整数。

node* insert(node** head, int integer)
{
    node* temp = malloc(sizeof(node));
    node* temp1;
    node* newNode;

    if(*head == NULL)
    {
        temp->num = integer;
        temp->next = *head;
        *head = temp;
    }
    else if((*head)->num > integer)
    {
        temp = *head;
        temp1 = temp->next; //breaks the link
        temp->next = newNode;   //creates a new node
        newNode->num = integer;  //adds int
        newNode->next = temp1;   //links new node to previously broken node 
        temp1->next = *head; //next node is NULL 
        *head = temp1;  //Makes next node head again
    }

    else
        insert(&((*head)->next), integer);

    return(temp);
}

我在 GDB 中运行这段代码,它在 temp1->next = *head 处出现错误,但我不明白为什么。我什至记笔记来帮助自己,但我想它不起作用。有人可以告诉我为什么我会出现段错误吗?谢谢。

最佳答案

temp1 = temp->next;

应该早于

temp = *head;

如果 (*head)->num > integer 并且如果您想在 header 中插入整数,那么您的代码很复杂且错误。你可以这样做:

else if((*head)->num > integer)
    {
        temp->next = *head;
        temp->num = integer;
        *head = temp;
    }

temp = malloc(sizeof(node));

应该只调用进去

if(*head == NULL)

进入

else if((*head)->num > integer)

所以你的最终函数可能是这样的

node* insert(node** head, int integer)
{
    node* temp;

    if(*head == NULL)
    {
        temp = malloc(sizeof(node));
        temp->num = integer;
        temp->next = *head;
        *head = temp;
    }
    else if((*head)->num > integer)
    {
        temp = malloc(sizeof(node));
        temp->next = *head;
        temp->num = integer;
        *head = temp;
    }

    else
        temp = insert(&((*head)->next), integer);

    return(temp);
}

我测试插入函数:

int main (void) {


   node *tmp, *head = NULL;
   insert(&head, 5);
   insert(&head, 7);
   insert(&head, 3);
   insert(&head, 6);
   insert(&head, 4);
   insert(&head, 2);

   for (tmp = head; tmp!=NULL; tmp = tmp->next) {
        printf("tmp->num  %d\n",tmp->num);
   }

}

成功了!

$ ./test
tmp->num  2
tmp->num  3
tmp->num  4
tmp->num  5
tmp->num  6
tmp->num  7

关于c - C中的Seg故障链表递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15481797/

相关文章:

c - 不理解这个结构类型定义

c++ - 样式检查:错误:打开括号 '('前需要空格

c - 我不明白这个递归

c - 将 c 应用程序从 Unix 移植到 Linux 时的 Pragmas 行为

Java 递归执行流程

javascript - 如何使函数 add 在 javascript 中工作 - console.log(add(2)(3)(4))//9 而不使用 valueof 或 toString

c++ - 打乱链表

algorithm - QUEUE 的链表实现

java - 努力为链表创建替换方法

C 最低标准要求