我搞不懂我为什么要断层。基本思想是使用链表递归地按顺序插入整数。

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处出现seg faults,但我不明白为什么。我甚至会记笔记来帮助自己,但我想这没用。有人能告诉我为什么我会犯错吗?谢谢。

最佳答案

temp1 = temp->next;

应该在之前
temp = *head;

如果(*head)->num > integer和如果要在头中插入整数,那么您的代码是复杂和错误的。你可以这样做:
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);
}

我用以下方法测试insert函数:
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中的段故障链接列表递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15481797/

10-11 21:20