1、开创一块连续空间,初始化为闲暇静态链表。
2、闲暇链上的结点分配。
3、闲暇链上的回收分配。
4、静态单链表结点的分配与开释
六、算法描述(流程图与讲明)
(一)、详细描述
工资治理系统(要求)
该系统能够实现工资治理。
系统包括录入、游玩、查询、统计等功能。
其中录入功能要求能够添加新的工资信息到文件;游玩功能要求能按照工资卡号、姓名分类游玩,提供分屏显示;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号、姓名查询;统计功能要求能够按照月份累计统计某职工在某时刻段实发工资总金额。
(提示)
(1)文件中一行数据对应一个职工工资信息。
(2)工资信息的数据结构采纳结构体数据,一个数组元素对应一条工资单记录。
(3)工资单信息包括工资卡号、姓名、月份、应发工资、水费、电费、税金、实发工资等。
(4)实发工资=应发工资-水费-电费-税金,其中税金运算方法为:
1)、应发工资应发工资〈800元,税金=0
2)、800〈应发工资〈1400元,税金=(应发工资-800)*5%
3)、应发工资〉1400元,税金=(应发工资-1400)*10%
该系统分:
菜单函数、查询函数、添加函数、删除函数、显示函数、修改函数、储存函数、插入函数、和主函数九个模块。
菜单函数的要紧显示的是主菜单,你能够通过菜单函数选择你要选择的模块,选择你要执行的方法,菜单函数共有八个选择,在0~7之间你人选择一个,就会进入到相应的模块。
选择1带你进入添加模块;
选择2带你进入查询模块;
选择3带你进入删除模块;
选择4带你进入储存模块;
选择5带你进入插入模块;
选择6带你进入修改模块;
选择7带你进入显示函数;
选择0带你返回菜单函数;
职员的信息包括职工卡号、职员id、职员姓名、性不、部门、技术职称编号、电话、差不多工资、职务工资、应发工资、实发工资、税金、补助。
(二)、数据结构的采纳
添加模块和插入模块都运用到单链表的输入和插入,查询模块运用到了单链表的查找,删除模块运用到了单链表的删除,储存模块,修改模块,返回模块还有显示模块都运用到了单链表的输入和输出
(三)、算法的描述
本系统一开始就运用了结构体类型,定义了一个结构体类型变量worker,来定义职员的各种信息,还定义了一个数据节点,用于创建单链表。
菜单函数:
显示功能总页面,用cprintf()程序输出,system("cls")功能是清屏,清除所有显示的信息,
定位函数:
Node*locate(Linkm,charfind[],charfangshi[]){},m为链表,find,fangshi为两个数组,利用strcmp(fangshi,"id")程序,如果strcmp()==0,表示利用id完成查询、删除或修改,本程序要紧是完成用Id或name方式选择查询、删除或修该
查询函数:
chaxun(Linkm),完成是否又该工人的查询,如果m的指针域为空,表示没有工人的记录,否则通过id或name查询,调用lacate()函数,如果lacate()的值不为空,输入职员信息,按任意键终止。
添加函数:
add(Linkm),若m的指针域不为空,连续输入数值,申请节点,用节点存放输入数值,若职工卡号输入0,返回主页面,否则连续输入
删除函数:
delete(Linkm),r若m的指针域为空,表示没有记录,通过调用lacate()确定用哪一种方式进行删除,若找到则执行删除,否则没有该记录。
修改函数:
modify(Linkm),若m的指针域为空,表示没有记录,用get()输入id,用id得到想要修改的数据,修改完显示修改成功,否则显示失败。
显示函数:
xianshi(Linkm)若m的指针域为空,表示没有记录,显示所有职员的信息。
插入函数:
insert(Linkm)申请新节点,若节点为空,则没有插入记录,用get()输入插入的数据,从第一个节点开始,到显示插入成功,若重复插入则返回,否则连续插入。
储存函数;save(Linkm)用fp=fopen("d:
\\hello.txt","wb");语句创建一个放在d盘下的文件,若文件为空则不能打开,用p节点之向m的指针域,若p不为空,用fwrite(p,sizeof(Node),1,fp)写入文件,储存,
这些功能要紧用数据结构的单链表完成的,用得到的是c语言的知识。
(四)、系统功能模块图
2查询模块
按照姓名查询
屏幕输出
工资治理系统
4储存
模块
7显示模块
0退
出
从文件读入
按照id号查询
从键盘输入
6修改模块
1添加模块
3删除模块
5插入模块
按照姓名删除
按照id号删除询
按照id号插入
图6.1系统功能模块图
(五)、系统功能模块图
图6.2系统流程模块图
(六)、函数流程图
图6.3add()函数流程图
图6.4delete()函数流程图
图6.5save()函数流程图
图6.6insert()函数流程图
图6.7modify()函数流程图
图6.8xianshi()函数流程图
图6.9locate()函数流程图
七、运行结果(抓图)与分析
7.1主界面
执行成功之后,第一显示主菜单,如图7.1:
图7.1
7.2输入添加函数模块实现
选择”1”你将进入添加模块,在添加模块里你能够执行对职员的姓名,职工卡号等的添加,如图7.2:
图7.2
7.3输入查询函数模块实现
选择”2”你将进入查询模块,一是通过职员的id号查询职员的信息,还能够通过职员的姓名进行查询。
例如:
进入主菜单,你第一选择的是“2”,进入查询模块,然后你能够选择通过id或者是姓名进行职员信息查询,选择“1”,通过id查询,选择“2”通过姓名查询,如果你选择“2“,然后输入id号01,之后按回车键,就会显示一行你要查询的那个职员的信息,如图7.3:
图7.3
7.4输入删除函数模块实现
选择“3”你将你进入删除模块,你能够通过id号和职员的姓名进行删除,方法雷同,如图7.4
图7.4
7.5输入储存函数模块实现
输入“4”进行文件的储存,储存的路径是"d:
\\hello.txt","wb",如图7.5:
图7.5
7.6输入插入函数模块实现
输入“5”你将进入插入模块,你能够选择要插入的位置,是第一个数据后面依旧第几个数据后面,选择之后即可进行信息的录入,如果在职工卡号后输入0,则返回主页面,否则连续插入方法跟添加雷同,如图7.6:
图7.6
7.7输入修改函数模块实现
输入“6”,你将进入修改界面,你能够先选择你要修改的职员的id,之后你能够选择你要修改的信息,修改之后你会用到一个模块,储存模块,如图7.7
图7.7
7.8输入显示函数模块实现
输入“7”你将进入显示模块。
显示模块要紧的功能确实是显示信息。
执行完其他操作之后你能够通过显示信息显示出来,如图7.8
图7.8
7.9输入退出函数模块实现
输入“0”,退出界面,如图7.9
图7.9
八、源程序代码
#include
#include
#include
#include
//#include
intsaveflag=0;//标志一下,定义一个标志变量,用到的时候再找
typedefstructworker//定义一个structworker,相当于java的一个类
{
chargzkh[20];/*职工卡号*/
charid[20];/*id号*/
charname[20];/*姓名*/
charsex;/*性不*/
//intgl;/*工龄*/
chardepartment[20];/*部门*/
charlevel[10];/*技术职称*/
charjsbh[20];/*技术职称编号*/
charphone[20];
floatjbgz;/*差不多工资*/
floatzwgz;/*职务工资*/
floatyfgz;/*应发工资*/
floatsfgz;/*实发工资*/
floattax;
floatbz;/*补助*/
};
typedefstructnode
{
structworkerdata;//结构体work类型的变量data
structnode*next;//结构体note类型的指针变量,变量名为next
}Node,*Link;//note类型的指针变量
menu()/*菜单函数*/
{
system("cls");
//textcolor(12);
//gotoxy(10,5);
cprintf("王娇的工资治理系统:
\n");
//gotoxy(10,8);
cprintf("********************菜单********************\n");
//gotoxy(10,9);
cprintf("*1添加2查询*\n");
//gotoxy(10,10);
cprintf("*3删除4储存*\n");
//gotoxy(10,11);
cprintf("*5插入6修改*\n");
//gotoxy(10,12);
cprintf("*7显示0退出*\n");
//gotoxy(10,13);
cprintf("**********************************************\n");
}
/*定位函数*/
Node*locate(Linkm,charfind[],charfangshi[])
{
Node*r;
if(strcmp(fangshi,"id")==0)/*按照id查询*/
{
r=m->next;
while(r)
{
if(strcmp(r->data.id,find)==0)
returnr;
r=r->next;
}
}
elseif(strcmp(fangshi,"name")==0)
{
r=m->next;
while(r)
{
if(strcmp(r->data.name,find)==0)
returnr;
r=r->next;
}
}
}
/*查询函数*/
chaxun(Linkm)
{
intchoose;
charinputdata[20];/*存放查询的内容*/
Node*p;
if((m->next)==NULL)
{
system("cls");
printf("\n没有该职员的信息!
\n");
getchar();
return;
}
system("cls");
printf("1通过id查询2通过姓名查询\n");//选择1通过id查询,选择2,通过name查询
printf("请输入[1/2]\n");
scanf("%d",&choose);getchar();
if(choose==1)
{
printf("请输入数据!
\n");
scanf("%s",&inputdata);getchar();
p=locate(m,inputdata,"id");
if(p)
{
printf("工资卡号:
=%4s姓名:
=%4s实发工资:
=%4f税务:
=%4f差不多工资:
=%4f\n",
p->data.gzkh,p->data.name,p->data.sfgz,p->data.tax,p->data.jbgz);
//printf("%4s%4s%4f%4f%4f\n",p->data.gzkh,p->data.name,p->data.sfgz,p->data.tax,p->data.sfgz);
printf("按任意键连续!
\n");
getchar();
}
else
{
printf("无法找到!
\n");
getchar();
}
}
elseif(choose==2)
{
printf("请输入数据!
\n");
scanf("%s",&inputdata);getchar();
p=locate(m,inputdata,"name");
if(p!
=NULL)
{
printf("工资卡号:
=%4s姓名:
=%4s应发工资:
=%4f税务:
=%4f实发工资:
=%4f\n",
p->data.gzkh,p->data.name,p->data.sfgz,p->data.tax,p->data.jbgz);
//printf("%s%s%f%f%f\n",p->data.gzkh,p->data.name,p->data.sfgz,p->data.tax,p->data.sfgz);
printf("按任意键连续!
\n");
getchar();
}
else
{
printf("无法找到!
\n");
getchar();
}
}
}
/*添加函数*/
add(Linkm)
{
Node*p,*r,*s;
charnumstr[20];
r=m;
while(r->next!
=NULL)
{
r=r->next;
}
while(m)
{
p=(Node*)malloc(sizeof(Node));//申请结点
if(p==NULL)
{
printf("无法申请经历空间!
\n");
exit(0);
}
printf("职工编号:
");
gets(p->data.gzkh);
if(strcmp(p->data.gzkh,"0")==0)
{
break;
}
printf("id号:
");
gets(p->data.id);
printf("姓名:
");
gets(p->data.name);
printf("性不:
");
//gets(p->data.sex);
p->data.sex=getchar();
getchar();
printf("部门:
");
getchar();
gets(p->data.department);
printf("技术职称:
");
gets(p->data.level);
printf("技术职称编号:
");
gets(p->data.jsbh);
printf("电话:
");
gets(p->data.phone);
printf("差不多工资:
");
gets(numstr);
p->data.jbgz=atof(numstr);
printf("职务工资:
");
gets(numstr);
p->data.zwgz=atof(numstr);
printf("补助:
");
gets(numstr);
p->data.bz=atof(numstr);
p->data.yfgz=p->data.jbgz+p->data.zwgz+p->data.bz;//应发工资=差不多工资+职务工资+补助;
if(p->data.yfgz<800)
p->data.tax=0;//如果应发工资<800那么税金为0,
elseif(p->data.yfgz<=1400)
p->data.tax=(p->data.yfgz-800)*0.05;//如果应发工资大余800小于1400税金=(应发工资-800)*0.05
else
p->data.tax=(p->data.yfgz-1400)*0.1;//如果应发工资大于1400税金=(应发工资-1400)*0.1
p->data.sfgz=p->data.jbgz+p->data.zwgz+p->data.bz-(p->data.tax);//实发工资=差不多工资+职务工资+补助-税金;
p->next=NULL;
r->next=p;
r=p;
saveflag=1;
}
}
/*删除函数*/
delete(Linkm)
{
intchoose;
Node*p,*r;
charfind[20];
if(m->next==NULL)
{
system("cls");
printf("没有记录!
\n");
getchar();
return;
}
system("cls");
printf("1通过id删除2通过姓名删除\n");//选择1,通过id删除,选择2通过name删除
printf("请输入1或2:
\n");
scanf("%d",&choose);getchar();
if(choose==1)
{
printf("请输入已存在的id号!
\n");
scanf("%s",find);getchar();
p=locate(m,find,"id");
if(p!
=NULL)
{
r=m;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("d删除成功!
\n");
getchar();
saveflag=1;
}
else
{
printf("无法找到id号!
\n");
getchar();
}
}
elseif(choose==2)
{
printf("请输入已存现在的姓名!
\n");
scanf("%s",find);getchar();
p=locate(m,find,"name");
if(p!
=NULL)
{
r=m;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("删除成功!
\n");
getchar();
saveflag=1;
}
else
{
printf("无法找到姓名!
\n");
getchar();
}
}
}
/*显示数据*/
xianshi(Linkm)
{
Node*p;
p=m->next;
if(p==NULL)
{
printf("没有记录!
\n");
getchar();
return;
}
while(p)
{
printf("\t工资卡号姓名应发工资税金实发工资\n");
printf("\t%4s\t%4s\t%4f\t%4f\t%4f\n",p->data.gzkh,p->data.name,p->data.yfgz,p->data.tax,p->data.sfgz);
p=p->next;
}
getch();
}
/*修改函数*/
modify(Linkm)
{
Node*p;
charfind[20];
charnumstr[20];
if(m->next==NULL)
{
system("cls");
printf("没有记录!
\n");
getchar();
return;
}
system("cls");
print