链表的使用.docx
《链表的使用.docx》由会员分享,可在线阅读,更多相关《链表的使用.docx(25页珍藏版)》请在冰豆网上搜索。
链表的使用
沈阳航空工业学院
课程设计
学号
班级
姓名
指导教师
年月日
沈阳航空工业学院
课程设计任务书
一、课程设计题目:
链表的使用
二、课程设计工作自2007年7月9日起至2007年7月14日止
三、课程设计内容:
运用所学的C语言知识,编制和调试程序,具体要求如下:
(1)将学生信息以学号为序存入链表,记录数量不得少于10条,并将信息存入student.dat中(学生信息包括:
学号、姓名、性别、年龄)
(2)能够对学生信息进行插入和删除操作,能够查找某一学生信息并输出
四、课程设计要求:
程序质量:
●采用模块化程序设计方法;在程序界面,以菜单的形式调用各功能函数;程序可读性强,界面友好;输出形式尽量美观。
●课设结束后,上交课程设计说明书,其内容如下:
程序设计题目、需求分析(分析题目的要求)、程序框图(总体框图和各功能模块框图)、核心技术的实现及其程序段、总结。
课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的内容如下:
●课程设计任务书
●程序设计题目
●需求分析(分析题目的要求)
●程序框图(总体框图和各功能模块框图,使用传统流程图或N-S框图)
●核心技术的实现方法及程序源代码及注释
●个人总结
●[参考资料]
指导教师:
____________________
学生签名:
____________________
目录
一、程序设计题目…………………………………………1
二、需求分析……………………………………………1
三、程序流程图…………………………………………2
四、核心技术的实现方法、程序段及注释………………6
五、个人总结……………………………………………18
六、参考文献……………………………………………19
一、程序设计题目
链表的使用,具体要求如下:
1、添加学生信息
2、删除学生信息
3、显示学生信息
4、查找学生信息
5、退出
注:
每个学生数据至少应该包括学号、姓名、性别,年龄,学生信息要保存在student.dat文件中。
二、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为4个模块,其中每一个模块对应一个函数,他们的功能分别是:
添加学生信息函数(add),删除信息函数(delete),,显示学生信
息函数(list)。
在这些函数当中,都是按照题目所给要求
二、程序流程图
当
(1)
输入数值1
真假
输入学生信息
输入数值2
真假
显示所有信息
数值3
真假
显示所查询的学生信息
数值4
真假
删除所输入学生的信息
数值5
真假
增加信息
数值0
真
退出
1、程序总体结构图
图表1
2、具体功能框图
(1)添加学生数据函数add
输入学生信息init
不能读写方式打开student.dat文件
真假
不能写文件打开student.dat
真假
追加学生数量n
从文件读取出学生数量m
输出文件失败
输入录入学生数量n
学生记录n+m写入文件
文件位置指针指在结尾
循环变量i=1
当i
EXIT
将n写入文件
输入学生学号,姓名,年龄,性别
循环变量i=1
学生信息写入文件i++
当i<1时
输入学生的numnameagexb
学生信息写入i++
关闭文件
图表2
(2)读取显示学生信息loadlist
读取stuedennt.dat不成功
真假
EXIT
读出的信息赋给n
循环变量i
真i读出学生信息i
EXIT
循环输出i++
图表3
(3)删除学生记录函数delete
(4)排序函数sort
图表4
(4)查找记录search
读取文件student.dat
循环变量i=0赋予函数flag;输入要查询的学生姓名
flag=0
flag=1
查无此学生
比较strcmp=0
输出学生信息学号,姓名,年龄,性别
图表5
三、核心技术的实现说明及相应程序段
本程序主要由四个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,录入信息函数、删除信息函数和增加信息函数、查找信息函数和显示信息函数,下面分别进行说明。
1.录入记录
在输入的时候程序已自动生成一个student.dat的文件让你输入
intInit(LYJDt[])
{
inti,n;
printf("\n请输入要输入的记录数:
\n");
scanf("%d",&n);
printf("开始输入记录:
\n");
for(i=0;i{
printf("\n第%d条记录的学号:
",i+1);
scanf("%d",&t[i].num);
printf("第%d条记录的学生姓名:
",i+1);
scanf("%s",t[i].name);
printf("第%d条记录的学生年龄:
",i+1);
scanf("%s",t[i].age);
printf("第%d条记录的学生性别:
",i+1);
scanf("%s",t[i].xb);
}
return(n);
}
2.显示所有记录
voidList(LYJDt[],intn)
{
inti;
printf("\n\n*********************************ADDRESS***********************************\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
for(i=0;i{printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
if((i+1)%10==0)
{
printf("Pressanykeycontinue...\n");
getchar();
}
}
printf("************************************end***********************************\n");
}
3.查找记录
查找的时候,程序会自动判断有无文件student.dat存在,若不存在退出,若存在接下去以下的程序.首先程序会load信息,若你输入的学生姓名存在则显示出你所查询的学生信息,若无则查无此人
voidSearchOnName(LYJDt[],intn)
{
chars[20];
inti,flag=0;
printf("请输入要查找的学生姓名:
\n");
scanf("%s",s);
for(i=0;i{
if(strcmp(s,t[i].name)==0)
{flag=1;
printf("\n\n此学生的信息如下:
\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
}
}
if(flag==0)
printf("查无此学生!
!
\n");
}
4.删除记录
同样的,程序会读取文件信息,当你输入的所以删除的姓名存在于文件当中则删除该信息且显示该信息,若无,显示查无此人.同时删除此信息后,由于链表,会自动连接
intDeleteRecord(LYJDt[],intn)
{
chars[20];
charch='N';
inti,j,flag=0;
printf("请输入要删除的学生姓名\n");
scanf("%s",s);
for(i=0;i{
if(strcmp(s,t[i].name)==0)
{flag=1;
printf("\n\n*********************************ADDRESS***********************************\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
ch=getchar();
{
for(j=i;jt[j]=t[j+1];
n--;
i--;
}
}
}
if(flag==0)
printf("查无此学生!
!
\n");
returnn;
}
5增加记录
程序读出原有信息,然后提示你要增加的人数,然后你按照学号,姓名,年龄,性别输入,自动链接到排序下去
intAddRecord(LYJDt[],intn)
{
inti,m;
char*s;
printf("\n请输入在增加的记录数:
\n");
scanf("%d",&m);
printf("开始追加记录\n");
for(i=n;i{
printf("\n第%d条记录的学号:
",i+1);
scanf("%d",&t[i].num);
printf("第%d条记录的学生姓名:
",i+1);
scanf("%s",t[i].name);
printf("第%d条记录的学生年龄:
",i+1);
scanf("%s",t[i].age);
printf("第%d条记录的学生性别:
",i+1);
scanf("%s",t[i].xb);
}
return(n+m);
}
四、个人总结
写出此程序让我体会到实践的不容易,以及C语言程序的多变,有趣,同时我在此之中也有很多不足之处,基础不扎实,还是需要有待学习研究
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、源程序
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"ctype.h"
#defineM50
structlyjd
{
intnum;
charname[20];
charage[20];
charxb[15];
};
typedefstructlyjdLYJD;
intInit(LYJDt[]);
voidList(LYJDt[],intn);
voidSearchOnName(LYJDt[],intn);
intDeleteRecord(LYJDt[],intn);
intAddRecord(LYJDt[],intn);
voidSortOnName(LYJDt[],intn);
voidSaveRecord(LYJDt[],intn);
intLoadRecord(LYJDt[]);
intMenu_select();
voidmain()
{
LYJDadr[M];
intlength;
while
(1)
{
switch(Menu_select())
{
case1:
length=Init(adr);
SaveRecord(adr,length);
break;
case2:
length=LoadRecord(adr);
List(adr,length);
break;
case3:
length=LoadRecord(adr);
SearchOnName(adr,length);
break;
case4:
length=LoadRecord(adr);
length=DeleteRecord(adr,length);
SaveRecord(adr,length);
break;
case5:
length=LoadRecord(adr);
length=AddRecord(adr,length);
SaveRecord(adr,length);
break;
case0:
exit(0);/*如返回值为0则程序结束*/
}
}
}
intMenu_select()
{
intc;
printf("欢迎您使用学生资源管理系统!
按任意键继续.......\n");
getchar();/*读入任意字符*/
printf("********************************MENU*********************************\n\n");
printf("1.录入学生信息记录\n");
printf("2.显示所有学生信息记录\n");
printf("3.按学生姓名查找记录\n");
printf("4.根据学生姓名删除记录\n");
printf("5.增加记录\n");
printf("0.退出\n");
printf("*********************************************************************\n");
do{
printf("\nEnteryourchoice(0-5):
");
if(scanf("%d",&c)!
=1)
{while(getchar()!
='\n')
continue;
continue;
}
}while(c<0||c>5);
returnc;
}
intInit(LYJDt[])
{
inti,n;
printf("\n请输入要输入的记录数:
\n");
scanf("%d",&n);
printf("开始输入记录:
\n");
for(i=0;i{
printf("\n第%d条记录的学号:
",i+1);
scanf("%d",&t[i].num);
printf("第%d条记录的学生姓名:
",i+1);
scanf("%s",t[i].name);
printf("第%d条记录的学生年龄:
",i+1);
scanf("%s",t[i].age);
printf("第%d条记录的学生性别:
",i+1);
scanf("%s",t[i].xb);
}
return(n);
}
voidList(LYJDt[],intn)
{
inti;
printf("\n\n*********************************ADDRESS***********************************\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
for(i=0;i{printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
if((i+1)%10==0)
{
printf("Pressanykeycontinue...\n");
getchar();
}
}
printf("************************************end***********************************\n");
}
voidSearchOnName(LYJDt[],intn)
{
chars[20];
inti,flag=0;
printf("请输入要查找的学生姓名:
\n");
scanf("%s",s);
for(i=0;i{
if(strcmp(s,t[i].name)==0)
{flag=1;
printf("\n\n此学生的信息如下:
\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
}
}
if(flag==0)
printf("查无此学生!
!
\n");
}
intDeleteRecord(LYJDt[],intn)
{
chars[20];
charch='N';
inti,j,flag=0;
printf("请输入要删除的学生姓名\n");
scanf("%s",s);
for(i=0;i{
if(strcmp(s,t[i].name)==0)
{flag=1;
printf("\n\n*********************************ADDRESS***********************************\n");
printf("学号学生姓名学生年龄学生性别\n");
printf("---------------------------------------------------------------------------\n");
printf("%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
printf("%-15s\n",t[i].xb);
ch=getchar();
{
for(j=i;jt[j]=t[j+1];
n--;
i--;
}
}
}
if(flag==0)
printf("查无此学生!
!
\n");
returnn;
}
intAddRecord(LYJDt[],intn)
{
inti,m;
char*s;
printf("\n请输入在增加的记录数:
\n");
scanf("%d",&m);
printf("开始追加记录\n");
for(i=n;i{
printf("\n第%d条记录的学号:
",i+1);
scanf("%d",&t[i].num);
printf("第%d条记录的学生姓名:
",i+1);
scanf("%s",t[i].name);
printf("第%d条记录的学生年龄:
",i+1);
scanf("%s",t[i].age);
printf("第%d条记录的学生性别:
",i+1);
scanf("%s",t[i].xb);
}
return(n+m);
}
voidSaveRecord(LYJDt[],intn)
{
inti;
FILE*fp;/*指向文件的指针*/
if((fp=fopen("student.dat","w"))==NULL)
{
printf("cannotopenfile\n");
exit
(1);
}
fprintf(fp,"%d\n",n);
for(i=0;i{
fprintf(fp,"%-6d%-20s%-20s",t[i].num,t[i].name,t[i].age);
fprintf(fp,"%-15s",t[i].xb);
fprintf(fp,"\r\n");
}
fclose(fp);/*关闭文件*/
}
intLoadRecord(LYJDt[])
{
inti,n;
FILE*fp;
if((fp=fopen("student.dat","r"))==NULL)
{
printf("cannotopenfile\n");
exit
(1);
}
fscanf(fp,"%d",&n);
for(i=0;ifscanf(fp,"%6d%20s%20s%15s",&t[i].num,t[i].name,t[i].age,t[i].xb);
fclose(fp);
printf("从文件中成功读出记录!
!
!
\n");
returnn;
}