当大家学习到数据结构的顺序表的时候会很大可能会遇到一个问题,就是用该结构实现某某管理系统,这里展现员工管理系统
#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;
}