数据结构课程设计报告佘远程文档格式.docx
《数据结构课程设计报告佘远程文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告佘远程文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
charname[100];
charsex[100];
chariphone[100];
charaddr[100];
(2)用到的主要函数:
intmenu_select();
//菜单程序
linklistcreatelist(void);
//创建通讯录链表
voidinsertnode(linklisthead,listnode*p);
//插入通讯录链表结点
listnode*listfind(linklisthead);
//查找通讯录结点
voiddelnode(linklisthead);
//删除链表结点
voidprintlist(linklisthead);
//输出链表
voidchangelist(linklisthead);
//修改
voidmain()//主函数
(3)各个模块之间的关系:
主函数调用这会儿其他所有的函数
五、详细设计(要有注释)
/*主控菜单处理测试程序*/
#include<
stdio.h>
string.h>
stdlib.h>
#include<
conio.h>
//头文件代表什么意思?
typedefstruct{//通讯录结点类型
charnum[100];
//编号
charname[100];
//姓名
//性别
//电话
charaddr[100];
//地址
}datatype;
typedefstructnode{//结点类型定义
datatypedata;
//结点数据域
structnode*next;
//结点指针域
}listnode;
typedeflistnode*linklist;
linklisthead;
listnode*p;
//子函数的声明
//主函数
voidmain()
{
for(;
;
){
switch(menu_select())
{
case1:
printf("
***************************\n"
);
*通讯录链表信息的录入*\n"
****************************\n"
head=createlist();
//?
creatlist函数赋给头结点?
break;
case2:
*通讯录成员信息的插入*\n"
******************************************\n"
编号*姓名*性别*电话*地址*\n"
*******************************************\n"
p=(listnode*)malloc(sizeof(listnode));
//创建头结点
scanf("
%s%s%s%s%s"
p->
data.num,p->
data.name,p->
data.sex,p->
data.iphone,p->
data.addr);
insertnode(head,p);
case3:
*************************************\n"
*通讯录成员信息的查询*\n"
***************************************\n"
p=listfind(head);
if(p!
=NULL){
printf("
编号姓名性别联系电话地址\n"
----------------------------------------------------------------------------------\n"
%s,%s,%s,%s,%s\n"
}
else
查询的通讯录成员不存在!
\n"
case4:
************************************\n"
*通讯录成员信息的删除*\n"
delnode(head);
case5:
*通讯录链表成员信息的输出*\n"
printlist(head);
case6:
*通讯录链表成员信息的修改*\n"
changelist(head);
case0:
\t欢迎再次使用本程序!
return;
}
}
}
//菜单选择函数程序
intmenu_select()
intsn;
printf("
通讯录管理系统\n"
============================\n"
1.通讯录链表的建立\n"
2.通讯录结点的插入\n"
3.通讯录结点的查询\n"
4.通讯录结点的删除\n"
5.通讯录链表的输出\n"
6.通讯录链表的修改\n"
0.退出管理系统\n"
请选择0-6:
"
)
{
scanf("
%d"
&
sn);
if(sn<
0||sn>
6)
\n\t输入错误,重选0-6:
else
returnsn;
}
//用尾插法建立通讯录链表函数
linklistcreatelist(void)
{//尾插法建立带头结点通讯录链表算法
linklisthead=(listnode*)malloc(sizeof(listnode));
//创建头结点
listnode*p,*rear;
intflag=0;
//结束标志置0
rear=head;
//尾指针初始指向头结点
while(flag==0)
{p=(listnode*)malloc(sizeof(listnode));
//申请新结点
----------------------------------------------------------------\n"
scanf("
rear->
next=p;
//新结点连接到尾结点之后
rear=p;
//尾指针指向新结点
是否继续建立?
(1/0):
"
//这是什么意思啊?
flag);
//读入一个标志数据
next=NULL;
//终端结点指针域置空
returnhead;
//返回链表头指针
voidinsertnode(linklisthead,listnode*p)
listnode*p1,*p2;
p1=head;
p2=p1->
next;
while(p2!
=NULL&
&
strcmp(p2->
data.num)<
0)//strcmp函数,比较字符串
p1=p2;
//p1指向刚访问过的结点
p2=p2->
//p2指向表的下一个结点
p1->
//插入p所指向的结点
p->
next=p2;
//连接表中剩余部分
listnode*listfind(linklisthead)
listnode*p;
charnum[5];
charname[9];
intxz;
=====================\n"
1.按编号查询\n"
2.按姓名查询\n"
请选择:
p=head->
//假定通讯录表带头结点
xz);
if(xz==1){
printf("
请输入要查找者的编号:
%s"
num);
while(p&
strcmp(p->
data.num,num)<
0)//比较字符串比较,编号晓得指向下一个。
p=p->
if(p==NULL||strcmp(p->
data.num,num)>
0)
p=NULL;
//没有查到要查找的通讯者
else
if(xz==2){
请输入要查找者的姓名:
name);
while(p&
data.name,name)!
=0)
p=p->
returnp;
voiddelnode(linklisthead)
charjx;
listnode*p,*q;
//调用查找函数
if(p==NULL){
没有查到要删除的通讯者!
return;
真的要删除该结点吗?
(y/n)"
%c"
jx);
if(jx=='
y'
||jx=='
Y'
){
q=head;
while(q!
q->
next!
=p)
q=q->
q->
next=p->
//删除结点
free(p);
//释放被删除的结点空间
通讯者已被删除!
voidprintlist(linklisthead)
//因为链表带头接点,使P指向链表开始结点
-----------------------------------------------------------------------\n"
while(p!
=NULL)
{printf("
%s,%s,%s,%s,%s\n"
-------------------------------------------------------\n"
voidchangelist(linklisthead)//修改
linklistp;
charch[20];
输入要修改人姓名:
gets(ch);
p=head;
//用来判断是否修改
if(strcmp(p->
data.name,ch)==0)//比较函数比较两个数据
{
输入新num:
gets(p->
data.num);
输入新name:
data.name);
输入新sex:
data.sex);
输入新phone:
data.iphone);
输入新addres:
flag=1;
//找到并修改成功
if(flag==1)
修改完成\n"
对不起,无此记录!
请重新输入。
六、测试分析
七、使用说明
(1)首先运行程序,包括六个选项,0.退出系统.1.成绩录入2.成绩查询.3.成绩修改4.删除成绩.5.输出所有人成绩.6.统计各科总成绩.
(2)然后可以根据不同的需要选择不同的选项进行操作,
(3)最后退出程序。
八、运行程序过程中产生的问题及采取的措施
(1)在本次试验中我觉得我遇见了一些技术上的难点,刚开始是通讯录的建立,要用到数据结构中的知识,主要要用到链表和结构体。
在通讯录的插入的时候主要是用到学号的升值法插入,在此过程中要申请结点m和n,而且将要插入结点p插在两结点之间。
在通讯录的查询当中主要分为四类:
1).按学号查找的函数;
2).按姓名查找的函数;
3).按电话查找的函数;
4).按住址查找的函数。
其实原理一样,只是使用strcmp()函数匹配出和要查找的通讯者信息相同的结点,并且将其所有的信息输出。
在删除函数我开始觉得删除的时候很困难,后来我是按学号删除的,因为学号是关键字,主要注意在删除后对一些结点需要改变p=p->
next->
next;
free(q);
如果没找到则q=q->
next。
5).遇到问题XX是非常好的老师,我的程序在修改功能上总是出现一些难以察觉的问题,很伤脑筋。
XX了一下相关的情况,误打误撞的还找到了解决的方法,清空缓存。
遇到难点,直接XX学习,也是非常好的办法!
(2)在开始菜单中对应的功能数字是0-6。
可以按照自己想要操作的动作选择对应的数字实现相应的功能。
对于插入主要是按学号的升序来插入通讯者的信息。
在查找中分为四个查找方式:
1)按学号查询2)按姓名查询3)按号码查询4)按地址查询。
在删除中由于学号是主关键字,是唯一的,所以删除按学号来删除会比较方便。
而输出是按一个指针p指向头指针haed,按循环来输出直到p=NULL则结束输出。
参考文献
[1]李建学等著.数据结构课程设计案例精编.清华大学出版社,2007
[2]唐宁九等主编.数据结构与算法(C++版)实验和课程设计教程.清华大学出版社,2008)
设计题目二:
学生成绩管理系统
一.实习目的
二.问题描述
实现功能:
输入、输出、查找、读入、显示、保存、排序、退出。
三.需求分析
该程序所做的工作是对学生的成绩的管理,为师生进行学生成绩的记录、查询提供方便。
此程序规定:
1.在成绩录入是,姓名为20个字母以内的字符串;
各科成绩为整形;
学号长整型,性别和出生日期为字符型;
2.程序的输出主要为:
输出学生的各科成绩及统计数据;
3.程序的功能包括:
成绩的录入、修改、查找、输出和统计;
四.概要设计
1.用到的数据有:
intchinese;
//语文
intenglish;
//英语
intmath;
//数学
longnum;
//学号
charname[20];
charsex[20];
chardate[20];
//出生日期
scores;
//成绩
2.用到的主要函数:
(1)inthash(intkey);
//用除留余数法构造哈希函数
(2)intBuild_Hash(Hash*H,stust);
//输入一组关键字,建立Hash表,用链地址法处理冲突
(3)intSearch(Hash*H,intkey);
//成绩查询
(4)voidHeapAdjust(HeapType&
H,ints,intm);
//筛选
(5)voidHeapSort(HeapType&
H);
//堆排序。
(6)voidSegment(HeapTypeh);
//统计各个分数段的人数
(7)intSort(Hash*H);
//使用堆排序对各科成绩按从高到低排列输出
(8)voidadd(Hash*H);
//录入学生信息
(9)voiddoSearch(Hash*H);
//查询学生信息
(10)voiddoSort(Hash*H);
//分段统计及排序
(11)voidsavedata(student*&
p);
(12)student*getdata();
(13)voidmain();
//主函数
3.各程序模块之间的调用关系:
主函数13可以调用所有系统中的子函数。
五.详细设计(要有注释)
malloc.h>
typedefstruct//成绩结构体定义
intchinese;
//语文
//英语
//数学
}score;
typedefstructstudent//学生信息结构体定义
longnum;
structstudent*next;
}student,*stu;
typedefstuHash;
//定义哈希表的类型
typedefstruct//堆结构定义
intr[20];
//记录分数
intlength;
//长度
}HeapType;
inthash(intkey);
//用除留余数法构造哈希函数
intBuild_Hash(Hash*H,stust);
//输入一组关键字,建立Hash表,用拉链法处理冲突
intSearch(Hash*H,intkey);
//成绩查询
voidHeapAdjust(HeapType&
//筛选
voidHeapSort(HeapType&
//堆排序。
voidSegment(HeapTypeh);
//统计各个分数段的人数
intSort(Hash*H);
//使用堆排序对各科成绩按从高到低排列输出
voidadd(Hash*H);
//录入学生信息
voiddoSearch(Hash*H);
//查询学生信息
v