我真的很绝望,我不知道为什么这段代码会出现分段错误。这应该将一个元素放在链接的末尾**n从不为空,但*n可能是
int insertaFinal(Nodo **n, int dato){
if (!*n){
insertaInicio(n,dato);
return 1;
}
Nodo* temp = *n;
while (temp->sig)
temp = temp->sig;
temp -> sig = (Nodo*) malloc(sizeof(Nodo));
temp = temp->sig;
temp->dato = dato;
return 1;
}
这并没有什么"奇怪"的。此处:
while (temp->sig)
temp = temp->sig;
您似乎想要循环,直到temp->sig
变成NULL
,但当您创建新节点时,您从未将该成员设置为NULL
,因此很明显,您的循环将进入未分配的内存。你需要做的是:
temp->sig = malloc(sizeof *temp->sig);
if ( !temp->sig ) {
perror("Couldn't allocate memory for node");
exit(EXIT_FAILURE);
}
temp = temp->sig;
temp->dato = dato;
temp->sig = NULL; // <---- Add this line
如果在insertaInicio()
中也没有将sig
设置为NULL
,那么您应该编写一个构造函数来避免重复,并在这两个地方都使用它,甚至更好。