我对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,但误解了它的含义。
我可以为你重写代码,但我认为你会从学习这样的教程或中受益更多
我强烈建议绘制数据结构图,并为指针绘制箭头。