C语言链表问题:我的程序没法把等于给定基本工资的所有节点全部删除,只能删除一个,该怎么修改?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct emp_node{
char name[20];
int salary;
struct emp_node *next;
};
int size = sizeof(struct emp_node);
void main()
{
struct emp_node *list, *p1 = NULL, *p2 = NULL, *p = NULL;
char name[20];
int salary, basicsalary, n=0;
struct emp_node * del_list(struct emp_node *list,int basicsalary);
list = NULL;
printf("请输入职工姓名和基本工资: \n");
scanf("%s%d", name, &salary);
printf("请输入一个给定基本工资: \n");
scanf("%d",&basicsalary);
while(salary != 0){
n++;
p1=(struct emp_node *)malloc(size);
strcpy(p1->name,name); p1->salary = salary; p1->next = NULL;
if(n==1) list = p1; else p2->next = p1;
p2 = p1;
printf("请输入职工姓名和基本工资: \n");
scanf("%s%d",name, &salary);
}
p = del_list(list, basicsalary);
printf("输出删除链表中等于给定基本工资的所有节点后的链表信息\n");
while(p != NULL){
printf("%-5s %-5d\n",p->name, p->salary);
p = p->next;
}
}
struct emp_node * del_list(struct emp_node *list,int basicsalary)
{
struct emp_node *p1 = list,*p2 = list;
while((p1->salary != basicsalary) && (p1->next != NULL)){
p2 = p1; p1 = p1->next;

}

if(p1->salary == basicsalary){
if(list == p1) list = p1->next;
else p2->next = p1->next;
free(p1);
}
return list;
}

问题主要是因为 del_list 函数的while语句,只要遇到 p1->salary == basicsalary 的情况就会退出while循环,那么如果后面的节点还有 p1->salary == basicsalary 的情况也就无法检测到了,而且你的这个函数不管怎么说 free() 函数最多只执行一遍,那么最多只能删除掉一个节点。free() 函数当然得放在 while 循环里面啊!修改了一下你的代码,看代码吧!!!

追问

谢谢大佬

温馨提示:答案为网友推荐,仅供参考
相似回答