用链式存储的链表实现小型员工管理系统

当大家学习到数据结构的顺序表的时候会很大可能会遇到一个问题,就是用该结构实现某某管理系统,这里展现员工管理系统

#include"stdio.h"
#include"stdlib.h"

#include"conio.h"

typedef struct employee
{
	int no;//编号 
	char name[20];//名字 
	char depno[20];//部门 
	float salary;//薪资 
	
}Employee;//定义一个结构体来记录员工信息 

typedef struct _Node
{
	Employee E;
	struct _Node* next; 
}Node;
//定义链式存储 

void menu()
{
	printf("1.输入员工数据  \n");
	printf("2.输出员工数据   \n");
	printf("3.排序           \n");
	printf("4.删除员工信息   \n");
	printf("5.删除员工文件数据\n");
	printf("6.存储员工信息\n"); 
	printf("7.退出\n"); 
	printf("***************************************\n");
    printf("***************************************\n");
	printf("请选择要实现功能>>>> \n");	
}//实现导引 
void Insert(Node* head)//实现插入功能 
{
	Node* fresh = (Node*) malloc(sizeof(Node));//创建结点 
	fresh->next=NULL;//因为插入该节点后此节点会变成尾节点,将地址设为NULL 
	printf("请输入 编号\n");
	scanf("%d",&fresh->E.no);
	printf("输入名字>\n");
	scanf("%s",fresh->E.name);//注意用char定义的数组输入不需要%s 
	printf("输入部门编号>\n");
	scanf("%s",fresh ->E.depno);
	printf("请输入工资>\n");
	scanf("%f",&fresh ->E.salary);
	Node* move=head;
	while(move->next !=NULL)
	{
		move=move->next;//保证在尾部插入 
	}
	move->next=fresh;//指向新节点 
	
	
	
}

void Print(Node* head)//打印数据 
{
	Node* move=head->next;
    while(move!=NULL)//打印条件 
    {
    	printf("编号:%d 姓名:%s 部门编号:%s 工资:%f\n",move->E.no,move->E.name,move->E.depno,move->E.salary);
    	move=move->next;
	}
	
}

void Sort(Node* head)//排序 
{
	printf("1.编号\n2.部门编号\n3.工资\n");
	int n;
	scanf("%d",&n);
	switch(n)//选择排序内容 
	{
		case 1:
			for(Node* i=head->next;i->next !=NULL;i=i->next)
			{
				for(Node* j=head->next;j->next!=NULL;j=j->next)
				{
					if(j->E.no>j->next->E.no)
					{
						Employee t=j->E;
						j->E=j->next->E;
						j->next->E=t;
					}
				}
			}
			break;
		case 2:
			for(Node* i=head->next;i->next !=NULL;i=i->next)
			{
				for(Node* j=head->next;j->next!=NULL;j=j->next)
				{
					if(j->E.depno>j->next->E.depno)
					{
						Employee t=j->E;
						j->E=j->next->E;
						j->next->E=t;
					}
				}
			}
			
			break;
			case 3:
				for(Node* i=head->next;i->next !=NULL;i=i->next)
			    {
			    	
				    for(Node* j=head->next;j->next!=NULL;j=j->next)
				    {
				        	
					    if(j->E.no>j->next->E.no)
					    {
						    Employee t=j->E;
						    j->E=j->next->E;
						    j->next->E=t;
					    }
			       }
			    }
				break;
			default:
				printf("s输入错误\n");
	 } 
}
void Save(Node* head)//保存文件 
{
	FILE* file = fopen("emp.dat","w");//文件 打开 
	if(file==NULL)
	{
		printf("打开失败\n");
		return;
	}
	Node* move=head->next;
	while(move!=NULL)
	{
		if(fwrite(&move->E,sizeof(Employee),1,file)!=1)
		{
			printf("保存%s出现错误\n",move->E.name);
		}
		move=move->next;
	}
	fclose(file);
}
void Del(Node*head)//删除 
{
	printf("请输入要删除员工的编号\n");
	int n;
	scanf("%d",&n);
	Node* move=head;
	while(move->next!=NULL)
	{
		if(n==move->next->E.no)
		{
			Node* t=move->next;
			move->next=move->next->next;
			free(t);
			t=NULL;
			Save(head);
			return;
		}
		move=move->next;
	}
	printf("未找到该职工\n");
	
}
void Read(Node* head)//阅读已有文件,若有数据用数据创建链表 
{
	FILE* file = fopen("emp.dat","r");
	if(!file){
		printf("打开失败\n");
		return;
	}
	Node* fresh=(Node*)malloc(sizeof(Node));
	fresh->next=NULL;
	Node* move =head;
	while(fread(&fresh->E,sizeof(Employee),1,file)==1)
	{
		move->next=fresh;
		move=fresh;
		fresh=(Node*)malloc(sizeof(Node));
		fresh->next=NULL;
	}
	free(fresh);//释放 
	fclose(file);

}
void Des(Node* head)//销毁链表 
{
	Node* pre=head,*p=pre->next;
	while(p!=NULL)
	{
		free(pre);
		pre=p;
		p=p->next;
		
	}
	free(pre);
}
void Delf(Node* head)//删除文件 
{
	FILE * file;
	if((file=fopen("emp.dat","wb"))==NULL)
	{
		printf("打开失败\n");
		return;
	}
	fclose(file);
	Des(head);
	head=(Node*)malloc(sizeof(Node));
	head->next=NULL;
	
	
	
}

int main()
{
	
	Node* head = (Node*)malloc(sizeof(Node));
	head->next=NULL;
	Read(head);
	while(1)
	{
		menu();
	    char c=_getch();//使用_getchar()后不需要按回车 
	    switch(c)
	    {
	    	
		    case '1':
		    	Insert(head);
			    break;
	 	    case '2':
	 	    	Print(head);
			    break;
		    case '3':
		    	Sort(head);
			   break;
		    case '4':
		    	Del(head);
			   break;
		    case '5':
		    	Delf(head);
			   break;
		    case '6':
		    	Save(head);
		       break;
		    case '7':
		    	exit(0);
		    	break;
		    default:
		    	break;
			
	}
	}
	return 0;
 } 

 

 

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值