当前位置:文档之家› 数据结构课程设计报告书

数据结构课程设计报告书

数据结构课程设计学院名称:计算机工程学院专业:信息管理与信息系统班级:姓名:年月日《数据结构》课程设计任务书学院计算机工程学院系部信息与软件工程系年月日《数据结构课程设计》报告一、第一类题目1.问题陈述约瑟夫环问题:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

请设计一个程序求出出列顺序。

2.程序代码#include<stdio.h>#include<malloc.h>int n,m;typedef struct LNode{int num,data;struct LNode *next;}LNode,*LinkList;void List(LinkList &L,int n){LinkList p,q;int i;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;for(i=0;i<n;i++){p=(LinkList)malloc(sizeof(LNode));//建立新的节点p->num=i+1;printf("输入编号为%d的人的密码:",i+1);scanf("%d",&p->data);if(L->next==NULL) L->next=p;//头结点Lelse q->next=p;//前后节点关系建立q=p;} //q为前节点p->next=L->next;}void input(){printf("输入总人数n:");scanf("%d",&n);printf("输入报数上限值m:");scanf("%d",&m);}void output(LinkList L,LinkList p,int m){int i;LinkList q;for(i=1;;i++){q=p;p=p->next;if(i==m){printf("编号为%d的人出列,他的密码%d作为新的m值\n",p->num,p->data);m=p->data;q->next=p->next;q=q->next;free(p);if(q!=p){L->next=q;p=L;}i=0;}if(q==p){printf("编号为%d的人出列,至此所有人出列完毕\n",p->num);free(p);break;}}}main(){LinkList L,p,q;input();List(L,n);p=L;output(L,p,m);}3.运行结果4.设计体会与总结通过此次课程设计,使我更加扎实的掌握了有关数据结构方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。

实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

二、第二类题目1.问题陈述排序综合(限1 人完成)利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。

要求:1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。

并把排序后的结果保存在不同的文件中。

2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

3)如果采用4种或4种以上的方法者,可适当加分。

2.需求分析利用随机函数产生N个随机整数(20000以上),对这些数进行多种方法进行排序。

要求:1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。

并把排序后的结果保存在不同的文件中。

2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

3.概要设计1)用户输入随机数的个数n2)随机数在排序函数作用下进行排序3)程序给出随机数的移动次数yd、比较次数bj、以及排序所用的时间。

4.详细设计1)插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。

2)希尔排序:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。

所有距离为d1的倍数的记录放在同一个组中。

先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所有记录放在同一组中进行直接插入排序为止。

3)起泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。

依此类推,直到第N-1和第N个记录的关键字进行过比较为止。

上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。

然后进行第二趟起泡排序,对前N-1个记录进行同样操作。

一共要进行N-1趟起泡排序。

4)快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。

