数据结构课程设计实验报告.docx
- 文档编号:27070607
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:28
- 大小:175.58KB
数据结构课程设计实验报告.docx
《数据结构课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构课程设计实验报告
数据结构课程设计实验报告
设计题目:
一
单位员工通讯录管理系统
一、题目要求
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。
其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
二、概要设计
本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。
三、主要代码及分析
这里面关于链表的主要的操作有插入,查询,删除。
则这里只列出这几项的主代码。
1、通过建立通讯录结构体,对信息进行存储,建立链表,建立信息之间的联系。
typedefstruct{}DataType;结构体来存储通讯录中的基本信息
typedefstructnode
{DataTypedata;/*结点的数据域*/
structnode*next;/*结点的指针域*/
}ListNode,*LinkList;
2、信息插入操作,将信息查到链表的后面。
voidListInsert(LinkListlist){//信息插入
ListNode*w;
w=list->next;
while(w->next!
=NULL)
{w=w->next;}
ListNode*u=newListNode;
u->next=NULL;
cout<<"员工编号:
";cin>>u->data.num;
cout<<"员工姓名:
";cin>>u->data.name;
cout<<"手机号码:
";cin>>u->data.call;
cout<<"员工邮箱:
";cin>>u->data.email;
cout<<"办公室电话号码:
";cin>>u->data.phone;
w->next=u;w=w->next;
}
3、信息删除操作
voidListDelete(LinkListlist){//删除
ListNode*c1;
ListNode*c2;
ListNode*c3;
c1=list;
c2=list;
ints=0;
charSchax[20];
cout<<"-------------------------------------------------------"< cout<<"请输入要删除的员工编号: "; cin>>Schax; while((strcmp(Schax,c1->data.num))) {s++;c1=c1->next;} for(intj=0;j {c2=c2->next;} c3=c2->next; c2->next=c3->next; } 4、查询 voidTraverse(LinkListlist){//查询 ListNode*s; s=list->next; inta=0; cout<<"按员工编号查询,请输入员工编号: "; charnum[20]; cin>>num; do{ if(! (strcmp(num,s->data.num)))//Q=H,strcmp(Q,H)==0;Q>H,strcmp(Q,H)==1;Q { cout<<"员工编号: "< cout<<"员工姓名: "< cout<<"手机号码: "< cout<<"员工邮箱: "< cout<<"办公室电话号码: "< return; a++; } } while(s->next! =NULL,s=s->next); if(a==0) {cout<<"小凤温馨提示~~~~~~您输入的信息不存在! "< } 四、运行结果及分析 插入操作及其结果 查询 修改 (修改结果) 删除 五、设计心得体会 通过这次设计,又温习了一下链表的基本操作,对链表的增删改查的基本内容都有了一定的掌握,为以后的编程打好了基础。 设计题目: 二 线索二叉树 一、题目要求 1.建立中序线索二叉树,并且中序遍历; 2.求中序线索二叉树上已知结点中序的前驱和后继; 本程序通过建立通讯录链表,对员工信息进行记录,并建立一个系统的联系。 二、概要设计 这个是对线索二叉树的编程,首先要熟悉掌握线索二叉树的基本原理,在n个结点的二叉链表中含有n+1个空指针。 因为含n个结点的二叉链表中含有2n个指针,除了根结点,每个结点都有一个从父结点指向该结点的指针,因此一共使用了n-1个指针,所以在n个结点的二叉链表中含有2n-(n-1)=n+1个空指针。 因此,可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。 这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。 为了区分一个结点的指针是指向其孩子的指针,还是指向其前驱或后继结点的线索,可在每个结点中增加两个线索标志。 三、主要代码及分析 1、建立二叉树 intCreatBiTree(Bitree&T)//先序创建二叉树 {//该节点非空返回1,双亲节点对应标志Link, //空时返回0,双亲节点对应标志应为Thread TElemTypech; cin>>ch; if(ch=='#') {T=NULL;return0;} else {if(! (T=(BitNode*)malloc(sizeof(BitNode)))) {cout<<"存储分配失败"< (1);} T->data=ch; if(CreatBiTree(T->lchild))T->LTag=Link; elseT->LTag=Thread; if(CreatBiTree(T->rchild))T->RTag=Link; elseT->RTag=Thread; } return1; } 2、中序线索遍历二叉树。 voidInThreading(Bitreep)//中序遍历线索化二叉树,如果一个结点没有左孩子,则将其指向其前驱,如果没有右孩子,则将其指向其后继。 { if(p! =NULL) { InThreading(p->lchild);//左子树线索化 if(p->lchild==NULL)//前驱线索 {p->LTag=Thread;p->lchild=pre;} if(pre->rchild==NULL)//后继线索 {pre->RTag=Thread;pre->rchild=p;} pre=p;//保持pre指向p的前驱 InThreading(p->rchild);//右子树线索化 } } intInOrderThreading(Bitree&Thrt,BitreeT) {//中序遍历线索化二叉树T,并将其中序线索化,Thrt指向头节点 Thrt=(Bitree)malloc(sizeof(BitNode));//申请头结点地址 if(Thrt==NULL)exit (1); Thrt->LTag=Link;//建立头结点 Thrt->RTag=Thread; Thrt->rchild=Thrt;//右指针回指 if(T==NULL)Thrt->lchild=Thrt;//若二叉树为空,则左指针回指 else { Thrt->lchild=T;//头结点指向树的根 pre=Thrt; InThreading(T);//中序遍历线索化二叉树 pre->rchild=Thrt;//二叉树的最后一个结点的后继结点指向thrt. pre->RTag=Thread;//最后一个结点的线索化 Thrt->rchild=pre; } return1;} 3、输出各结点前驱和后继 BitreeInPre(Bitreep)//前驱, { Bitreeq; q=p->lchild;//遍历其左子树。 if(p->LTag==Thread)//若标志为1,则左链为线索,只是其前驱。 return(p->lchild); if(q==NULL)//如果左链为空,则无前驱。 {returnNULL;} while(q->RTag==Link)//遍历左子树最后访问的一个结点,即左子树中最右下的结点。 {q=q->rchild;} return(q);} //后继 BitreeInNext(Bitreep)//遍历右子树时访问的第一个结点。 {Bitreeq; q=p->rchild;//遍历其右子树。 if(p->RTag==Thread) return(p->rchild); if(q==NULL) {returnNULL;} while(q->LTag! =Thread) {q=q->lchild;} return(q); }//InNext //输出前驱和后继值函数。 intTraverse_Thr(BitreeT) { inti=0; Bitreep; p=T->lchild; cout<<"前驱"<<"节点"<<"后继"<<"顶点序号"< while(p! =T)//空树或遍历结束时p==T { while(p->LTag==Link) p=p->lchild;//找中序遍历的第一个点,并输出其前驱和后继。 cout< cout< point[i++]; cout< cout< point[i]=p;//设置point来表示记录的树的情况,便于输入一个数来输出其前驱后继使用。 while(p->RTag==Thread&&p->rchild! =T)//寻找后继结点,并输出其前驱和后继。 { p=p->rchild;//p=其右继。 cout< cout< point[i++]; cout< cout< point[i]=p; } p=p->rchild; }//while returni; } 四、 运行结果及分析 以先序遍历次序来输入二叉树,#代表其左子树或者右子树为空。 五、设计心得体会 通过这次设计,熟悉了线索二叉树的基本理念和算法,铜过深究线索二叉树的图例,进行了算法的编写,很有本题看着挺简单,但是算法写读起来却比较绕,稍微不留神就会出错,所以经过多次修改才得以成功,在算法方面有了很大的提高。 设计题目: 三 宿舍管理查询软件 一、题目要求 为宿舍管理人员编写一个宿舍管理查询软件,程序设计要求: (1)采用交互工作方式 (2)可以增加、删除、修改信息 (3)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(选择、快速排序、堆排序等任选一种) (4)查询: a.按姓名查询;b.按学号查询;c按房号查询 (5)打印任一查询结果(可以连续操作) 要求: 上述查询功能中,学号、房号用折半查找,姓名查找用哈希查找。 二、概要设计 建立学生宿舍信息的结构体,对其进行各种操作,学号,房号用折半查找,折半查找则是先找其中间值进行比较,大了则再与前一半比,小了就和后一半比。 姓名用哈希查找,哈希查找则需要先对姓名进行转换,用一个数组来记录姓名字符,对其进行查找。 排序进行用的是快速排序,每趟过后关键字会把信息分为两半,一半比其小,一半比其大,经过n趟后,就形成了有序的序列。 三、主要代码及分析 1、折半查找 //学号折半查找 intSearch_Bin_num(intnum) { intlow=1,mid,high=student_num; while(low<=high) { mid=(low+high)/2; if(num==s[mid].num)//与中间的信息比,相等则直接输出。 {cout<<"姓名: "< "< "< returnmid;} else if(num high=mid-1; elselow=mid+1;//大于中间数,则low变。 } cout<<"不存在该学生"< 2、哈希查找 //哈希表 intHash(intnum) { returnnum%(student_num+30); } voidInitHashTable() { for(inti=0;i<(student_num+30);i++) shash[i].name=NULLKEY; } voidInsertHashTable() { intaddr; char*pstr; for(inti=1;i<=student_num;i++) { s[i].name; pstr=(char*)malloc(sizeof(s[i].name.length())+1); strcpy(pstr,s[i].name.c_str()); addr=Hash(pstr[0]+pstr[1]);//pstr指代姓名的字符信息。 while(shash[addr]pare(NULLKEY)! =0)//判断哈希表该位置是否为空位,若不是,则进行线性探测。 addr=(addr+1)%(student_num+30); shash[addr]=s[i];//将信息插入哈希表中。 free(pstr); } } intSearchHash() { stringname; cout<<"请输入查找的姓名: "; cin>>name; intaddr; char*pstr; pstr=(char*)malloc(name.length()+1); strcpy(pstr,name.c_str()); addr=Hash(pstr[0]+pstr[1]);//直接确定索要查找的信息在哈希表中的位置。 free(pstr); while(shash[addr]pare(NULLKEY)! =0) { if(shash[addr]pare(name)==0) { cout<<"姓名: "< "< "< return1; } else addr=(addr+1)%(student_num+30); } cout<<"不存在此学生的信息"< return0; } 3、快速排序 //按学号快速排序 intPartition_num(intlow,inthigh) { intpivotkey; s[0]=s[low]; pivotkey=s[low].num;//记录关键字。 while(low { while(low high--; s[low]=s[high];//从右向左搜索 while(low low++; s[high]=s[low]; } s[low]=s[0]; returnlow; } voidQSort_num(intlow,inthigh) { intpivotloc; if(low { pivotloc=Partition_num(low,high); QSort_num(low,pivotloc-1);//低子表进行递归排序 QSort_num(pivotloc+1,high);//低高表进行递归排序 } } 四、运行结果及分析 录入学生信息 浏览学生信息 五、设计心得体会 通过这次实验,我掌握了一些基本的查找和排序方法,除了最简单的顺序查找,冒泡排序外,还学会了一些,比如哈希表,折半查找,快速排序等,增长了我的知识。 设计题目: 四 最小生成树问题 一、题目要求 若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。 如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 【系统要求】 1.利用克鲁斯卡尔算法求网的最小生成树。 2.利用普里姆算法求网的最小生成树。 3.要求输出各条边及它们的权值。 二、概要设计 根据两种算法的不同特点,对其设置了不同的结构体,结构体里面包含的变量不通,分别来实现其功能。 克鲁斯卡尔是先选定一个点,然后找和这个点相邻最近的一个点,然后将这个点也加进一个集,再从这两个点中找权值最小的一个边,将该边的另一个点也加入集,依此类推,找出最权值最小的连通的路径。 普里姆算法则是先从所有的边里面找出权值最小的边,然后将该边的两个顶点入集,再从除了那个边外的所有边中挑选权值最小的边,并且该边的两个顶点都不能被访问过,若被访问过,则标记该边也是被访问过。 依此类推,找出权值最小的连通的路径。 三、主要代码及分析 1、结构体的设定 structfuzhuarray//定义辅助数组结构 { intadjvex; intlowcost; }; structkelusi { intL; stringLN; intR; stringRN; intlowcost; }; 2、克鲁斯卡尔算法 if(state>=graph1.vexnum-1) { intk=1;//初始化从第一个结点开始建立生成树 intkk=0;//记录当前最小权值。 for(inti=1;i<=graph1.vexnum;i++)//辅助数组初始化 { if(i! =k) { closedge[i].adjvex=1; closedge[i].lowcost=graph1.arcs[k][i]; } } closedge[k].lowcost=0; for(intj=1;j { kk=maxnum; for(i=2;i<=graph1.vexnum;i++)//找到当前最小权值 { if(closedge[i].lowcost! =0) { kk=(kk kk: closedge[i].lowcost; } } for(i=2;i<=graph1.vexnum;i++)//定位最小权值所在的结点位置 { if(closedge[i].lowcost==kk) { k=i; break; } } cout<<"<"< "< closedge[k].lowcost=0;//标志该结点已被找到 for(intm=2;m<=graph1.vexnum;m++)//对其他节点的连入结点及最小连入权值进行修改 { if(graph1.arcs[k][m] { closedge[m].adjvex=k; closedge[m].lowcost=graph1.arcs[k][m]; } } } cout< } else { cout<<"输入错误! "< } 3.普里姆算法 if(state>=graph1.vexnum-1) { intacrvisited[100];//标记被访问过还是未被访问。 未被访问是0.访问过是100. inti,j,k=0; for(i=1;i<=graph1.vexnum;++i) for(j=i+1;j<=graph1.vexnum;++j) { if(graph1.arcs[i][j]! =-1) {Klusi[k].R=i; Klusi[k].RN=graph1.vexs[i]; Klusi[k].L=j; Klusi[k].LN=graph1.vexs[j]; Klusi[k].lowcost=graph1.arcs[i][j]; ++k; } } intx,y,m,n;//x,y记录当前最小权值的起点和终点。 intbuf,edf; for(i=0;i<=graph1.arcnum;++i) acrvisited[i]=0; for(j=0;j<=graph1.arcnum;++j) {m=1000000; for(i=0;i! =graph1.arcnum;++i) { if(Klusi[i].lowcost {m=Klusi[i].lowcost; x=Klusi[i].R;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 实验 报告