删除链表中指向的节点

Deleting a node being pointed to in a linked list

此函数接收链表作为参数,必须删除列表中元素 DNI 与给定 get_string 的字符串一致的节点,然后删除 return 列表。目前,如果给定的节点是第一个,则该函数运行良好,但如果给定的节点不是第一个,则它总是删除第一个元素并弄乱列表。我应该怎么做才能解决它?

PPACIENTE p_discharge(PPACIENTE pac){
  char dni[10];
  int u, c=0;
  PPACIENTE pAux;
  PPACIENTE temp;
  pAux=pac;
  fprintf(stdout,"Discharge\n\n");
  if (pac==NULL)
  {
    printf("No patients yet\n");
  }
  else
  {
    get_string("DNI",9,9,dni);
    while(pAux!=NULL){
      if(strcmp(pAux->DNI,dni)==0) {
        u=1;
        break;
      }
      else{
        pAux=pAux->sig;
      }
    }
    if (u==1){
      if (pAux->num==1)
      {
         pac=pAux->sig;
         free(pAux);
         return pac;
      }
      else 
      {
        printf("%d\n", pAux->num);
        c=pAux->num;
        while(pAux->num!=(c-2))
          pAux=pAux->sig;

        temp=pAux->sig;
        pAux->sig=temp->sig;
        free(temp);
      }
    }
    else{
      printf("Unknown patient\n");
    }
  }
  return pAux;
}

我不明白num成员的目的,所以我就忽略它了。

为了删除列表的一个元素,你需要一个指向前一个元素的指针,如果有的话,这样前一个元素的next link(称为sig在你的代码中可以更新。

PPACIENTE p_discharge(PPACIENTE pac){
  char dni[10];
  int u = 0;
  PPACIENTE pAux;
  PPACIENTE temp = NULL;  // Pointer to previous element of list
  pAux=pac;
  fprintf(stdout,"Discharge\n\n");
  if (pac==NULL)
  {
    printf("No patients yet\n");
  }
  else
  {
    get_string("DNI",9,9,dni);
    while(pAux!=NULL){
      if(strcmp(pAux->DNI,dni)==0) {
        u=1;
        break;
      }
      else{
        temp=pAux;
        pAux=pAux->sig;
      }
    }
    if (u==1){
      if (pAux==pac)
      {
         // found patient is first on the list
         // update head of list
         pac=pAux->sig;
      }
      else
      {
         // found patient is not the first on the list
         // update link in previous element
         temp->sig=pAux->sig;
      }
      free(pAux);
    }
    else{
      printf("Unknown patient\n");
    }
  }
  return pac;
}

在您的代码中,您没有正确处理删除列表中间或最后一个元素的情况。尝试这样的事情,使用 prec 元素告诉您是否要删除第一个元素 (prec=NULL) 或不 (prec!=NULL)。

PPACIENT prec = NULL, pAux;
pAux = pac;
if (pac==NULL) {
    printf("No patients yet\n");
}
else {
    get_string("DNI",9,9,dni);
    while (pAux!=NULL) {
        if (strcmp(pAux->DNI, dni)==0) {
            if (prec==NULL) {// deleting first node
                pac = pAux->sig;
                pAux->sig = NULL;
                free(pAux);
                return pac;
            }
            else if (pAux->next==NULL) { // deleting last node
                prec->sig = NULL;
                pAux->sig = NULL;
                free(pAux);
                return pac;
            }
            else {  // deleting a middle node
                prec->sig = pAux->sig;
                pAux->sig = NULL;
                free(pAux);
                return pac;
            }
        }
        pAux = pAux->sig;
    }
}
printf("Unknown patient\n");
return pac;