5.程序代码#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#define MAXSIZE 9999typedef int Keytype;typedef struct{Keytype r[MAXSIZE+1];//储存数值int length;//数组大小}Sqlist;typedef struct{int NumberOfJudgement;//比较次数int NumberOfMovement;//移动次数double time;//排序所用时间}S_time;typedef struct{S_time Sort[4];int n;}Sort_result;/*****************排序结果****************/void print(Sqlist* L){int i;for(i=1;i<=L->length;i++){printf("第%4d个数%-5d|",i,L->r[i]);if(!(i%5))printf("\n");}}/****************插入排序****************/void InsertSort(Sqlist* L,Sort_result* T){int i,j;for(i=2;i<=L->length;++i){T->Sort[0].NumberOfJudgement++;if(L->r[i]<L->r[i-1]){T->Sort[0].NumberOfMovement++;L->r[0]=L->r[i];L->r[i]=L->r[i-1];for(j=i-2;L->r[0]<L->r[j];j--){T->Sort[0].NumberOfJudgement++;T->Sort[0].NumberOfMovement++;L->r[j+1]=L->r[j];}L->r[j+1]=L->r[0];}}}/************希尔排序********************/void ShellInsert(Sqlist* L,int dk,Sort_result* T){int i,j;for(i=dk+1;i<=L->length;i++){T->Sort[1].NumberOfJudgement++;if(L->r[i]<L->r[i-dk]){L->r[0]=L->r[i];for(j=i-dk;j>0&&L->r[0]<L->r[j];j-=dk){T->Sort[1].NumberOfJudgement++;T->Sort[1].NumberOfMovement++;L->r[j+dk]=L->r[j];}L->r[j+dk]=L->r[0];}}}void Shellsort(Sqlist* L,int dlta[],int t,Sort_result* T) {int k;for(k=0;k<t;k++){ShellInsert(L,dlta[k],T);}}//shellsort/***********起泡排序*******************/void Bubblesort(Sqlist* L,Sort_result* T){int i,j,temp;for(i=1;i<=L->length;i++){for(j=i+1;j<=L->length;j++){T->Sort[2].NumberOfJudgement++;if(L->r[i]>L->r[j]){T->Sort[2].NumberOfMovement++;temp=L->r[i];L->r[i]=L->r[j];L->r[j]=temp;}}}}/************快速排序********************/int Partition(Sqlist* L,int low,int high,Sort_result* T) {int pivotkey;L->r[0]=L->r[low];pivotkey=L->r[low];while(low<high){T->Sort[3].NumberOfJudgement++;while(low<high&&L->r[high]>=pivotkey){T->Sort[3].NumberOfJudgement++;--high;}T->Sort[3].NumberOfMovement++;L->r[low]=L->r[high];while(low<high&&L->r[low]<=pivotkey){T->Sort[3].NumberOfJudgement++;++low;}T->Sort[3].NumberOfMovement++;L->r[high]=L->r[low];}L->r[low]=L->r[0];return low;}void Qsort(Sqlist* L,int low,int high,Sort_result* T){int pivotloc;T->Sort[3].NumberOfJudgement++;if(low<high){pivotloc=Partition(L,low,high,T);Qsort(L,low,pivotloc-1,T);Qsort(L,pivotloc+1,high,T);}}void Quicksort(Sqlist* L,Sort_result* T){Qsort(L,1,L->length,T);}/***********选择排序方法*****************/void sort(int* choose,Sqlist* L,Sort_result* T){int i;clock_t start,end;FILE* fp;char sortname[4][50]={"插入排序","希尔排序","起泡排序","快速排序"};char fname[4][50]={"插入排序结果.txt","希尔排序结果.txt","起泡排序结果.txt","快速排序结果.txt"};int dlta[]={5000,2500,1250,625,313,167,79,39,23,1},t=10;//增量序列和数列大小if(*choose!=5){fp=fopen(fname[*choose-1],"w");if(!fp){printf("打开文件失败");exit(1);}}switch(*choose){case 1:{printf("现在开始插入排序\n");start=clock();InsertSort(L,T);end=clock();break;}case 2:{printf("现在开始希尔排序\n");start=clock();Shellsort(L,dlta,t,T);end=clock();break;}case 3:{printf("现在开始起泡排序\n");start=clock();Bubblesort(L,T);end=clock();break;}case 4:{printf("现在开始快速排序\n");start=clock();Quicksort(L,T);end=clock();break;}case 5:{if(T->n==0) printf("请先使用任意一种排序方法再查阅排序方法的信息");elsefor(i=0;i<4;i++){if(T->Sort[i].NumberOfJudgement)printf("%s排序:移动元素次数:%d 判断次数:%d 所用时间:%lf\n",sortname[i],T->Sort[i].NumberOfMovement,T->Sort[i].NumberOfJudge ment,T->Sort[i].time);}}}if(*choose==5) getchar();elseT->Sort[*choose-1].time=(double)(end-start);T->n++;print(L);//显示排序结果for(i=1;i<=L->length;i++){fprintf(fp,"第%4d个数%-5d|",i,L->r[i]);if(!(i%5))fprintf(fp,"\n");}fclose(fp);fp=NULL;getchar();}getchar();*choose=0;}/**************主函数********************/int main(){Sqlist L;//存放待排序数值的数组Sort_result T;//存放排序的比较次数和移动次数int i,a,choose=0,arr[MAXSIZE+1];// choose功能选择srand(time(NULL));printf("请输入需要排序的数字个数:");scanf("%d",&a);L.length=a;//取1-9999的随机数printf("==========================\n");printf("要排列%d个整数\n",L.length);printf("==========================\n");getchar();for(i=1;i<=L.length;i++)//生成N个随机数{L.r[i]=rand()%10000+1;}for(i=1;i<=L.length;i++)//把随机数组放到备份数组中{arr[i]=L.r[i];}for(i=1;i<=L.length;i++){printf("第%4d个数%-5d|",i,L.r[i]);if(!(i%5))printf("\n");getchar();for(i=0;i<4;i++)//初始化排序的比较次数和移动次数{T.Sort[i].NumberOfJudgement=0;T.Sort[i].NumberOfMovement=0;}T.n=0;for(;;){for(;choose<1||choose>6;){system("cls");printf("========================================================= =======================\n");printf("1.插入排序 2.希尔排序 3.起泡排序 4.快速排序 5.显示已使用排序方法的信息 6.退出\n");printf("========================================================= =======================\n");printf("请输入你需要功能的序号:");scanf("%d",&choose);if(choose<1||choose>6) printf("请重新输入序号\n");if(choose==6) exit(0);}sort(&choose,&L,&T);//调用排序函数if(choose!=5){for(i=1;i<=L.length;i++){L.r[i]=arr[i];//每次排序后恢复原始数据}}}getchar();return 0;}6.运行结果与测试1、首先选择需要排序的数字个数,比如输入n=1002、再选择用哪种方法进行排序,比如输入方法13、各种方法排序显示已排序方法的信息57.设计体会与总结做什么都需要耐心,做设计写程序则更需要耐心。

相关主题