主要功能:存储职工的职工号、姓名、部门号、工资,实现职工号、部门号、工资的排序,删除单个职工的记录、删除全部职工的记录。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
struct Worker
//建立包含职工号、姓名、部门、工资的结构体
{
int no; /*职工号*/
char name[10]; /*姓名*/
int depno; /*部门*/
int salary; /*工资*/
};
//typedef struct Worker *pworker;
struct LINK
///此为定义链表的结构体,结构名为LINK,结构成员为Worker和LINK
{
Worker w;
LINK *next;
};
typedef struct LINK *PLINK;
/*程序结束时释放内存*/
void release(PLINK p)
{
PLINK q;
while(NULL!=p->next)
{
q=p;
p=p->next;
free(q);
}
free(p);
}
/*创建职工信息链表*/
PLINK create()
{
PLINK p=(PLINK)malloc(sizeof(struct LINK));
if(NULL!=p)
{
p->next=NULL;
return p;
}
printf("内存不足!\n");
return NULL;
}
/*显示程序界面文字*/
void message()
{
system("cls");//清屏
system("color 00a");//字的颜色
printf(" --请输入:【1】 录入职工信息\n");
printf(" --请输入:【2】 浏览职工信息\n");
printf(" --请输入:【3】 按职工号排序\n");
printf(" --请输入:【4】 按部门号排序\n");
printf(" --请输入:【5】 按工资数排序\n");
printf(" --请输入:【6】 删除指定职工号信息\n");
printf(" --请输入:【7】 删除职工文件中的全部记录 \n");
printf(" --请输入:【8】 清屏\n");
printf(" --请输入:【-1】 退出\n");
}
void SaveFile(PLINK p) //将职工单链表数据存入数据文件
{
PLINK q=p->next;
int n=0;
FILE *fp;
if ((fp=fopen("work.txt","wb"))==NULL) //以只写(‘wb’)的方式打开名为‘emp.dat’的文件
{
printf(" 提示:不能创建文件work.txt\n");
return;
}
while (q!=NULL)
{
fwrite(&q->w,sizeof(Worker),1,fp); //文件写接口
q=q->next;
n++;
}
fclose(fp); //关闭文件
release(p); //释放职工单链表L
if (n>0)
printf(" 提示:%d个职工记录写入work.txt文件\n",n);
else
printf(" 提示:没有任何职工记录写入work.txt文件\n");
}
/*录入职工信息*/
int add(PLINK p)
//采用头插法
{
PLINK q=(PLINK)malloc(sizeof(struct LINK));
if(NULL==q)
{
printf("录入失败提示:内存不足!\n");
return -1;
}
printf("请输入职工号(数字):");
scanf("%d",&q->w.no);
PLINK h=p->next;
while(h)
{
if(h->w.no==q->w.no)
{
free(q);
printf("录入失败提示:此职工号已经存在!\n");
return -1;
}
h=h->next;
}
printf("请输入职工姓名(文字):");
scanf("%s",&q->w.name);
printf("请输入职工部门号(数字):");
scanf("%d",&q->w.depno);
printf("请输入职工工资数(数字):");
scanf("%d",&q->w.salary);
q->next=p->next; //头插法
p->next=q;
printf("录入成功!\n");
return -1;
}
void nopai(PLINK p){ //职工号排序
PLINK o,pre,q;
o=p->next->next;
p->next->next=NULL;
while(o!=NULL){
q=o->next;
pre=p;
while(pre->next!=NULL&&pre->next->w.no<o->w.no)
pre=pre->next;
o->next=pre->next;
pre->next=o;
o=q;
}
}
void depnopai(PLINK p){ //部门号排序
PLINK o,pre,q;
o=p->next->next;
p->next->next=NULL;
while(o!=NULL){
q=o->next;
pre=p;
while(pre->next!=NULL&&pre->next->w.depno<o->w.depno)
pre=pre->next;
o->next=pre->next;
pre->next=o;
o=q;
}
}
void salarypai(PLINK p)
//冒泡排序
{ //工资排序
PLINK o,pre,q;
o=p->next->next;
p->next->next=NULL;
while(o!=NULL){
q=o->next;
pre=p;
while(pre->next!=NULL&&pre->next->w.salary<o->w.salary)
pre=pre->next;
o->next=pre->next;
pre->next=o;
o=q;
}
}
/*浏览职工信息*/
void show(PLINK p)
{
message();
printf("浏览职工信息\n");
printf("职工号\t姓名\t部门号\t工资\t\n");
while(NULL!=p->next)
{
printf("%d\t%s\t%d\t%d\t\n",
p->next->w.no,p->next->w.name,p->next->w.depno,p->next->w.salary);
p=p->next;
}
printf("显示完毕!\n");
}
/*按职工号删除职工信息*/
int del(PLINK p,int no)
{
message();
printf("按职工号删除职工信息\n");
while(NULL!=p->next)
{
if(p->next->w.no==no)
{
PLINK q=p->next;
p->next=p->next->next;
free(q); //释放结点
printf("删除成功!\n");
return 1;
}
p=p->next;
}
printf("没有你输入的职工号!\n");
return -1;
}
void dell(PLINK p){ //删除全部员工记录
while(NULL!=p->next)
{
PLINK q=p->next;
p->next=p->next->next;
free(q); //释放结点
}
p=p->next;
}
int main()
{
int cmd=0;/*命令号*/
int no;
char name[4];
PLINK pworker;
if(!(pworker=create()))
{
exit(0);/*如果创建职工信息链表表头失败则结束程序*/
}
while(cmd!=-1)
{
switch(cmd)
{
case 0:
message();
break;
case 1:
add(pworker);
break;
case 2:
show(pworker);
break;
case 3:
nopai(pworker);
show(pworker);
printf("按职工号排列成功!\n");
break;
case 4:
depnopai(pworker);
show(pworker);
printf("按部门号排列成功!\n");
break;
case 5:
salarypai(pworker);
show(pworker);
printf("按工资排列成功!\n");
break;
case 6:
printf("请输入要删除的职工号:");
scanf("%d",&no);
del(pworker,no);
show(pworker);
printf("删除成功!\n");
break;
case 7:
dell(pworker);
show(pworker);
printf("已经删除全部记录!");
break;
case 8:
default:
message();
}
printf("请输入操作命令数字:\n");
scanf("%d",&cmd);/*接收命令*/
}
release(pworker);
return 0;
}