数据结构课程设计.docx
- 文档编号:7304721
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:27
- 大小:149.22KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
《数据结构与算法》
课程设计
目录
第一部分:
课程设计题目要求
第二部分:
设计内容及结果展示
第三部分:
设计体会
计算机科学系2011年《数据结构与算法》课程设计题目
1.用单链表构造并实现多项式加、减法程序;并完成下列算式:
f1(x)=5x4+3x3-2x2+7x+1
f2(x)=5x3-10x2+2x-20
2.实现二叉树深度优先周游非递归前序和中序算法,并且自我构造一颗二叉树进行验证。
3.实现图的邻接表表示程序,在此基础上,实现图的深度(DFS)和广度优先算法(BFS),并且用一个实例进行验证。
4.编制一个演示内部排序算法比较的程序。
采用快速排序、希尔排序和堆排序进行比较对输入的数字序列进行排序。
A.输入:
排序方法选择,由键盘或文件输入待排序表的表长。
B.输出:
在不同输入情况下和不同排序方法关键字参加的比较次数和关键字的移动次数,列表显示。
5.编写一个串类完成:
两个字符串的连接、字符串的复制、字符串的比较、求字符串长度、取子串、串的替换等六个基本函数。
同时,以实例验证各个函数的功能。
设计内容及结果展示
1.用单链表构造并实现多项式加、减法程序;并完成下列算式:
f1(x)=5x4+3x3-2x2+7x+1
f2(x)=5x3-10x2+2x-20
()
算法
voidcreatlist(list&L,intn)
{
listp;
L=newlink;
L->next=NULL;
cout<<"pleaseinput"< "< for(inti=0;i { p=newlink; cin>>p->sign>>p->time; p->next=L->next; L->next=p; } } voiddisplay(listL) { link*p=L->next; while(p! =NULL) { cout< p=p->next; } } voidplayadd(lista,listb) { listp,q,r,s; intx; p=a->next;q=b->next; s=a; while((p! =NULL)&&(q! =NULL)) { if(p->time { r=q->next; q->next=p; s->next=q; s=q;q=r; } elseif(p->time>q->time) { s=p; p=p->next; } else { x=p->sign+q->sign; if(x! =0) { p->sign=x; s=p; } else { s->next=p->next; free(p); } p=s->next; r=q; q=q->next; free(r); } } if(q! =NULL) s->next=q; free(b); } 运行结果: 2.实现二叉树深度优先周游非递归前序和中序算法,并且自我构造一颗二叉树进行验证。 () 算法 voidInit() { memset(node,-1,sizeof(node)); memset(built,0,sizeof(built)); error=false; } voidBuild_Binary_Tree(intn) { cout<<"请按层序依次输入每一个结点及其左儿子,右儿子的数据域的值。 若该结点没有左儿子,右儿子,则相应地输入-1"; for(i=1;i<=n;++i) { cin>>father_data>>left_child_data>>right_child_data; if(father_data==-1) { error=1; return; } if(i==1) { built[1]=true; node[i].data=father_data; if(left_child_data! =-1){ node[i].left=idx=LEFT(i); node[idx].data=left_child_data; } if(right_child_data! =-1) { node[i].right=idx=RIGHT(i); node[idx].data=right_child_data; } }else{ for(j=2;j =father_data||built[j]);++j); if(j>=maxn){ error=true; return; } built[j]=true; }built[j]=true; if(left_child_data! =-1){ node[j].left=idx=LEFT(j); node[idx].data=left_child_data; } if(right_child_data! =-1){ node[j].right=idx=RIGHT(j); node[idx].data=right_child_data; } } } voidPreTraversal(inti) { top=0; while(top||i! =-1){ if(i! =-1){ printf("%d",node[i].data); stack[top++].num=i; i=node[i].left; }else{ i=stack[--top].num; i=node[i].right; } } } voidInTraversal(inti) { top=0; while(top||i! =-1){ if(i! =-1){ stack[top++].num=i; i=node[i].left; }else{ i=stack[--top].num; printf("%d",node[i].data); i=node[i].right; }}} 运行结果: 3.实现图的邻接表表示程序,在此基础上,实现图的深度(DFS)和广度优先算法(BFS),并且用一个实例进行验证。 () 算法: voidIniQueue(LinkQueue&Q) { Q.rear=Q.front=newQNode; Q.front->next=NULL; } voidEnQueue(LinkQueue&Q,inte) { QueuePtrp=newQNode; p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; } boolDeQueue(LinkQueue&Q,int&e) { QueuePtrp; if(Q.front==Q.rear) returnERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete(p); returnOK; } boolQueueEmpty(LinkQueueQ) { if(Q.rear==Q.front) return1; else return0; } intLocateVex(AlGraph&G,charv) { inti=0; while((i =v)) i++; if(i returni; else return-1; } boolCreateDG(AlGraph&G) { cout<<"请输入顶点数: "; cin>>G.Vexnum; cout<<"请输入弧数: "; cin>>G.arcnum; cout<<"请输入各顶点的信息"< for(inti=0;i { cin>>G.vertices[i].data; G.vertices[i].firstarc=NULL; } for(intk=1;k<=G.arcnum;k++) { charv1,v2; cout<<"分别输入弧尾和弧头: "; cin>>v1>>v2; inti=LocateVex(G,v1); intj=LocateVex(G,v2); if(i<0||j<0) returnERROR; ArcNode*p; p=newArcNode; p->adjvex=j; if((G.vertices[i].firstarc==NULL)||(G.vertices[i].firstarc->adjvex>j)) { p->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p; } else {ArcNode*q; q=G.vertices[i].firstarc; while(q->nextarc&&(q->nextarc->adjvex q=q->nextarc; p->nextarc=q->nextarc; q->nextarc=p; } } returnOK; } boolvisited[MAX]; voidDFS(AlGraph&G,intv) { visited[v]=true; cout< ArcNode*p=G.vertices[v].firstarc; while(p) { if(! visited[p->adjvex]) DFS(G,p->adjvex); p=p->nextarc; } } voidDFStraverse(AlGraph&G) { for(intm=0;m visited[m]=false; for(intn=0;n if(! visited[n]) DFS(G,n); } voidBFSTraverse(AlGraph&G) { for(intv=0;v visited[v]=false; LinkQueueQ; IniQueue(Q); for(intv=0;v { if(! visited[v] ) { visited[v]=true; cout< EnQueue(Q,v); while(! QueueEmpty(Q)) { intu; DeQueue(Q,u); ArcNode*p=G.vertices[u].firstarc; while(p) { if(! visited[p->adjvex]) { visited[p->adjvex]=true; cout< EnQueue(Q,p->adjvex); } p=p->nextarc; } }}}} 运行结果: 4.编制一个演示内部排序算法比较的程序。 采用快速排序、希尔排序和堆排序进行比较对输入的数字序列进行排序。 A.输入: 排序方法选择,由键盘或文件输入待排序表的表长。 B.输出: 在不同输入情况下和不同排序方法关键字参加的比较次数和关键字的移动次数,列表显示。 () 算法: voidswap(int*a,int*b) { inttemp; temp=*a; *a=*b; *b=temp; } voidquicksort(intk[],ints,intt) { inti,j; if(s { i=s; j=t+1; while (1) { doi++; while(! (k[s]>=k[i]||i==t)); doj--; while(! (k[s]<=k[j]||j==s)); if(i swap(&k[i],&k[j]); else break; } swap(&k[s],&k[j]); quicksort(k,s,j-1); quicksort(k,j+1,t); } } voidshellsort(intk[],intn) { inti,j,flag,gap=n; inttemp; while(gap>1) { gap=gap/2; do { flag=0; for(i=0;i<=n-gap;i++) { j=i+gap; if(k[i] { temp=k[i]; k[i]=k[j]; k[j]=temp; flag=1; } } } while(flag! =0); } } voidprintsort(intk[],intlen) { inti; for(i=0;i printf("%d",k[i]); printf("\n"); } voidsift(int*x,intn,ints) { intt,k,j; t=*(x+s); k=s; j=2*k+1; while(j { if(j ) {j++; } if(t<*(x+j)) { *(x+k)=*(x+j); k=j; j=2*k+1; } else { break; } } *(x+k)=t; } voidheap_sort(int*x,intn) { inti,k,t; int*p; for(i=n/2-1;i>=0;i--) { sift(x,n,i); } for(k=n-1;k>=1;k--) { t=*(x+0); *(x+0)=*(x+k); *(x+k)=t; sift(x,k,0); } } intmain() { inti,len,ran; int*a; intselDo; printf("输入数组的长度"); scanf("%d",&len); a=(int*)malloc(sizeof(int)*len); srand(time(NULL)); for(i=0;i { ran=rand()%1000; a[i]=ran; } printf("Theorginaldataarrayis\n"); for(i=0;i printf("%d",a[i]); printf("输入要选择的排序方式: "); printf("\n1-快速排序\t2-希尔排序\t3-堆排序\t0-退出\n"); do{ scanf("%d",&selDo); switch(selDo) { case1: quicksort(a,0,len); printf("\nTheresultofquicksortis\n"); printsort(a,len); break; case2: shellsort(a,len); printf("\nTheresultofshellsortis\n"); printsort(a,len); break; case3: heap_sort(a,len); printf("\nTheresultofheapsortis\n"); printsort(a,len); break; } } while(selDo! =0); return0; } 运行结果: 5.编写一个串类完成: 两个字符串的连接、字符串的复制、字符串的比较、求字符串长度、取子串、串的替换等六个基本函数。 同时,以实例验证各个函数的功能。 () 算法: friendvoidCompare(Stringtemp1,Stringtemp2) { inta,b,i=0; a=temp1.Length(); b=temp2.Length(); if(a>b)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)