链表的使用.docx
《链表的使用.docx》由会员分享,可在线阅读,更多相关《链表的使用.docx(27页珍藏版)》请在冰点文库上搜索。
链表的使用
沈阳航空工业学院
课程设计
学号200604021030
班级6402101
姓名武斌
指导教师王晓岩
2007年9月18日
沈阳航空工业学院
课程设计任务书
院系:
电子专业:
电子信息工程班级:
6402101
学号:
200604021030题目:
链表的使用
一、课程设计时间
2007年9月10日至2007年9月14日,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
(1)将学生信息以学号为序存入链表,记录数量不得少于10条,并将信息存入student.dat中(学生信息包括:
学号、姓名、性别、年龄)
(2)能够对学生信息进行插入和删除操作
(3)能够查找某一学生信息并输出
三、课程设计要求
1.程序质量:
✧贯彻结构化的程序设计思想。
✧用户界面友好,功能明确,操作方便。
✧用户界面中的菜单至少应包括“建立链表”、“学生记录插入”、“学生记录删除”、“信息查找”和“退出”5项。
✧代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2.课程设计说明书:
课程结束后,上交课程设计说明书和源程序。
课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、说明书成绩
六、教师评语
目录
一、需求分析1
二、程序流程图1
三、核心技术的实现说明及相应程序段5
四、个人总结12
五、参考文献13
六、完整的源程序13
一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为四个模块,其中每一个模块对应一个函数,他们的功能分别是:
建立链表,学生记录插入,学生记录删除,信息查找。
在这些函数当中,四个函数的实现严格按照题目的要求。
1、建立链表函数主要实现程序最初运行时学生数据的录入以及其后的运行中学生数据的追加功能;
2、学生记录插入函数实现的功能是按照学号对学生的数据记录进行插入信息;
3、学生记录删除函数实现的功能是按照学号对学生的数据记录进行删除;
4、信息查找函数实现的功能是按照学号对学生的数据记录显示
除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要
终止程序的执行。
每一个学生记录都包含学号、姓名、性别、民族、年龄、系别、班级和住址,在程序当中,将学生记录类型定义为结构体类型,添加以及追加的学生信息直接写入D盘的student.dat文件中,其他函数每次对学生记录的访问,其数据来源都是student.dat文件,这样做不但可以保证学生数据的一致性,而且可以对学生数据进行永久保存,保证每次运行程序都可以采用原来的数据。
二、程序流程图
1、程序总体结构图
图1程序总体结构图
2、具体功能框图
(1)建立链表
图2建立链表
(2)学生记录插入
图3学生记录插入
(3)学生记录删除函数
图4学生记录删除函数
(4)信息查找函数
图5信息查找函数
三、核心技术的实现说明及相应程序段
本程序主要由四个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。
在这些函数当中,建立链表函数、学生记录插入函数、学生记录删除函数和信息查找函数是程序中较为核心的部分,下面分别进行说明。
1、建立链表函数
建立链表分为两种情况,其一是在学生文件(student.dat)不存在的情况下,首先由程序创建一个新文件,并将录入的学生信息写入该文件当中;其二是在学生文件(student.dat)已经存在的情况下,此时文件要以读写方式或追加的方式打开,这样才可以保证以前已经存在的数据不丢失。
具体的程序段如下:
structstudent*creat1(structstudent*head,FILE*fp)
{
structstudent*p1,*p2;
p1=head;
if(head==NULL)
{
printf("不存在学生信息,请新建一个学生信息:
\n");
p1=p2=(structstudent*)malloc(LEN);
printf("\n请输入学生信息,以学号为0止,注意输入的学号和年龄必须为0到9的数字:
\n");
printf("\n学号:
");
scanf("%ld",&p1->num);
if(p1->num!
=0)
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p1=putin(p1,fp);//调用函数将返回的指针数据送给p1
head=p1;
p1->before=NULL;
}
while(p1->num!
=0)
{
p1=(structstudent*)malloc(LEN);
p1->before=p2;
printf("\n学号:
");
scanf("%ld",&p1->num);
if(p1->num!
=0)
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p2->next=p1;
p2=p1;
p1=putin(p1,fp);
}
}
fclose(fp);
p2->next=NULL;
return(head);
}
else
{
while(p1->next!
=NULL)
{
p1=p1->next;
}
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("\n请输入学生信息,以学号为0止,注意输入的学号和年龄必须为0到9的数字:
\n");
printf("\n学号:
");
scanf("%ld",&p1->num);
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p1=putin(p1,fp);
}
p1->next=NULL;
p2->next=p1;
return(head);
}
}
2、学生记录插入函数
该函数也是分两种情况,一是如果还没有建立链表,则输出“不存在学生信息,请新建一个学生信息库!
!
”,如果存在,就按学号插入学生信息。
具体的程序段如下:
structstudent*add(structstudent*head,FILE*fp)
{
structstudent*p1,*p2;
p1=head;
if(head==NULL)
{
printf("不存在学生信息,请新建一个学生信息库!
!
\n");
return0;
}
else
{
while(p1->next!
=NULL)
{
p1=p1->next;
}
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("\n请输入学生信息,注意输入的学号和年龄必须为0到9的数字:
\n");
printf("\n学号:
");
scanf("%ld",&p1->num);
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p1=putin(p1,fp);
}
p1->next=NULL;
p2->next=p1;
return(head);
}
}
3、学生记录删除函数
该函数的核心内容是删除算法以及最终对源文件的更新。
该函数执行时,用户输入待删除学生的学号,而后按照该学号进行查找,如果文件中存在该学生的数据,则采用删除算法删除,否则输出学生信息不存在的提示信息。
对学生信息的具体删除算法是在结构体数组中实现的,当学生的信息被找到后,位于数组中该学生后面的学生记录依次向前移动一个元素的位置,这些操作完成后,要删除的学生信息就被后面的数组元素覆盖掉了,也就实现了删除。
在数组中删除学生信息后,还要将更改后的信息重新写回文件当中,以保证数据的一致性。
具体程序段如下:
structstudent*del(structstudent*head1,longnum)
{
structstudent*p1,*p2;
p1=head1;
if(p1==NULL)
{
printf("%ld没有找到!
!
!
!
\n",num);
return(0);
}
while(num!
=p1->num&&p1->next!
=NULL)
{
p2=p1;
p1=p1->next;
}
if(num==p1->num)
{
if(head1==p1)
{
head1=p1->next;
}
else
{
p2->next=p1->next;
free(p1);
}
}
else
{
printf("%ld没有找到!
!
!
!
\n",num);
}
return(head1);
}
4、信息查找函数
执行该函数输入对应的学号,则输出对应的信息。
具体程序段如下:
structstudent*find(structstudent*head,longnum)
{
structstudent*p;
p=head;
if(p==NULL)
{
printf("没有找到您要得信息!
!
!
!
!
!
!
\n");
return(0);
}
while(p->next!
=NULL)
{
if(p->num==num)
{
printf("您要得学生信息如下:
\n");
printf("学号:
%ld\n",p->num);
printf("姓名:
%s\n",p->name);
printf("性别:
%s\n",p->sex);
printf("民族:
%s\n",p->nation);
printf("年龄:
%d\n",p->age);
printf("系别:
%s\n",p->depart);
printf("班级:
%s\n",p->clas);
printf("住址:
%s\n",p->address);
return(p);
}
elseif(p->next!
=NULL)
{
p=p->next;
}
}
if(p->num==num)
{
printf("您要得学生信息如下:
\n");
printf("学号:
%ld\n",p->num);
printf("姓名:
%s\n",p->name);
printf("性别:
%s\n",p->sex);
printf("民族:
%s\n",p->nation);
printf("年龄:
%d\n",p->age);
printf("系别:
%s\n",p->depart);
printf("班级:
%s\n",p->clas);
printf("住址:
%s\n",p->address);
return(p);
}
if(p->next==NULL)
{
printf("没有找到您要得信息!
!
!
!
!
!
!
\n");
}
return(p);
}
四、个人总结
经过这一个星期的课程设计让我深深知道什么是课程设计,我觉得要想自己真正的做出比较好的课设,不仅要对老师所讲的内容理解透彻,还要对课本的主要内容深入学习,除了这些还不够,还要有老师的指导和程序例题的参考。
当然在这几天里同学之间的帮助也是比不可少的,通过其他资源也可能更快的了解做题思路。
其实学C语言要做到心中有数,面对问题要有解题的算法。
通过这次课设让我对C语言产生了兴趣,对以后的学习会很有帮助的。
五、参考文献
1谭浩强.C程序设计.北京:
清华大学出版社,2005
2刘成等.C语言程序设计实验指导与习题集.北京:
中国铁道出版社,2006
六、完整的源程序
#include
#include
#include
#defineLENsizeof(structstudent)
//声明建立链表
structstudent*creat1(structstudent*head,FILE*fp);
//声明学生记录插入
structstudent*add(structstudent*head,FILE*fp);
//声明学生记录删除
structstudent*del(structstudent*head1,longnum);
//声明信息查找
structstudent*find(structstudent*head,longnum);
//声明显示记录信息
structstudent*print(structstudent*head);
//声明输入函数
structstudent*putin(structstudent*p1,FILE*fp);
//定义学生结构体
structstudent
{
longnum;
charname[50];
charsex[50];
charnation[50];
intage;
chardepart[30];
charclas[20];
charaddress[80];
structstudent*next;
structstudent*before;
};
/*..........................................主函数.............................................*/
voidmain()
{
FILE*fp;
longnum=0;
intchoose;
intn=1;
structstudent*head=NULL,*p=NULL;
if((fp=fopen("student.txt","a+"))==NULL)//打开文件
{
printf("不能打开文件!
!
!
!
!
\n");
exit
(1);
}
for(;n!
=0;)
{printf("\n***************************欢迎使用本学生信息管理系统!
*************************\n");
printf("*******************************************************************************\n");
printf("********************1、建立链表********************\n");
printf("********************2、学生记录插入********************\n");
printf("********************3、学生记录删除********************\n");
printf("********************4、信息查找********************\n");
printf("********************5、退出********************\n");
printf("*******************************************************************************\n");
printf("请选择你要的服务选项:
");
scanf("%d",&choose);
getchar();
system("cls");
switch(choose)
{
case1:
{
head=creat1(head,fp);
print(head);
break;
}
case2:
{
head=add(head,fp);
print(head);
break;
}
case3:
{
printf("请输入要删除的学生学号:
");
scanf("%ld",&num);
head=del(head,num);
print(head);
break;
}
case4:
{
printf("\n输入要查找的学号:
\n");
scanf("%ld",&num);
p=find(head,num);
break;
}
case5:
{
printf("请按任意键退出程序\n");
getchar();
n=0;
break;
}
default:
{
printf("你输入的选项错误!
!
\t请重新输入\n");
break;
}
}
}
}
/*OK...............................建立链表......................................*/
structstudent*creat1(structstudent*head,FILE*fp)
{
structstudent*p1,*p2;
p1=head;
if(head==NULL)
{
printf("不存在学生信息,请新建一个学生信息:
\n");
p1=p2=(structstudent*)malloc(LEN);
printf("\n请输入学生信息,以学号为0止,注意输入的学号和年龄必须为0到9的数字:
\n");
printf("\n学号:
");
scanf("%ld",&p1->num);
if(p1->num!
=0)
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p1=putin(p1,fp);//调用函数将返回的指针数据送给p1
head=p1;
p1->before=NULL;
}
while(p1->num!
=0)
{
p1=(structstudent*)malloc(LEN);
p1->before=p2;
printf("\n学号:
");
scanf("%ld",&p1->num);
if(p1->num!
=0)
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p2->next=p1;
p2=p1;
p1=putin(p1,fp);
}
}
fclose(fp);
p2->next=NULL;
return(head);
}
else
{
while(p1->next!
=NULL)
{
p1=p1->next;
}
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("\n请输入学生信息,以学号为0止,注意输入的学号和年龄必须为0到9的数字:
\n");
printf("\n学号:
");
scanf("%ld",&p1->num);
fprintf(fp,"%d\t",p1->num);
if(p1->num!
=0)
{
p1=putin(p1,fp);
}
p1->next=NULL;
p2->next=p1;
return(head);
}
}
/*OK....................................信息查找....................................*/
structstudent*find(structstudent*head,longnum)
{
structstudent*p;
p=head;
if(p==NULL)
{
printf("没有找到您要得信息!
!
!
!
!
!
!
\n");
return(0);