我搞不懂我为什么要断层。基本思想是使用链表递归地按顺序插入整数。
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/