数据结构:职工信息的综合运算

目的:深入掌握单链表应用的算法设计。

内容:设有一个职工文件emp.dat,每个职工记录包含职工编号(no),姓名(name),部门号(depno),和工资数(salary)信息。这几一个程序完成以下功能

(1)从emp.dat文件中读取出职工记录,并建立一个带头结点链表。(这点不作要求,从键盘录入即可)

(2)输入一个职工记录。

(3)显示所有职工记录。

(4)按编号no对所有职工记录进行递增排序。

(5)按编号depno对所有职工记录进行递增排序。

(6)按编号salary对所有职工记录进行递增排序。

(7)删除指定职工号的职工记录。

(8)删除职工文件中的全部记录。

(9)将单链表L中所有职工记录保存到emp.dat。(这点也不作要求)




#include<stdio.h>
#include<stdlib.h>

typedef struct w      //节点结构体
{
	int no;
	char name[100];
	int depno;
	int salary;
	struct w* next;
} worker;

void input(worker*&L)     //选项1的功能,也是题目(2)小题
{                         //输入一个职工记录
	worker*p;             //∵不用排序也没有尾节点∴考虑方便的头插法
	p=(worker*)malloc(sizeof(worker));
	printf("请按顺序分别输入职工编号,姓名,部门,工资(两信息间用空格分离)\n");
	scanf("%d %s %d %d",&p->no,&p->name,&p->depno,&p->salary);
	p->next=L->next;
	L->next=p;
}

void show(worker*L)       //选项2的功能,也是题目(3)小题
{                         //显示所有职工记录
	worker*p=L->next;
	printf("工号  姓名  部门  工资\n");
	for(p=L->next;p!=NULL;p=p->next)
		printf("%d     %s    %d  %d\n",p->no,p->name,p->depno,p->salary);
}

void num_sort(worker*&L)  //选项3的功能,也是题目(4)小题
{                         //按工号升序排序,插入排序
	worker*p,*q,*s;       //p指向已排序列待插入位置的前驱节点,q指向未排序列第一个节点(既指向待插入节点)
	if(L->next==NULL)     //由于所有函数均不判断L空,所有这里也默认L不空(整个程序不会出现空值传进来的情况)
	{
		printf("链表为空\n");
		return;
	}
	q=L->next->next;
	L->next->next=NULL;   //断开已排序列与未排序列,以保证排序完毕后最后节点->next为空
	while(q!=NULL)
	{
		p=L;
		while(p->next!=NULL && q->no >= p->next->no) //如果待插入位置节点no值≥待插入节点,则待插位置后移
			p=p->next;
		s=q->next;         //已找到正确插入位置,将p节点插入到pre节点的后面
		q->next=p->next;
		p->next=q;
		q=s;
	}
	printf("已排序完毕\n");
}

void dep_sort(worker*&L)  //选项4的功能,也是题目(5)小题
{                         //按部门升序排序
	worker*p,*q,*s;       //算法与num_sort一致,不再叙述
	if(L->next==NULL)
	{
		printf("链表为空\n");
		return;
	}
	q=L->next->next;
	L->next->next=NULL;
	while(q!=NULL)
	{
		p=L;
		while(p->next!=NULL && q->depno >= p->next->depno)
			p=p->next;
		s=q->next;
		q->next=p->next;
		p->next=q;
		q=s;
	}
	printf("已排序完毕\n");
}

void sal_sort(worker*&L)  //选项5的功能,也是题目(6)小题
{                         //按工资升序排序
	worker*p,*q,*s;       //算法与num_sort一致,不再叙述
	if(L->next==NULL)
	{
		printf("链表为空\n");
		return;
	}
	q=L->next->next;
	L->next->next=NULL;
	while(q!=NULL)
	{
		p=L;
		while(p->next!=NULL && q->salary >= p->next->salary)
			p=p->next;
		s=q->next;
		q->next=p->next;
		p->next=q;
		q=s;
	}
	printf("已排序完毕\n");
}

void Delete(worker*&L)    //选项6的功能,也是题目(7)小题
{                         //按工号删除一个职工记录
	worker*p,*dele;       //算法与num_sort一致,不再叙述
	int a;
	printf("请输入要删除职工记录的工号:");
	scanf("%d",&a);
	for(p=L;p->next!=NULL;p=p->next)  //p指向被删节点的前驱节点
		if(p->next->no == a)  //执行删除操作
		{
			dele=p->next;
			p->next=dele->next;
			free(dele);
			printf("已删除工号为%d的职工记录\n",a);
			return;
		}
	printf("未找到工号为%d的职工记录\n",a);
}

void destroy(worker*&L)   //选项7的功能,也是题目(8)小题
{                         //删除全部职工记录,这里不删除头结点
	worker*p=L->next,*q;
	while(p!=NULL)
	{
		q=p;
		p=p->next;
		free(q);
	}
	L->next=NULL;
	printf("已删除全部职工记录\n");
}

void end(worker*&L)       //选项8的功能,自己加的功能,不是题目要求
{                         //删除全部记录并结束程序
	destroy(L);
	free(L);              //调用end之后主函数结束,不会再访问L,所以释放空间
}

void menu()
{
	printf(" ┏━━━━━━━━━━━━━━━┓\n");
	printf(" ┃             菜单             ┃\n");
	printf(" ┠┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┨\n");
	printf(" ┠输入1:输入一个职工记录       ┃\n");  //本题不考虑文件OI,所以省去OI部分
	printf(" ┠输入2:显示所有职工记录       ┃\n");
	printf(" ┠输入3:按工号升序排序         ┃\n");
	printf(" ┠输入4:按部门升序排序         ┃\n");
	printf(" ┠输入5:按工资升序排序         ┃\n");
	printf(" ┠输入6:按工号删除一个职工记录 ┃\n");
	printf(" ┠输入7:删除全部职工记录       ┃\n");
	printf(" ┠输入8:删除全部记录并结束程序 ┃\n");  //第八条为自己加的功能,不是题目要求
	printf(" ┗━━━━━━━━━━━━━━━┛\n\n");
}

void main()
{
	int option,T=0;          //option记录输入选项号,T为辅助变量
	menu();
	worker*L=(worker*)malloc(sizeof(worker));
	L->next=NULL;
	for(;;)
	{
		printf("请输入选项序号: ");
		scanf("%d",&option);
		switch(option)
		{
     		case 1:
				input(L);
				break;
			case 2:
				show(L);
				break;
			case 3:
				num_sort(L);
				break;
			case 4:
				dep_sort(L);
				break;
			case 5:
				sal_sort(L);
				break;
			case 6:
				Delete(L);
				break;
			case 7:
				destroy(L);  //这里不删除头结点
				break;
			case 8:        //这里为自己加的功能,所以实现并没有全部放在一个函数里
				end(L);
				T=1;
				break;
			default:
				printf("选项序号输入错误,请重新输入!\n");
		}
		if(T)
			break;
	}
	printf("程序运行结束!\n");
}




接上表




  • 56
    点赞
  • 269
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值