链表/C中的分段错误



我想从我的链接列表中删除最后一项,但它变成了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程序。

你的代码中还有一些错误:

  1. 逻辑是不正确的,当只有一个节点存在时,您不会考虑这种情况。你需要添加,

     // 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 
     }
    
  2. 当循环可以改进时,循环中和循环后使用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,而你的目标是只删除一个—最后一个节点。

相关内容

  • 没有找到相关文章

最新更新