Цель этой программы - добавить узел в конец связанного списка, который можно удалить с помощью идентификатора.
Я могу удалить любой узел без проблем, кроме первого узла.Попытка сделать что-либо после удаления первого узла приводит к непредвиденному поведению, например, к полному очищению связанного списка, если я добавляю больше узлов, бесконечному циклу при попытке отобразить данные внутри связанного списка и / или к получению ошибки «двойное освобождение или повреждение».".
Удаление узла
struct node* delete_node(struct node *list)
{
struct node* p = list;
struct node* prev, *temp;
int id;
printf("\nEnter ID: ");
scanf("%d", &id);
while(p != NULL)
{
if(p->id == id)
{
temp = p;
p = p->next;
prev->next = p;
free(temp);
printf("\nNode Deleted");
return list;
}
prev = p;
p = p->next;
}
printf("\nID not found");
return list;
}
Добавление узла
struct node *add_node(struct node *list)
{
struct node *p;
int id;
printf("\nEnter ID: ");
scanf("%d", &id);
for(p = list; p != NULL; p = p->next)
{
if(p->id == id)
{
printf("\nUser with this ID already exists.");
return list;
}
}
struct node *new_req;
struct node *q = list;
char username[UNAME_LEN], password[UNAME_LEN];
printf("\nEnter username: ");
read_line(username, UNAME_LEN);
printf("\nEnter password: ");
read_line(password, UNAME_LEN);
new_node = malloc(sizeof(struct node));
if(new_node == NULL)
{
printf("\nError allocating memory!");
return list;
}
strcpy(new_node->username, username);
strcpy(new_node->password, password);
new_node->id = id;
if(list == NULL)
{
new_node->next = NULL;
list = new_node;
return list;
}
while(q->next != NULL)
q = q->next;
new_node->next = q->next;
q->next = new_node;
return list;
}
Если я выйду из программы после удаления первого узла, я получу" двойное освобождение или повреждение ", если я добавлю новый узел после удаления первого узла и попытаюсь отобразить данные, это вызовет бесконечный цикл.Если я удалю первый узел и добавлю 2 дополнительных узла, связанный список будет очищен, и я смогу выйти без ошибок.