该程序的目的是在链表的末尾添加一个可通过ID删除的节点。
除了第一个节点外,我能够删除所有节点而没有任何问题。删除第一个节点后尝试执行任何操作会导致意外行为,例如,如果我添加更多节点,则将链接列表完全清除,在尝试显示链接列表中的数据时出现无限循环,或者出现错误“双重释放或损坏” “。
删除节点
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;
}
如果删除第一个节点后退出程序,我将得到“双重释放或损坏”,如果删除第一个节点后添加新节点并尝试显示数据,则会导致无限循环。如果我删除第一个节点,并添加两个其他节点,则链接列表将被清除,并且我可以退出而不会出现错误。
答案 0 :(得分:2)
当您删除列表中的第一个节点时,您的删除代码无法正常工作。解决该问题的方法可能是:
v-img
并且不再需要 if(p->id == id)
{
if(p == list)
list = list->next;
else
prev->next = p->next;
free(p);
printf("\nNode Deleted");
return list;
}
变量。