我想从我的链接列表中删除最后一项,但它变成了Segmentation错误。所以有些指针是错误的。这是我的密码。
#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循环中调用free,而你的目标是只删除一个—最后一个节点。