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

如何从C中的列表中删除值a,按元素搜索?,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 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,然后函数搜索并删除它。

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


我认为您对指针
aux
per
感到有点困惑。此外,尽管您将head作为双指针传递,但不会对head反映任何可能的更改,因为您只使用该指针来获取指向指针的初始值

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

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

这是函数的更新版本。(我还没有测试过这段代码。我还冒昧地将
inicio\u cadastro\u paciente
重命名为
pac
。更简短的是,在第一次迭代后,它不再是inicio。)


你能把你的代码格式化吗?是的。现在好点了吗?虽然我很感激,但不是真的。。。
     per = per->prox;
     free(per);
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;
}