我不明白为什么我会出现段错误。基本思想是使用链表递归地插入整数。
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/