如何从C中的列表中删除值a,按元素搜索?

时间:2014-11-07 14:15:12

标签: c list

我试图在C中删除我的List中的值但是它停止工作,它被调用。这是我删除的功能:

int Excluir_Cadastro_paciente (C_paciente **inicio_cadastro_paciente,char cpf[12])
{
  C_paciente *aux,*per;
  if (*inicio_cadastro_paciente == NULL)
  {
    printf("\nEmpty List\n");
    return 1;
  } else {
    int achou = 0;
    per = *inicio_cadastro_paciente;
    aux = *inicio_cadastro_paciente;
    while(per != NULL) {
      if(strcmp(per->CPF , cpf) == 0 ){ //Achou
        aux = per;
        per = per->prox;
        aux->prox = per->prox;
        free(per);
        achou = 1;
        printf("Removed!");
        break;
        return 0;
      } else {
        per = per->prox;
      }
    }
    if(achou != 1){
      printf("Impossible to remove");
    }
    return 0;
  }
}

我的结构:

struct cadastro_Paciente {
 char CPF[12]; 
 struct cadastro_Paciente *prox; 
};
typedef struct cadastro_Paciente C_paciente;

因此用户键入一个名为cpf的var,然后函数搜索它并将其删除。

2 个答案:

答案 0 :(得分:1)

我猜您删除了错误的项目,而不是strcmp(per->CPF , cpf) == 0中找到的项目,而是下一项:

...

     per = per->prox;

...

     free(per);

答案 1 :(得分:0)

我认为您对指针auxper感到有些困惑。此外,虽然您将头部作为双指针传递,但您不会反映头部的任何可能更改,因为您只使用该指针来获取指针的初始值。

你不需要指针。只需使用双指针作为迭代器。我在迭代时包含开头的头部地址和prox成员的地址。

当您找到要删除的节点时,可以通过该指针更新列表来跳过该节点。

这是您的功能的更新版本。 (我还没有测试过这段代码。我也冒昧地将inicio_cadastro_paciente重命名为pac。更短,加上第一次迭代之后它不再是 INICIO 。)

int Excluir_Cadastro_paciente(C_paciente **pac, const char *cpf)
{
    if (*pac == NULL) {
        printf("Empty List\n");
        return 1;
    }

    while ((*pac) != NULL) {
        if (strcmp((*pac)->CPF, cpf) == 0) {
            C_paciente *del = (*pac);

            *pac = (*pac)->prox;
            free(del);

            printf("Removed!\n");
            return 0;
        }

        pac = &(*pac)->prox;
    }

    printf("Nothing removed!\n");
    return 1;
}