vs2015C语言删除链表中指定工资的所有结点

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
	char name[20];
	int salary;
	struct empNode *next;
}empNode;
int size = sizeof(empNode);
empNode *delList(empNode *list);
void main()
{	
	empNode *list, *p = NULL, *q = NULL;
	char name[20];
	int num = 0, add = 0, salary, n = 0;
	list = NULL;
	printf("请输入姓名和工资(工资输入0,结束输入):\n");
	scanf("%s%d", name, &salary);
	while (salary != 0)
	{
		n++;
		p = (struct empNode*)malloc(size);
		strcpy(p->name, name);
		p->salary = salary;
		p->next = NULL;
		if (n == 1)list = p;
		else q->next = p;
		q = p;
		scanf("%s%d", name, &salary);
	}
	
	list=delList(list);
	p = list;
	printf("删除后的链表信息为:\n");
	while (p != NULL)
	{
		printf("%s %d\n", p->name, p->salary);
		p = p->next;
	}
}
empNode *delList(empNode *list)
{
	int delsalary;
	printf("请输入要删除的工资:");
	scanf("%d", &delsalary);
	empNode *p = list, *del = NULL;
	while (p != NULL)
	{
		if (list->salary == delsalary)
		{
			list = list->next;
			p = list;
		}
		else if (p->next == delsalary)
		{
			del = p->next;
			p->next = del->next;
			free(del);
		}
		p = p->next;
	}
	return list;
}

为什么结果还是原来的链表?

 

把要删除节点的前一个节点的next 设置为要删除节点的next 节点,循环处理就可以了。

删除的时候不能使用list =list. next, 你这样等于没有头节点,肯定出问题,要把list赋值给一个临时变量,再这样处理。

头节点的地址是不能变的

请问我的代码有什么问题?

 

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^