Ι当试图从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;
}
我使用的结构体是this
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;
您在这里使用了赋值=
而不是比较==
:
if (a->next=NULL){
将计算为NULL
,这是假的,因此将转到else
子句,在那里您执行
head=a->next;
head->previous=NULL;
所以head
变成了NULL
,然后你试图解引用一个NULL
指针来获得它的previous
成员。
- 快速修复:将缺失的
=
添加到我引用的第一行。更好的解决方法:重构你的代码。它太长而且有不必要的位。别忘了检查你的equals操作。