数据结构课设报告.docx
- 文档编号:9533168
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:50
- 大小:1.42MB
数据结构课设报告.docx
《数据结构课设报告.docx》由会员分享,可在线阅读,更多相关《数据结构课设报告.docx(50页珍藏版)》请在冰豆网上搜索。
数据结构课设报告
《数据结构》课程设计报告
一、设计目的
《数据结构》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
二、设计要求
1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。
3、本次课程设计按照教学要求需要在三周时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、编程语言任选。
一〉.基础类题目
1.猴子选大王(*)
任务:
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1--m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
(注:
分别顺序存储结构和链式存储实现)
输入数据:
输入m,n。
m,n为整数,n 输出形式: 中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能 ㈠、数据结构与核心算法的设计描述 链式存储实现: #include #include #include typedefstructLNode{ intdata; structLNode*next; }LNode,*LinkList; voidCreateList(LinkList&L,intm)//尾插法建立单向循环链表 intListDetele(LinkList&q,intn)//删除被点到的猴子 ㈡、程序调试及运行结果分析 ㈢、程序清单 #include #include #include typedefstructLNode{ intdata; structLNode*next; }LNode,*LinkList; voidCreateList(LinkList&L,intm) {//尾插法建立单向循环链表 inti; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; LNode*r; r=L; for(i=1;i<=m;i++) { LNode*p; p=(LinkList)malloc(sizeof(LNode)); p->data=i; r->next=p; r=p; } r->next=L->next; } intListDetele(LinkList&q,intn) { LinkLists; intj=1; while(q->next! =q) {while(j<=n-1) { q=q->next; j++; } s=q->next; q->next=s->next; free(s); j=1; } cout<<"猴王: "< return1; } voidmain() { LinkListq; intn,m; cout<<"输入猴子个数m和n: "; cin>>m>>n; CreateList(q,m); ListDetele(q,n); } 顺序存储结构: ㈠、数据结构与核心算法的设计描述 #include voidmain() { intn,m; cout<<"输入猴子数m和报数n: "; cin>>m>>n; int*a=newint[m]; inti,sum=0,count=m;//存剩余猴子数 for(i=0;i a[i]=1; i=0; while(i<=m) { if(i==m) i=0;//当i=n时,循环回去 sum+=a[i]; if(sum==n)//当报到n时 { sum=a[i]=0;//淘汰倒霉猴子;即赋0 count--;//剩余猴子数-1 if(count==1) break;//剩1只时结束 } i++; } for(i=0;i if(a[i]! =0) cout<<"猴王是"< delete[]a; } ㈡、程序调试及运行结果分析 2.线索二叉树(**) 任务: 1.建立中序线索二叉树,并且中序遍历; 2.求中序线索二叉树上已知结点中序的前驱和后继; ㈠、数据结构与核心算法的设计描述 #include #include #include #defineMAX100 typedefenumPointerTag{Link,Thread};//Link==0: 指针,Thread==1: 线索 typedefstructBitNode { chardata; structBitNode*lchild,*rchild;//左右孩子的指针 PointerTagLTag,RTag;//左右标志 }BitNode,*Bitree; Bitreepre=NULL; Bitreepoint[MAX+1]; intCreatBiTree(Bitree&T) //先序创建二叉树 voidInThreading(Bitreep)/ /中序遍历线索化二叉树 intInOrderThreading(Bitree&Thrt,BitreeT) //中序遍历线索化二叉树T,并将其中序线索化,Thrt指向头节点 BitreeInPre(Bitreep)//前驱 BitreeInNext(Bitreep)//后继 intTraverse_Thr(BitreeT)//各个节点的前驱和后继 ㈡、程序调试及运行结果分析 ㈢、程序清单 #include #include #include #defineMAX100 typedefenumPointerTag{Link,Thread};//Link==0: 指针,Thread==1: 线索 typedefstructBitNode { chardata; structBitNode*lchild,*rchild;//左右孩子的指针 PointerTagLTag,RTag;//左右标志 }BitNode,*Bitree; Bitreepre=NULL; Bitreepoint[MAX+1]; intCreatBiTree(Bitree&T)//先序创建二叉树 {//该节点非空返回1,双亲节点对应标志Link, //空时返回0,双亲节点对应标志应为Thread charch; cout<<"输入结点元素(#表示空): "; cin>>ch; if(ch=='#') { T=NULL; return0; } else { if(! (T=(BitNode*)malloc(sizeof(BitNode)))) { cout<<"存储分配失败"< exit (1); } T->data=ch; if(CreatBiTree(T->lchild)) T->LTag=Link; else T->LTag=Thread; if(CreatBiTree(T->rchild)) T->RTag=Link; else T->RTag=Thread; } return1; } 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; pre->RTag=Thread;//最后一个结点的线索化 Thrt->rchild=pre; } return1; } BitreeInPre(Bitreep)//前驱 { Bitreeq; q=p->lchild; if(p->LTag==Thread) 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); } intTraverse_Thr(BitreeT) { inti=0; Bitreep; p=T->lchild; cout<<"1--代表是,0--代表否"< cout<<"是否有"<<"前驱"<<"节点"<<"是否有"<<"后继"<<"顶点序号"< cout<<"前驱"<<""<<"节点"<<"后继"<<""< while(p! =T)//空树或遍历结束时p==T { while(p->LTag==Link) p=p->lchild;//找开始结点 cout< if(p->LTag==Thread) { cout< } else cout<<""; cout< point[i++]; cout< if(p->RTag==Thread) cout< else cout<<""; cout< while(p->RTag==Thread&&p->rchild! =T)//寻找后继结点 { p=p->rchild; cout< if(p->LTag==Thread) { cout< } else cout<<""; cout< point[i++]; cout< if(p->RTag==Thread) cout< else cout<<""; cout< point[i]=p; } p=p->rchild; } returni; } intmain() { BitreeT,Thrt,prenode,Nextnode; intn,index; charstr; cout<<"先序创建二叉树"< CreatBiTree(T); cout< InOrderThreading(Thrt,T); n=Traverse_Thr(Thrt); do{ cout<<"请输入你要查找节点的序号(按中序输出时的序号)"< cin>>index; if(index<0||index>n) { cout<<"请输入数的序号大于0并小于等于节点数"< return0; } prenode=InPre(point[index]); Nextnode=InNext(point[index]); if(point[index]->LTag==Thread) cout<<"你要查找第"< else cout<<"你要查找第"< if(point[index]->RTag==Thread) cout<<"你要查找第"< else cout<<"你要查找第"< cout<<"你是否要继续? y--是;n--否"< cin>>str; }while(str=='Y'||str=='y'); return0; } 3.宿舍管理查询软件(**) 任务: 为宿舍管理人员编写一个宿舍管理查询软件,程序设计要求: (1)采用交互工作方式 (2)可以增加、删除、修改信息 (3)建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(选择、快速排序、堆排序等任选一种) (4)查询: a.按姓名查询;b.按学号查询;c按房号查询 (5)打印任一查询结果(可以连续操作) ㈠、数据结构与核心算法的设计描述 #include #include #include #defineMAXSIZE100 intn; typedefstruct//学生结构体的定义 { intnum;//学号 charname[10];//姓名 charroom[10];//房号 }Student; typedefstructSqList//顺序表结构体的定义 { StudentStu[MAXSIZE+1];//定义一个存放学生信息的数组 }SqList; voidCreatInfo(SqList&L)//建立学生信息 voidprint(SqList&L)//输出顺序表 voidInsertsort(SqList&L)//直接插入排序(房号优先) voidInPut(SqList&L)//添加新的学生信息 intPartition(SqList&L,inti,intj)//快速排序 voidQuicksort(SqListL,intlow,inthigh)//快速排序 voidSelectsort(SqList&L)//选择排序(姓名优先) voidfind(SqList&L,intn)//查找修改学生并打印 ㈡、程序调试及运行结果分析 1.建立学生信息 2.插入学生信息并插入排序(房号优先) 3.选择排序(姓名优先) 4.快速排序 5.查找修改学生并打印 ㈢、程序清单 #include #include #include #defineMAXSIZE100 intn; typedefstruct//学生结构体的定义 { intnum;//学号 charname[10];//姓名 charroom[10];//房号 }Student; typedefstructSqList//顺序表结构体的定义 { StudentStu[MAXSIZE+1];//定义一个存放学生信息的数组 }SqList; voidCreatInfo(SqList&L) { cout<<"请输入你要创建的学生数: "< cin>>n; cout<<"学生的信息: "< cout<<"姓名学号房号: "< for(inti=1;i<=n;i++) { cin>>L.Stu[i].name>>L.Stu[i].num>>L.Stu[i].room; } } voidprint(SqList&L)//输出顺序表 { cout<<"输出学生信息: "< for(inti=1;i<=n;++i) { cout< } } voidInsertsort(SqList&L)//直接插入排序(房号优先) { inti,j; for(i=2;i<=n;++i) if(strcmp(L.Stu[i].room,L.Stu[i-1].room)<0) { L.Stu[0]=L.Stu[i]; for(j=i-1;strcmp(L.Stu[0].room,L.Stu[j].room)<0;--j) L.Stu[j+1]=L.Stu[j]; L.Stu[j+1]=L.Stu[0]; } } voidInPut(SqList&L) { n++; cout<<"输入学生的信息: "< cout<<"姓名学号房号: "< cin>>L.Stu[n].name>>L.Stu[n].num>>L.Stu[n].room; } intPartition(SqList&L,inti,intj)//快速排序 { Studentp; L.Stu[0]=L.Stu[i]; p=L.Stu[i]; while(i { while(i j--; L.Stu[i]=L.Stu[j]; while(i i++; L.Stu[j]=L.Stu[i]; } L.Stu[i]=p; returni; } voidQuicksort(SqListL,intlow,inthigh)//快速排序 { intlocation; if(low { location=Partition(L,low,high); Quicksort(L,low,location-1);//对左区间递归排序 Quicksort(L,location+1,high);//对右区间递归排序 } } voidSelectsort(SqList&L)//选择排序(姓名优先) { Studentt; inti,j,k; for(i=1;i<=n;i++) { k=i; for(j=i+1;j<=n;j++) if(strcmp(L.Stu[j].name,L.Stu[k].name)<0) k=j; if(k! =i) { t=L.Stu[i]; L.Stu[i]=L.Stu[k]; L.Stu[k]=t; } } } voidfind(SqList&L,intn)//查找学生信息 { intt,m=1,i; charch,a; cout<<"请输入你要查找的学号: "< cin>>t; cout<<"该学生的信息为: "< while(m<=n&&L.Stu[m].num! =t) m++; if(L.Stu[m].num==t) { cout<<"学号是: "< "< "< cout<<"是否修改信息(Y/N): "; cin>>a; if(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 报告