我试图在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,然后函数搜索它并将其删除。
答案 0 :(得分:1)
我猜您删除了错误的项目,而不是strcmp(per->CPF , cpf) == 0
中找到的项目,而是下一项:
...
per = per->prox;
...
free(per);
答案 1 :(得分:0)
我认为您对指针aux
和per
感到有些困惑。此外,虽然您将头部作为双指针传递,但您不会反映头部的任何可能更改,因为您只使用该指针来获取指针的初始值。
你不需要指针。只需使用双指针作为迭代器。我在迭代时包含开头的头部地址和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;
}