试图从c中删除双链表中的元素

时间:2013-04-07 23:01:20

标签: c linked-list double

Ι尝试从c。

中的双链表中删除元素时出现问题
Nodes_t *remove_Nodes (Nodes_t *a, Nodes_t b){
    Nodes_t *head;
    head=a;
    if ((a->i_pos==b.i_pos) && (a->j_pos==b.j_pos)){
        if (a->next=NULL){
            return NULL;
            }
        else {
            head=a->next;
            head->previous=NULL;
            return head;
            }
        }
    else if ((a->i_pos!=b.i_pos) || (a->j_pos!=b.j_pos)){
        while ((a->next->i_pos!=b.i_pos)||(a->next->j_pos!=b.j_pos)){
            a=a->next;
            if (a->next=NULL){
                return head;
                }
            }
        a=a->next;
        a->previous->next=a->next;
        if (a->next=NULL){
            return head;
            }
        else if (a->next!=NULL){
            a->next->previous=a->previous;
            return head;
            }               
        }
        return head;        
    }

它获得一个双链表,找到一个Nodes_t类型的元素,然后删除它。 虽然,因为我检查了列表及其指针工作正常,当我尝试调用函数删除我的第一个元素时,我得到一个seg错误。

更具体地说,正如我已经检查过的那样,该功能一直很好,直到达到这一点

else {
            head=a->next;
            head->previous=NULL;// HERE 
            return head;
            }

我使用的结构是这个

typedef struct Nodes {
char    position;
int     i_pos, j_pos;
int     g_distance;
int     h_distance;
int     F_estim;
struct Nodes    *parent;
struct Nodes    *next;
struct Nodes    *previous;

}Nodes_t;

1 个答案:

答案 0 :(得分:3)

您在此处使用了作业=而不是比较==

if (a->next=NULL){

哪个会评估为NULL,这是错误的,所以会转到你的else条款

head=a->next;
head->previous=NULL;

因此head变为NULL,然后您尝试取消引用NULL指针以获取其previous成员。

  • 快速解决方法:将缺少的=添加到我引用的第一行。
  • 更好的解决方法:重构您的代码。它太长了,有不必要的位。并且不要忘记检查你的平等操作。