[英]Segmentation fault in Linked list /C
我想从我的链表中删除最后一项,但是变成了分段错误。 所以一些指针是错误的。 这是我的代码。
#include <stdio.h>
#include <stdlib.h>
struct listenElement{
int wert;
struct listenElement *next;
};
static struct listenElement* anfang = NULL;
int removeElement(void) {
if (anfang == NULL){
return -1;
}
else{
int l = NULL;
struct listenElement *p = anfang->next ;
if (p->next == NULL){
l = p->wert;
free(p);
anfang->next = NULL;
}
else
{
while(p->next != NULL){
anfang = p;
p = p->next;
l = p->wert;
free(p);
}
anfang =p;
anfang->next= NULL;
}
return l;
}
}
注意一旦你在某个指针上调用free就无法访问该指针(内存也通过其他指针),这样做会调用未定义的行为 - 这是一个非法的内存指令,可以在运行时检测到可能导致 - 分段错误好:
以下代码错误:
while(p->next!=NULL){// <--+ you use `p` - that is invalid
anfang = p; // |
p = p->next; // |
l = p->wert; // |
free(p);//-------------+ you free `p`
}
另外学习缩进C程序 。
你的代码中还有一些错误:
逻辑不正确,当只有一个节点存在时,您不会考虑这种情况。 你需要添加,
// this first pice of code to add // Case-1: when nodes in linked list are = 1 if (anfang->next == NULL){ free(anfang); anfang = NULL; reset to NULL return 1; // as you returns }
你可以改进循环,并且在循环和循环之后使用anfang
是错误的。 anfang
应该总是指向第一个节点,你只需要删除最后一个节点。 如果链表中有多个节点,那么anfang
值不会改变(读取注释):
// this code should be after above code // Case-2: when nodes in linked list are > 1 p = anfang; // last = anfang->next; // last node // a loop for travel to reach - last node in linked list while(last->next != NULL){//stop when last - points to last node p = last; // every time before update last make `p` the `last` last = last->next; } p->next = NULL; // make `p` as last node, to remove last node free(last); // free memory for last node
从逻辑上讲,你错了,在你的代码中你可以在while循环中自由调用,而你的目标是只删除一个 - 最后一个节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.