#数据结构课程设计Word下载.docx
- 文档编号:20213404
- 上传时间:2023-01-19
- 格式:DOCX
- 页数:29
- 大小:109.17KB
#数据结构课程设计Word下载.docx
《#数据结构课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《#数据结构课程设计Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
第一步建立数组,填入猴子编号及猴子出局时报的数第二步从第一个猴子报数第三步数到m让指针指向元素变为0第四步继续报数,重复第三步2、概要设计1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
2.以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
3.掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
4.通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
3、详细设计线性表之顺序表:
#include#defineMaxSize100voidjose(intn,intm)intmonMaxSize;
inti,d,count;
for(i=0;
in;
i+)moni=i+1;
printf(出队前:
);
i+)printf(%dt,moni);
printf(n);
printf(出队序列:
count=0;
i=-1;
while(countn)d=0;
while(dm)i=(i+1)%n;
if(moni!
=0)d+;
printf(%dt,moni);
moni=0;
count+;
voidmain()intn,m;
printf(输入猴子数!
n);
scanf(%d,&
printf(输入报号退出数!
m);
jose(n,m);
线性表之链表:
#include#includetypedefstructnodeintdata;
structnode*next;
linklist;
intmain()inti,n,k,m,total;
linklist*head,*p,*s,*q;
printf(请输入猴子的个数:
printf(请输入要从第几个猴子开始报数:
k);
printf(请输入出局数字:
head=(linklist*)malloc(sizeof(linklist);
p=head;
p-data=1;
p-next=p;
for(i=2;
idata=i;
s-next=p-next;
p-next=s;
p=p-next;
for(i=1;
inext;
total=n;
printf(n出局序列为:
q=head;
while(total!
=1)for(i=1;
printf(%d,p-data);
while(q-next!
=p)q=q-next;
q-next=p-next;
s=p;
free(s);
total-;
printf(nn猴子大王为第%d号nn,p-data);
free(p);
4、调试分析线性表之顺序表:
四、项目二:
建立二叉树,层序、先序遍历1、需求分析二叉树是形象的说既树中每个节点最多只有两个分支,它是一个重要的数据类型。
可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表。
二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。
以及能够从输入的数据中得知二叉树的叶子节点的个数,二叉树的深度。
在此,二叉树的每一个结点中必须包括:
值域,左指针域,右指针域。
2、概要设计1.熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现;
2.重点掌握二叉树的生成、遍历及求深度等算法;
3.掌握哈夫曼树的含义及其应用。
4.掌握运用递归方式描述算法及编写递归C程序的方法,提高算法分析和程序设计能力。
3、详细设计#includestdio.h#includestring.h#includestdlib.h#defineNULL0typedefstructBiTNodechardata;
structBiTNode*lchild,*rchild;
BiTNode,*BiTree;
BiTreeCreate(BiTreeT)charch;
ch=getchar();
if(ch=&
)T=NULL;
elseif(!
(T=(BiTNode*)malloc(sizeof(BiTNode)printf(Error!
T-data=ch;
T-lchild=Create(T-lchild);
T-rchild=Create(T-rchild);
returnT;
voidPreorder(BiTreeT)if(T)printf(%c,T-data);
Preorder(T-lchild);
Preorder(T-rchild);
intSumleaf(BiTreeT)intsum=0,m,n;
if(T)if(!
T-lchild)&
(!
T-rchild)sum+;
m=Sumleaf(T-lchild);
sum+=m;
n=Sumleaf(T-rchild);
sum+=n;
returnsum;
voidzhongxu(BiTreeT)if(T)zhongxu(T-lchild);
printf(%c,T-data);
zhongxu(T-rchild);
voidhouxu(BiTreeT)if(T)houxu(T-lchild);
houxu(T-rchild);
intDepth(BiTreeT)intdep=0,depl,depr;
if(!
T)dep=0;
elsedepl=Depth(T-lchild);
depr=Depth(T-rchild);
dep=1+(depldepr?
depl:
depr);
returndep;
intmain()BiTreeT;
intsum,dep;
printf(键盘输入:
T=Create(T);
printf(先序:
Preorder(T);
printf(中序:
zhongxu(T);
printf(后序:
houxu(T);
sum=Sumleaf(T);
printf(和:
printf(%dn,sum);
dep=Depth(T);
printf(深度:
printf(%dn,dep);
return0;
4、调试分析五、项目三:
拓扑排序1、需求分析编写函数实现图的拓扑排序2、概要设计由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
(1)选择一个入度为0的顶点并输出之;
(2)从网中删除此顶点及所有出边。
循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。
3、详细设计#include#include#defineM30intaMM,n;
voidtopo()inti,j,x;
intinM,ansM,an;
/统计入度,最后答案,答案尺寸intqM,qh,qt;
/0入度点的队列memset(in,0,sizeof(in);
an=0;
/统计入度for(i=0;
i+)for(j=0;
jn;
j+)if(aij!
=0)/假定aij=0为无边相连inj+;
/入度为0的点先入队qh=0;
qt=0;
i+)if(ini=0)qqt=i;
qt+;
/拓扑for(i=0;
i+)if(qh=qt)/队列为空,说明剩余点都不是入度为0的点break;
x=qqh;
qh+;
/取队头ansan=x;
an+;
/记录答案for(j=0;
j+)if(axj!
=0)/该点指向的边都减去一个入度inj-;
if(inj=0)/入队qqt=j;
if(ann)/答案没有取所有点,说明没有拓扑序printf(unsolven);
elsefor(i=0;
ian;
i+)printf(%d,ansi);
voidmain()inti,j;
memset(a,0,sizeof(a);
j+)scanf(%d,&
aij);
topo();
4、调试分析六、项目四:
单独实现各种排序1、需求分析
(1)熟练掌握C语言的基本知识和技能;
(2)掌握各种排序(插入、冒泡,快速排序,简单选择,堆排序)方法及适用场合,并能在解决实际问题时灵活应用;
(3)从空间和时间的角度分析各种排序;
(4)培养分析、解决问题的能力2、概要设计单独实现各种排序3、详细设计
(1)直接插入排序#includeusingnamespacestd;
intmain()inta=98,76,109,34,67,190,80,12,14,89,1;
intk=sizeof(a)/sizeof(a0);
intj;
printf(直接插入排序之前的顺序:
for(intn=0;
nk;
n+)coutan;
for(inti=1;
ik;
i+)/循环从第2个元素开始if(ai=0&
ajtemp;
j-)aj+1=aj;
aj+1=temp;
/此处就是aj+1=temp;
printf(nn直接插入排序后的顺序:
for(intf=0;
fk;
f+)coutaf;
printf(nn);
(2)折半插入排序#includeusingnamespacestd;
voidBinaryInsertSort(int*a,intleft,intright)inttmp;
inti,low,high,middle,k;
for(i=left+1;
i=right;
i+)tmp=ai;
low=left;
high=i-1;
while(low=high)middle=(low+high)/2;
if(tmp=low;
k-)ak+1=ak;
alow=tmp;
voidmain()inta=98,76,109,34,67,190,80,12,14,89,1;
printf(折半插入排序之前的顺序:
BinaryInsertSort(a,0,k);
printf(n折半插入排序后的顺序:
for(inti=0;
i+)coutai;
coutendl;
(3)希尔排序#includeusingnamespacestd;
voidshellsort(inta,intn)inti,j,gap;
for(gap=n/2;
gap0;
gap/=2)/步长for(i=0;
igap;
i+)/直接插入排序for(j=i+gap;
jn;
j+=gap)if(aj=0&
aktemp)ak+gap=ak;
k-=gap;
ak+gap=temp;
inti;
printf(希尔排序之前的顺序:
shellsort(a,k);
printf(n希尔排序之后的顺序:
(4)冒泡排序#includeusingnamespacestd;
inti,j,t;
printf(冒泡排序之前的顺序:
jaj+1)t=aj+1;
aj+1=aj;
aj=t;
printf(n冒泡排序后的顺序:
(5)快速排序#includeusingnamespacestd;
voidquickSort(inta,int,int);
intmain()intarray=98,76,109,34,67,190,80,12,14,89,1,k;
intlen=sizeof(array)/sizeof(int);
cout快速排序之前的顺序:
endl;
for(k=0;
klen;
k+)coutarrayk;
quickSort(array,0,len-1);
cout快速排序之后的顺序:
voidquickSort(ints,intl,intr)if(lr)inti=l,j=r,x=sl;
while(ij)while(i=x)/从右向左找第一个小于x的数j-;
if(ij)si+=sj;
while(ij&
six)/从左向右找第一个大于等于x的数i+;
if(ij)sj-=si;
si=x;
quickSort(s,l,i-1);
/递归调用quickSort(s,i+1,r);
(6)直接选择排序#includeusingnamespacestd;
voidSelectSort(int*a,intlen)for(inti=0;
ilen-1;
i+)intk=i;
intkey=ai;
for(intj=i+1;
jlen;
j+)if(ajkey)k=j;
key=aj;
if(k!
=i)swap(ai,ak);
printf(直接选择排序之前的顺序:
SelectSort(a,k);
printf(n直接选择排序之后的顺序:
(7)堆排序#include#includeusingnamespacestd;
/array是待调整的堆数组,i是待调整的数组元素的位置,nlength是数组的长度/本函数功能是:
根据数组array构建大根堆voidHeapAdjust(intarray,inti,intnLength)intnChild;
intnTemp;
for(;
2*i+1nLength;
i=nChild)/子结点的位置=2*(父结点位置)+1nChild=2*i+1;
/得到子结点中较大的结点if(nChildarraynChild)+nChild;
/如果较大的子结点大于父结点那么把较大的子结点往上移动,替换它的父结点if(arrayi=0;
-i)HeapAdjust(array,i,length);
/从最后一个元素开始对序列进行调整,不断的缩小调整的范围直到第一个元素for(i=length-1;
i0;
-i)/把第一个元素和当前的最后一个元素交换,/保证当前的最后一个位置的元素都是在现在的这个序列之中最大的arrayi=array0arrayi;
array0=array0arrayi;
arrayi=array0arrayi;
/不断缩小调整heap的范围,每一次调整完毕保证第一个元素是当前序列的最大值HeapAdjust(array,0,i);
intmain()inti;
intnum=98,76,109,34,67,190,80,12,14,89,1;
intk=sizeof(num)/sizeof(num0);
printf(堆排序之前的顺序:
n+)coutnumn;
HeapSort(num,k);
printf(n堆排序后的顺序:
i+)printf(%d,numi);
(7)归并排序#includeusingnamespacestd;
voidmerge(int*data,intp,intq,intr)intn1,n2,i,j,k;
int*left=NULL,*right=NULL;
n1=q-p+1;
n2=r-q;
left=(int*)malloc(sizeof(int)*(n1);
right=(int*)malloc(sizeof(int)*(n2);
in1;
i+)/对左数组赋值lefti=datap+i;
for(j=0;
jn2;
j+)/对右数组赋值rightj=dataq+1+j;
i=j=0;
k=p;
while(in1&
jn2)/将数组元素值两两比较,并合并到data数组if(lefti=rightj)datak+=lefti+;
elsedatak+=rightj+;
i+)/如果左数组有元素剩余,则将剩余元素合并到data数组datak+=lefti;
j+)/如果右数组有元素剩余,则将剩余元素合并到data数组datak+=rightj;
voidmergeSort(int*data,intp,intr)intq;
if(pr)/只有一个或无记录时不须排序q=(int)(p+r)/2);
/将data数组分成两半mergeSort(data,p,q);
/递归拆分左数组mergeSort(data,q+1,r);
/递归拆分右数组merge(data,p,q,r);
/合并数组voidmain()inta=98,76,109,34,67,190,80,12,14,89,1;
printf(归并排序之前的顺序:
mergeSort(a,0,k);
printf(n归并排序之后的顺序:
(8)基数排序#include#includeusingnamespacestd;
voidradixSort(int*a,intsize)inttemp1020=0;
/第一个10表示09,第二个20表示a的sizeintorder10=0;
inti,j,k;
/k表示当前比较的那一位上的具体数字intn;
/n=1,10,100,1000.取决于a中的最大的数intp;
n=1;
while(n=100)for(i=0;
isize;
i+)k=(ai/n)%10;
tempkorderk=ai;
orderk+;
p=0;
/p为一次排序过程中,a的脚标for(i=0;
i10;
i+)if(orderi!
=0)for(j=0;
jorderi;
j+)ap=tempij;
p+;
orderi=0;
n*=10;
printf(基数排序之前的顺序:
radixSort(a,k);
printf(n基数排序之后的顺序:
4、调试分析七、结论及体会本次的数据结构课程设计针对具体的实际项目来进行需求分析,测试计划,概要设计,详细设计,测试分析等具体的步
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)