用简单链表管理员工信息.docx
《用简单链表管理员工信息.docx》由会员分享,可在线阅读,更多相关《用简单链表管理员工信息.docx(12页珍藏版)》请在冰豆网上搜索。
用简单链表管理员工信息
沈阳航空工业学院
课程设计
学号200604021008
班级6402101
姓名赵慧慧
指导教师王晓岩
年月日
沈阳航空工业学院
课程设计任务书
院系:
电子专业:
电子信息工程班级:
6402101学号:
200604021008题目:
用简单链表管理员工信息
一、课程设计时间
2007年9月10日至2007年9月14日,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
从键盘输入4位员工的信息到动态创建的线性单向链表中;然后通过访问该链表,将其中的所有节点中的员工信息存放到文件myfile.dat中。
每位员工的信息如下:
杜永宁软件部5760王传华销售部3920
殷泳培训部2940杨柳青软件部5440。
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“输入员工信息”、“显示员工信息”、“保存员工信息”、“退出”4项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图2
三、核心技术的实现方法、程序段及注释4
四、个人总结8
五、参考文献8
六、源程序8
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,其中每一个模块对应一个函数,他们的功能分别是输入员工信息函数,显示员工信息的函数和保存员工信息的函数,具体如下:
1.定义一个结构体,分别输入员工的姓名、所在部门和编号信息。
2.创建三个自定义子函数,用于输入、显示和保存。
3.创建主函数,通过主函数实现对子函数的调用执行程序设计任务。
4.退出函数,实现终止程序的执行。
退出函数属于附加函数,可以在一次运行当中循环执行所有的功能,并根据需要最终终止程序的执行。
每一个员工的纪录都包含姓名、所在部门、编号三个信息。
在程序当中,将员工信息类型定义为结构体类型,添加的员工信息直接写入d盘的myfile.dat文件中,现实函数每次对员工纪录的访问,其数据来源都是myfile.dat文件。
二、程序流程图
1.程序总体流程图
2.具体功能设计
(1)向链表添加节点的函数Insertlist
p为整个链表的头,in为要插入的节点,t为新节点
p=Null
Returnt
如果p->next为真
p=p->next
p->next=t;
returnh
(2)输出信息函数Print
定义初始化数据
输出“姓名”,“部门”,“编号”
当(out!
=Null)
out=out->next
(3)保存信息函数Save
如果文件为空
Return0
p!
=Null
p=p->next
三、核心技术的实现方法、程序段及注释
本程序主要由一个定义的结构体、三个子函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,输入员工信息函数、显示员工信息函数和保存信息函数是程序中较为核心的部分,下面分别进行说明。
1.添加员工信息的函数Insertlist
(1)该函数用于插入节点,定义了文件指针,打开员工信息的文件。
(2)如果输入的数据为空,则返回t,如果输入的数据不为空,则由p=p->next输出下一个节点。
具体函数段如下,
structyuangong*InsertList(structyuangong*p,conststructyuangong*in)//从链表插入一个节点
{
structyuangong*t=(structyuangong*)malloc(sizeof(structyuangong)),*h=p;
*t=*in;
t->next=NULL;
if(p==NULL)
returnt;
else
{
while(p->next)
p=p->next;
p->next=t;
returnh;
}
}
2.输出信息的函数Print
Print的作用在于显示出输入的员工信息,当进入系统后通过选择自动显示所有员工的信息。
Out先指向第一个结点,当输出完第一个结点之后,out指向第二个结点。
程序中out=->next的作用是将out原来所指向的结点中next的值赋给out,而out->next的值就是第二个结点的起始地址。
将它赋给out,就是使out指向第二个结点。
具体函数段如下,
voidPrint(conststructyuangong*out)//子函数,输出信息
{
printf("**************************************************************************\n");
printf("%-30s%-30s%-30s\n","姓名","部门","编号");
while(out!
=NULL)
{
printf("%-30s%-30s%-30d\n",out->name,out->bumen,out->num);
out=out->next;
}
}
3.保存信息函数Save
如果文件为空,则返回;如果文件不为空并且有数据,则保存成功,p=p->next就指向下一个节点。
具体函数段如下,
voidsave(structyuangong*p)//子函数,保存信息
{
inti;
FILE*fp;
if((fp=fopen("d:
\\myfile.dat","wb"))==NULL)
return;
for(i=0;p!
=NULL;i++)
{
if(fwrite(p,sizeof(structyuangong),1,fp)!
=1)
printf("保存失败!
");
p=p->next;
}
fclose(fp);
}
4.主函数
在主函数中我应用了switch函数,通过多分支选择语句对三个子菜单进行调用,供选择。
具体函数段如下,
main()
{
intchoice;
structyuangong*start=NULL,t;
FILE*fp;
if((fp=fopen("myfile.dat","rb"))==NULL)
return0;
while((choice=memu())!
=4)
{
switch(choice)
{
case1:
printf("*******请输入员工的姓名、部门、编号:
*******\n");
scanf("%s%s%d",&t.name,&t.bumen,&t.num);
start=InsertList(start,&t);
break;
case2:
Print(start);
break;
case3:
save(start);
printf("保存成功!
\n");
break;
default:
puts("错误:
非法命令!
");
break;
}
}
Print(fp,start);
return0;
}
四、个人总结
通过这一周的课设使我学到了许多,起初我对这个题目完全不知道该从哪看起,但经过向老师请教和与同学讨论,渐渐地我知道了怎样建立一个链表,怎样向链表插入节点。
我觉得这次课设不仅锻炼了我们的思维,还增强了我们的分析问题能力,使我觉得在你编程序时,即使一个小小的标点也会出很多问题,就会使整个程序无法进行下去。
当自己把问题都解决时觉得这一周没有浪费时间,这一周的负出总算有点成果了。
所以在以后的学习中我们要多动脑、多思考、多讨论,此次课设使我受益匪浅。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、源程序
#include
#include
#include
structyuangong
{//定义一个结构体
charname[30];
charbumen[30];
intnum;
structyuangong*next;
};
structyuangong*InsertList(structyuangong*p,conststructyuangong*in)//从链表插入一个节点
{
structyuangong*t=(structyuangong*)malloc(sizeof(structyuangong)),*h=p;
*t=*in;
t->next=NULL;
if(p==NULL)
returnt;
else
{
while(p->next)
p=p->next;
p->next=t;
returnh;
}
}
voidPrint(conststructyuangong*out)//子函数,输出信息
{
printf("**************************************************************************\n");
printf("%-30s%-30s%-30s\n","姓名","部门","编号");
while(out!
=NULL)
{
printf("%-30s%-30s%-30d\n",out->name,out->bumen,out->num);
out=out->next;
}
}
voidsave(structyuangong*p)//子函数,保存信息
{
inti;
FILE*fp;
if((fp=fopen("d:
\\myfile.dat","wb"))==NULL)
return;
for(i=0;p!
=NULL;i++)
{
if(fwrite(p,sizeof(structyuangong),1,fp)!
=1)
printf("保存失败!
");
p=p->next;
}
fclose(fp);
}
intmenu(void)//菜单
{
inta;
printf("*****************************************************\n");
printf("***输入1请输入员工信息***\n"
"***输入2显示员工信息***\n"
"***输入3保存***\n"
"***输入4退出***\n");
printf("*****************************************************\n");
scanf("%d",&a);
return(a);}
main()//主函数
{
intchoice;
structyuangong*start=NULL,t;
FILE*fp;
if((fp=fopen("d:
\\myfile.dat","w"))==NULL)
return0;
while((choice=menu())!
=4)
{
switch(choice)
{
case1:
printf("*******请输入员工的姓名、部门、编号:
*******\n");
scanf("%s%s%d",&t.name,&t.bumen,&t.num);
start=InsertList(start,&t);
break;
case2:
Print(start);
break;
case3:
save(start);
printf("保存成功!
\n");
break;
default:
puts("错误:
非法命令!
");
break;
}
}
Print(fp,start);
return0;
}