数据结构课程设计报告.docx
- 文档编号:29706011
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:45
- 大小:412.76KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(45页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
信息科学与技术学院
数据结构
课
程
设
计
报
告
专业:
通信工程
班级:
通信一班
姓名:
**
学号:
2011****
2012年12月2日
目录
(一)学生信息管理系统(线性表实现)…………………………………1
1.1基本内容…………………………………………………………………2
1.2实验目的…………………………………………………………………2
1.3实验环境…………………………………………………………………2
1.4需求分析…………………………………………………………………2
1.5概要设计…………………………………………………………………3
1.6详细设计…………………………………………………………………3
1.7调试与问题…………………………………………………………17
1.8实验结果………………………………………………………………17
1.9结束………………………………………………………………22
(2)逆波兰式(栈实现)……………………………………………………23
2.1基本内容………………………………………………………………23
2.2实验目的………………………………………………………………23
2.3实验环境………………………………………………………………23
2.4需求分析………………………………………………………………23
2.5概要设计………………………………………………………………23
2.6详细设计………………………………………………………………24
2.7调试与问题……………………………………………………………27
2.8实验结果…………………………………………………………………28
2.9结束…………………………………………………………………28
1、题目
学生信息管理系统设计(线性表实现)
1.1基本内容
编写一个C语言程序实现学生数据管理的如下功能:
●学生信息的录入
●学生信息的修改
●学生信息的插入
●学生信息的删除
●学生信息的查找
●学生信息的显示
●学生信息的存储(文件输出)
●学生信息的装入(文件输入)
数据结构:
线性表
数据对象:
班或系的学生记录
学生信息:
学号(num)、姓名(name)、年龄(age)、性别(sex)、家庭住址(address)、
电话(tel)、入学时间(time)、分数(score).
1.2实验目的
编写一个学生信息管理系统实现学生信息(学号、姓名、年龄、性别、家庭住址、电话、入学时间、分数)的综合管理,包括(录入、修改、插入、删除、查找、显示、存储、装入等),从而提高学生信息的处理效率。
1.3实验环境
本程序在MicrosoftVisualC++6.0平台编译。
1.4需求分析
在你每个专业或者每个班级,我们通常需要对该系或者班级所有成员的各项信息进行操作,这些信息往往包括学生的学号、姓名、年龄、性别、家庭住址、电话、入学时间、分数等,对于这些信息我们若采用一般的存储方式对其进行各项操作往往显得不是那么方便,应用数据结构上的线性表来处理就比较简单和直观了,每个学生的信息独立存储,然后将所有学生的信息用线性表连接起来,这样便于修改、删除及插入的操作。
在具体的应用中,我们可能会对部分数据进行修改或者某些学生转系后需要删除其数据,有学生转入该系需要添加(或插入)学生数据,因此该系统需要有对学生数据的修改、删除和插入操作。
在综合评比时还需要对学生的分数进行排序,因此排序的功能就显得很重要。
1.5概要设计
ADTLink
{
数据对象D:
{学号(num);
姓名(name);
年龄(age);
性别(sex);
家庭住址(address);
电话(tel);
入学时间(time);
分数(score);
}
数据关系R:
{...}
基本操作:
voidadd(Linkl);
voiddisp(Linkl);//查看学生所有信息
voiddel(Linkl);//删除功能
Node*Locate(Linkl,charfindmess[],charnameornum[]);
voidQur(Linkl);//查询功能
voidTongji(Linkl);//统计
voidSort(Linkl);//排序
voidModify(Linkl);//修改功能
voidsave(Linkl);//将单链表l中的数据写入文件
voidprinte(Node*p);//本函数用于打印链表中某个节点的数据内容*/
voidprintstart();//打印分界线
voidWrong();//打印错误提示
voidNofind();//提示未找到
}ADTLink
1.6详细设计
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
intsaveflag=0;/*是否需要存盘的标志变量*/
structemployee
{
charname[15];/*姓名*/
charnum[10];/*学号*/
intage;/*年龄*/
charsex[6];/*性别*/
charaddress[20];/*家庭住址*/
chartel[12];/*电话*/
chartime[8];/*入学时间*/
intscore;/*分数*/
};
typedefstructnode
{structemployeedata;
structnode*next;
}Node,*Link;
//Linkl(注意是:
字母l不是数字1)
voidadd(Linkl);
voiddisp(Linkl);//查看学生所有信息
voiddel(Linkl);//删除功能
Node*Locate(Linkl,charfindmess[],charnameornum[]);
voidQur(Linkl);//查询功能
voidTongji(Linkl);//统计
voidSort(Linkl);//排序
voidModify(Linkl);//修改功能
voidsave(Linkl);//将单链表l中的数据写入文件
voidprinte(Node*p);//本函数用于打印链表中某个节点的数据内容*/
voidprintstart();//打印分界线
voidWrong();//打印错误提示
voidNofind();//提示未找到
voidmenu()//程序主菜单
{
printf("\t*****************************************************************\n");
printf("\t**\n");
printf("\t*学生信息管理系统*\n");
printf("\t**\n");
printf("\t*[1]录入学生信息[2]删除学生信息*\n");
printf("\t*[3]查找学生信息[4]修改学生信息*\n");
printf("\t*[5]插入学生记录[6]统计学生记录*\n");
printf("\t*[7]按分数排序[8]保存学生信息*\n");
printf("\t*[9]显示链表数据[0]退出管理系统*\n");
printf("\t**\n");
printf("\t**\n");
printf("\t*通信一班周培制作*\n");
printf("\t*****************************************************************\n");
}//菜单结束
voidDisp(Linkl)//显示单链表l中存储的学生记录,内容为employee结构中定义的内容
{
intcount=0;
Node*p;
p=l->next;
if(!
p)
{printf("\n=====>提示:
没有职工记录可以显示!
\n");
return;
}
printf("\t\t\t\t显示结果\n");
printstart();
printf("\n");
while(p)//逐条输出链表中存储的学生信息
{printe(p);
p=p->next;
}
printstart();
printf("\n");
}//voidDisp结束
voidprintstart()
{printf("-----------------------------------------------------------------------\n");}
voidWrong()
{printf("\n=====>提示:
输入错误!
\n");}
voidNofind()
{printf("\n=====>提示:
没有查找到该学生!
\n");}
voidprinte(Node*p)//本函数用于打印链表中某个节点的数据内容
{
printf("学号%s姓名%s年龄%d性别%s家庭住址%s\n电话%s\
入学时间%s分数%d\n\n",p->data.num,p->data.name,p->data.age,\
p->data.sex,p->data.address,p->data.tel,p->data.time,p->data.score);
}
/*该函数用于定位连表中符合要求的结点,并返回该指针*/
Node*Locate(Linkl,charfindmess[],charzcornum[])
{Node*r;
if(strcmp(zcornum,"num")==0)/*按学号查询*/
{r=l->next;
while(r!
=NULL)
{if(strcmp(r->data.num,findmess)==0)/*若找到findmess值的学号*/
returnr;
r=r->next;
}
}
elseif(strcmp(zcornum,"name")==0)/*按姓名查询*/
{r=l->next;
while(r!
=NULL)
{if(strcmp(r->data.name,findmess)==0)/*若找到findmess值的学生姓名*/
returnr;
r=r->next;
}
}
return0;/*若未找到,返回一个空指针*/
}
//add()函数中,无节点时,r指向list头,有节点时,r指向末尾节点
voidAdd(Linkl)/*增加学生*/
{Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/
charnum[10];
intflag=0;
r=l;
s=l->next;//链表没有节点时,s=null;/链表有节点时,指向第一个学生节点
while(r->next!
=NULL)//如果存在后继结点时,r指针后移一个
r=r->next;/*将指针移至于链表最末尾,准备添加记录*/
while
(1)
{printf("请输入8位学号(以'0'返回上一级菜单:
)");
scanf("%s",num);
if(strcmp(num,"0")==0)//输入'0',跳出while
(1),即跳出add()函数
break;
s=l->next;
while(s)//学号重复时,返回主菜单
{if(strcmp(s->data.num,num)==0)
{printf("=====>提示:
学号为'%s'的学生已经存在,\
若要修改请选择'4修改'!
\n",num);
flag=1;
return;
}
s=s->next;
}
p=(Node*)malloc(sizeof(Node));//生成没赋值的新节点p
strcpy(p->data.num,num);
printf("请输入姓名(最多15位):
");
scanf("%s",p->data.name);
getchar();
printf("请输入年龄:
");
scanf("%d",&p->data.age);
getchar();
printf("请输入性别(manorwoman):
");
scanf("%s",p->data.sex);
getchar();
printf("请输入住址(最多20位):
");
scanf("%s",p->data.address);
getchar();
printf("请输入电话(最多12位):
");
scanf("%s",p->data.tel);
getchar();
printf("请输入入学时间(8位):
");
scanf("%s",p->data.time);
getchar();
printf("请输入分数:
");
scanf("%d",&p->data.score);
getchar();
/*信息输入已经完成*/
p->next=NULL;/*表明这是链表的尾部结点*/
r->next=p;/*将新建的结点加入链表尾部中*/
r=p;
saveflag=1;
}
}//voidAdd增加结束
voidDel(Linkl)/*删除*/
{intsel;
Node*p,*r;/*实现删除操作的临时的结构体指针变量*/
charfindmess[20];
if(!
l->next)//当list无后继结点时,提示和结束返回del()
{printf("\n=====>提示:
没有记录可以删除!
\n");
return;
}
printf("\n=====>1按学号删除\n=====>2按姓名删除\n");
scanf("%d",&sel);
if(sel==1)//按学号删除
{printf("请你输入要删除的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{r=l;
while(r->next!
=p)
r=r->next;//从第一个结点找起,直到发现r->next=p,是待删除结点,跳出循环r->next=p->next;
free(p);
printf("\n=====>提示:
该学生已经成功删除!
\n");
saveflag=1;
}
else
Nofind();
}//if(sel==1)
elseif(sel==2)//按姓名删除
{printf("请你输入要删除的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{r=l;
while(r->next!
=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:
该学生已经成功删除!
\n");
saveflag=1;
}
else
Nofind();
}//if(sel==2)
else
Wrong();//显示输入错误的话
}//voidDel删除结束
voidQur(Linkl)//查询功能
{intsel;
charfindmess[20];
Node*p;//实现查询操作的临时的结构体指针变量
if(!
l->next)
{printf("\n=====>提示:
没有资料可以查询!
\n");
return;
}
printf("\n=====>1按学号查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/*学号*/
{printf("请输入要查找的学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{printf("\t\t\t\t查找结果\n");
printstart();
printe(p);//打印p结点各个数据成员的值
printstart();
}
else
Nofind();
}//if(sel==1)
elseif(sel==2)/*按姓名查找*/
{printf("请输入要查找的姓名:
");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{printf("\t\t\t\t查找结果\n");
printstart();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}//voidQur查询结束
voidModify(Linkl)//修改功能
{Node*p;
charfindmess[20];
if(!
l->next)
{printf("\n=====>提示:
没有资料可以修改!
\n");
return;
}
printf("请输入要修改的学生学号:
");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{printf("请输入新的学号(原来是%s):
",p->data.num);
scanf("%s",p->data.num);
getchar();
printf("请输入新的姓名(原来是%s):
",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("请输入新的年龄(原来是%d):
",p->data.age);
scanf("%d",&p->data.age);
getchar();
printf("请输入新的性别(原来是%s):
",p->data.sex);
scanf("%s",p->data.sex);
getchar();
printf("请输入新的住址(原来是%s):
",p->data.address);
scanf("%s",p->data.address);
getchar();
printf("请输入新的电话(原来是%s):
",p->data.tel);
scanf("%s",p->data.tel);
getchar();
printf("请输入新的入学时间(原来是%s):
",p->data.time);
scanf("%s",p->data.time);
getchar();
printf("请输入新的分数(原来是%d):
",p->data.score);
scanf("%d",&p->data.score);
printf("\n=====>提示:
资料修改成功!
\n");
}
else
Nofind();//if(p)结束
}//修改功能结束
//插入记录:
按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。
voidInsert(Linkl)
{Node*s,*r,*p;/*p指向插入位置,p指新插入记录节点*/
charch,new_num[10],old_num[10];
//old_num[]保存插入点位置之前的学号,new_num[]保存输入的新记录的学号
intflag=0;
s=l->next;
system("cls");
Disp(l);
while
(1)
{printf("请你输入已存在的学号(以'0'返回上一级菜单:
)");
scanf("%s",old_num);
if(strcmp(old_num,"0")==0)//输入'0',跳出while
(1),即跳出Insert()函数
return;
s=l->next;
flag=0;
while(s)/*查询该学号是否存在,flag=1表示该学号存在*/
{if(strcmp(s->data.num,old_num)==0)
{
flag=1;
break;
}
s=s->next;
}
if(flag==1)
break;/*若学号存在,则进行插入之前的新记录的输入操作*/
else
{getchar();
printf("\n=====>Thenumber%sisnotexisting,tryagain?
(y/n):
",old_num);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{continue;}
else
{return;}//返回主菜单
}
}
//以下新记录的插入新节点,学号不能跟已存在的学号相同,操作与Add()相同
printf("请你输入待插入的学号(以'0'返回上一级菜单:
)");
scanf("%s",new_num);
if(strcmp(new_num,"0")==0)//输入'0'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告