Я пытаюсь выполнить эти 3 операции: добавить, удалить и выполнить поиск. Но когда я пытаюсь удалить некоторые значения, которые не работают, я хотел бы знать, что я делаю неправильно в этой функции и / или правильно ли я написал другие функции. вот весь кодесли я пытаюсь удалить одно и то же значение дважды: free (): в tcache обнаружено двойное освобождение 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size_table 10
typedef struct Citizen citizen;
typedef struct Citizen{
char name[20];
int age;
citizen *next;
citizen *table[size_table];
} citizen;
int hash_function(int age){
return 10 - 2 - age % (size_table-2);
}
citizen *hash_add(citizen *tab, int age, char *name){
int position = hash_function(age);
citizen *new_citizen = (citizen*)malloc(sizeof(citizen));
new_citizen->next = tab->table[position];
new_citizen->age = age;
strcpy(new_citizen->name,name);
tab->table[position] = new_citizen;
return new_citizen;
}
citizen *hash_search(citizen *tab, int age){
int position = hash_function(age);
citizen *new_search = tab->table[position];
while(new_search != NULL){
if(new_search->age == age) return new_search;
new_search = new_search->next;
}
return NULL;
}
void hash_delete(citizen *tab, int age){
int position = hash_function(age);
citizen *new_delete = hash_search(tab,age);
new_delete = tab->table[position];
free(new_delete);
}
void clean_screen(){ system("clear"); }
void menu(){
"\033[0;32mi -Insert \n"
"\033[0;33mr -Remove \n"
"\033[0;34ms -Search \n"
);
}
int main(){
clean_screen();
menu();
citizen ct;
int age;
char get_name;
char choice;
while(scanf("%c",&choice) != EOF){
switch(choice){
case 'i':
clean_screen();
printf("Insira a idade: ");
scanf("%d",&age);
printf("Insira o nome: ");
scanf("%c ",&get_name);
hash_add(&ct,age,&get_name);
printf("Elemento adicionado ");
clean_screen();
menu();
break;
case 'r':
clean_screen();
printf("Remover a idade: ");
scanf("%d",&age);
hash_delete(&ct, age);
clean_screen();
menu();
break;
case 's':
clean_screen();
printf("Digite a idade: ");
scanf("%d",&age);
citizen *get_search = hash_search(&ct,age);
clean_screen();
if(get_search != NULL) printf("Idade %d encontrada\n", age);
else printf("idade %d não exise\n",age);
menu();
break;
}
}
return 0;
}