C语言 从链接列表中删除元素

vwkv1x7d  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(132)

该函数工作不正常,它只删除id_capt并将另一个的值更改为零...

Besides I want to do verification that the sensor does belong to the list but it's not working
void suppression_capt(Liste* liste)//id donner par utilisateur a modifier
{
   float new_longitude,new_latitude;//vals a modifier
   char id_capt_user[10];

   Element *courant = liste->premier;
   Element *precedent =courant;

    printf("donner id_capt= ");
    scanf("%s",id_capt_user);

   while(courant != NULL)
   {
   if(strcmp(courant->capt.id_capt,id_capt_user)==0)
        {
           precedent=courant->suivant;
           free(courant);
        }
         courant=courant->suivant;
   }
   printf("\n");
}

此外,我想验证传感器是否属于列表,但它不工作

/*do
    {
       printf("donner id_capt= ");
       scanf("%s",id_capt_user);                //verification du capteur
       courant=courant->suivant;

    }while(strcmp(courant->capt.id_capt,id_capt_user)!=0);*/

这是我用的结构体

typedef struct//valeur d'une cellule/noeud
{
    char id_capt[10];
    float longitude;
    float latitude;
}capt_hum;

typedef struct//liste chainee
{
    capt_hum capt;
    struct Element* suivant;
    struct Element* precedent;
}Element;
vptzau2j

vptzau2j1#

您应该注意,您正在访问一个已经释放的指针

if(strcmp(courant->capt.id_capt,id_capt_user)==0)
        {
           precedent=courant->suivant;
           free(courant);
        }
         courant=courant->suivant;

至于从链表中删除一个元素,释放它是不够的,因为你还需要更新元素的邻居。假设你有一个链表,如下所示:A <->B <->C如果您希望删除B,则还需要更新A和C以使其相互指向A <->C

if(strcmp(courant->capt.id_capt,id_capt_user)==0)
        {
           temp = courant->suivant;
           precedent=courant->precedent;
           free(courant);
           precedent->suivant = temp;
           temp->precedent = precedent;
           courant = precedent; //perhaps replace with break
        }
         courant=courant->suivant;

通过这个实现,你可以迭代整个列表,并删除包含你输入的字符串的任何节点。如果你想在找到要删除的节点后停止查找,你可以用“break”替换注解行。你应该添加一些检查,检查要删除的节点是第一个还是最后一个,这样你就不会在指针为NULL或垃圾时意外地试图分配它们。

js81xvg6

js81xvg62#

在看过并尝试过之后,因为我对双向链表还是个新手,所以这个程序工作了

void supprimer_capt(Liste **list) {
Element* tmp = *list;
Element* prev = NULL;
char id_capt_user[10];
printf("donner id_capt= ");
scanf("%s",id_capt_user);
while (tmp != NULL) 
{
   if (strcmp(tmp->capt.id_capt,id_capt_user)==0) 
   {
      if (prev == NULL) 
      {
         tmp = tmp->suivant;
         free(*list);
         *list = tmp;
      } else {
       prev->suivant = tmp->suivant;
            free(tmp);
            tmp = prev->suivant;
        }
    } else {
        prev = tmp;
        tmp = tmp->suivant;
    }
}

}
我知道我必须有两个指针prev和next和thanx到这个函数我有更好的理解和链接发送的Roberet先生

相关问题