C语言程序设计职工信息管理系统链表学习资料.docx
《C语言程序设计职工信息管理系统链表学习资料.docx》由会员分享,可在线阅读,更多相关《C语言程序设计职工信息管理系统链表学习资料.docx(33页珍藏版)》请在冰豆网上搜索。
![C语言程序设计职工信息管理系统链表学习资料.docx](https://file1.bdocx.com/fileroot1/2022-11/16/25707f8b-c631-4db3-a0fa-2f289b073174/25707f8b-c631-4db3-a0fa-2f289b0731741.gif)
C语言程序设计职工信息管理系统链表学习资料
信息与电子工程学院
C语言课程设计
职工信息管理系统设计
实验日期和时间:
2011年06月27日-06月29日
实验类别:
课程设计
实验类型:
设计性
一、实验环境
操作系统:
windowsxp
编程工具:
MicrosoftVisualC++6.0
开发环境:
CPU(Inter(R)Core(TM)2QuadcpuQB200@2.33GHz)内存:
2.76GB
硬盘:
228.3GB
开发地点:
现代教育中心201机房A17座
IP:
10.250.11.17
二、实验目的和要求
实验目的:
(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作算法。
(2)使学生进一步掌握程序设计、编写、调试能力。
(3)使学生了解软件开发的基本步骤和内容。
实验要求:
完成一个职工信息管理系统程序,具体内容如下:
(1)在内存中用链表记录,在硬盘上用二进制文件保存。
(2)设计完的程序能够以命令行或者菜单形式增加、删除、更新和查询数据的内容。
数据内容能够排序以方便查询。
(3)数据库中应该有至少20条记录。
三、实验内容和结果
(1)程序整体功能;
1、系统总体框
2、模块设计
该程序主要分为7个模块,分别是创建与添加模块、显示模块、查找模块、修改模块、删除模块、存档模块、文件统计模块、退出模块
(2)程序组成及各模块/函数功能;
创建与添加模块:
该模块的功能是输入职工信息。
函数为voidAdd(Node*woker)
原理:
采用尾插法,先建立链表与头结点,新增一个结点,键盘输入职工号、职工姓名、职工性别、职工出生年月、职工学历、职工职位、职工工资,将这些信息存储到新增结点中,将新增加的节点连到链表的尾端,如此以往,将尾结点的指针域置空,这样就得到了一条存储职工信息的链表,这样就完成了职工信息的创建与增加。
显示模块:
该模块功能是显示职工信息。
函数为voidDisp(Node*woker)
原理:
先新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有记录可以显示”;若不为空,则输出它的指针域所指向节点所储存的职工信息,并将该指针向后移一个结点,直到P指向空,即输出了所有职工的信息,这样就完成了所有职工信息的显示。
查找模块:
该模块功能是查找职工信息。
函数为voidTongji(Node*woker)
原理:
该模块分为两种查找方法,分别是按职工号查找和按职工姓名查找,因为这两种查找方法雷同,所以这里将只解释按职工号查找的原理。
先键盘输入一个要查找的职工号并新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“没有资料可以统计分类”,若不为空,则判断它的指针域所指向节点所储存的职工信息中的职工号,若相等,则输出这个职工的其他所有信息,并将P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息。
若不相等,则P指向下一个结点,再次进行判断,直到P指向空,即输出了所有查找到的信息,这样就完成了职工信息的查找。
修改模块:
该模块功能是修改职工信息。
函数为voidchange(Node*woker)
原理:
根据查找原理,查找到要修改信息的职工,删除这一节点,并新建一个节点,键盘输入想要修改的内容,并储存到新的结点中,将新的节点连接到链表中原先删除结点的位子,这样就完成了职工信息的修改。
删除模块:
该模块功能是删除管理职工信息。
函数为voiddismiss(Node*woker)
根据查找的原理,查找到要修改信息的职工,删除这一节点,并将其前驱结点的指针域指向其后继结点,这样就完成了职工信息的删除。
存档模块:
将内存中的信息存储到文件中。
函数为voidsave(Node*woker)
原理:
打开文件,新建一个指针P指向头结点,判断它的指针域是否为空,若为空,则输出“无记录”,若不为空,则将这个职工的所有信息输入到文件中,并将P指向下一个结点,直到P指向空,即输入了的信息,
文件统计模块:
打开文件,统计职工数目,并输出。
函数为voidload(Node*woker)
退出模块:
该模块功能是退出管理档案。
(3)重要数据结构,重要模块/函数算法;
1:
创建与添加模块:
voidAdd(Node*woker)//添加记录
{
Node*p,*r,*s;
charn[10];//先用于输入职工号,也用于判断是否跳出循环
r=woker;
s=woker->next;//使s为第一个有用的结点
while(r->next!
=NULL)//这个循环的作用是使r为最后一个有用的结点
r=r->next;//将指针置于最末尾
while
(1)
{
printf(">>>>>>>>>>提示:
输入0则返回主菜单!
\n");
printf("\n请你输入职工号:
");
scanf("%s",n);
if(strcmp(n,"0")==0)break;
p=(Node*)malloc(sizeof(Node));//申请空间
strcpy(p->data.num,n);
printf("\n请输入姓名:
");
scanf("%s",p->data.name);
printf("\n请输入性别:
");
scanf("%s",p->data.sex);
printf("\n请输入出生年月:
");
scanf("%s",&p->data.birthday);
printf("\n请输入学历:
");
scanf("%s",&p->data.degree);
printf("\n请输入职位:
");
scanf("%s",&p->data.position);
printf("\n请输入工资:
");
scanf("%s",&p->data.salary);
printf(">>>>>>>>>>提示:
已经完成一条记录的添加。
\n");
p->next=NULL;
r->next=p;//这一步是必需的,将p与先前的链表连起来构成一条新链表
r=p;//也是必需的.将r又重设为新链的最后一个有用结点
}
}
2:
显示模块
voidDisp(Node*woker)//输出职工信息
{
Node*p;
p=woker->next;
if(!
p)
{
printf("\n>>>>>>>>>>提示:
没有记录可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printf("职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n");
while(p)
{
printf("\n%-13s%-11s%-7s%-10s%-13s%-10s%-5s\n",p->data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary);
p=p->next;
}
}
3:
查找模块
voidTongji(Node*woker)//查找统计函数
{
Node*p;
intsel;intflag2=0,ha=0;
p=woker->next;
charfind[20];
if(!
woker->next)//若链表为空
{
printf("\n>>>>>>>>>>提示:
没有资料可以统计分类!
\n");
return;
}
printf(">>>>>>>>>>提示:
\n=====>0退出\n=====>1按职工号统计\n=====>2按职工姓名名称统计\n");
scanf("%d",&sel);
if(sel==1)
{
printf("\n输入你要统计分类的职工号:
");
scanf("%s",find);
while(p)
{
if(strcmp(p->data.num,find)==0)
{
flag2++;
}
if(flag2==1&&ha!
=flag2)
{printf("职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n");
printf("\n%-13s%-11s%-7s%-10s%-13s%-10s%-5s\n",p->data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary);
ha=flag2;
}
elseif(flag2>ha){printf("\n%-13s%-11s%-7s%-10s%-13s%-10s%-5s\n",p->data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary);ha=flag2;}
p=p->next;
}
if(flag2)
{
printf("\n*************************按设备号%s统计分类的有%d条记录:
*************************\n\n",find,flag2);
}
else{printf("\n按职工号%s统计的结果为0个\n\n",find);}
}
elseif(sel==2)
{
printf("\n输入你要统计分类的职工姓名:
");
scanf("%s",find);
while(p)
{
if(strcmp(p->data.name,find)==0)
{
flag2++;
}
if(flag2==1&&ha!
=flag2)
{printf("职工号职工姓名职工性别职工生日职工学历职工职位职工工资\n");
printf("\n%-13s%-11s%-7s%-10s%-13s%-10s%-5s\n",p->data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary);
ha=flag2;
}
elseif(flag2>ha){printf("\n%-13s%-11s%-7s%-10s%-13s%-10s%-5s\n",p->data.num,p->data.name,p->data.sex,p->data.birthday,p->data.degree,p->data.position,p->data.salary);ha=flag2;}
p=p->next;
}
if(flag2)
{
printf("\n******************按设备名称%s统计的有%d条记录:
********************\n\n",find,flag2);
}
else{printf("\n按职工姓名%s统计分类的结果为0个\n\n",find);}
}
elseif(sel==0)return;
}
4:
修改模块
voidchange(Node*woker)//修改职工信息函数
{
Node*p;
charfind[20];
if(!
woker->next)