#include "stdio.h"。
#define MAX 30000。
/* 函数声明区 */
int SequenceSearch(int e[], int len, int key);。
int BinarySearch(int e[], int len, int key);。
void StraightInsertSort(int e[], int len);。
void QuickSort(int e[], int first, int end);。
void MergeSort(int e[],int a[],int first,int end);。
void HeapSort(int e[],int len);。
void Print(int e[], int len, int cols);。
/* 全局变量区 */
long compare; /* 比较次数 */。
long move; /* 移动次数 */。
void main()
int i;
int n;
int table[MAX], table1[MAX];。
int key;
int pos;
int choice;
int cols = 10;
system("cls");
printf("***********************************************************\n");。
printf("INITIALIZE TABLE\n");。
printf("n = ");。
scanf("%d", &n);。
srand(time(NULL));。
for(i=0; i<n; i++)。
table[i] = rand();。
table1[i] = table[i];。
while(1)
system("cls");。
printf("***********************************************************\n");。
printf("ORIGIN TABLE (%d) : \n", n);。
Print(table, n, cols);。
printf("***********************************************************\n");。
printf("ORDER TABLE (%d) : \n", n);。
StraightInsertSort(table1, n);。
Print(table1, n, cols);。
printf("***********************************************************\n");。
printf(" ALGORITH ANALYSIS SYSTEM \n\n");。
printf(" 1. SEQUENCE SEARCHING \n");。
printf(" 2. BINARY SEARCHING \n");。
printf(" 3. STRAIGHT INSERT SORTING \n");。
printf(" 4. MERGE SORTING \n");。
printf(" 5. HEAP SORTING \n");。
printf(" 6. QUICK SORTING \n");。
printf(" 0. EXIT SYSTEM \n\n");。
printf("***********************************************************\n\n");。
printf(" YOUR CHOICE : ");。
scanf("%d", &choice);。
switch(choice)。
{
case 0:
return;
case 1:
{
/***********************************************************************/。
/* 执行顺序查找 */。
printf("\t\tkey = ");。
scanf("%d", &key);。
compare = 0;。
pos = SequenceSearch(table, n, key);。
printf("\t\tSequence Searching \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
if(pos == -1)。
{
printf("\tsearch %d fail.\n", key);。
printf("\tcompare : %ld times.", compare);。
}
else
{
printf("\tsearch %d success.\n", key);。
printf("\tcompare : %ld times.", compare);。
}
printf("\n\n");。
/***********************************************************************/ 。
break;
}
case 2:
{
/***********************************************************************/。
/* 执行二分查找 */。
printf("\t\tkey = ");。
scanf("%d", &key);。
compare = 0;。
pos = BinarySearch(table1, n, key);。
printf("\t\tBinary Searching \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
if(pos == -1)。
{
printf("\tsearch %d fail.\n", key);。
printf("\tcompare : %ld times.", compare);。
}
else
{
printf("\tsearch %d success.\n", key);。
printf("\tcompare : %ld times.", compare);。
}
printf("\n\n");。
/***********************************************************************/。
break;
}
case 3:
{
/***********************************************************************/。
/* 执行直接插入排序 */。
for(i=0; i<n; i++)。
table1[i] = table[i];。
compare = move = 0;。
StraightInsertSort(table1, n);。
printf("\t\tStraight Insert Sorting \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
printf("\tcompare : %ld times.\n", compare);。
printf("\tmove : %ld times.\n\n", move);。
/***********************************************************************/。
break;
}
case 4:
{
/***********************************************************************/。
/* 执行归并排序 */。
for(i=0; i<n; i++)。
table1[i] = table[i];。
compare = move = 0;。
MergeSort(table1, table, 0, n-1);。
printf("\t\tMerge Sorting \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
printf("\tcompare : %ld times.\n", compare);。
printf("\tmove : %ld times.\n\n", move);。
/***********************************************************************/。
break;
}
case 5:
{
/***********************************************************************/。
/* 执行堆排序 */。
for(i=0; i<n; i++)。
table1[i] = table[i];。
compare = move = 0;。
HeapSort(table1, n);。
printf("\t\tHeap Sorting \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
printf("\tcompare : %ld times.\n", compare);。
printf("\tmove : %ld times.\n\n", move);。
/***********************************************************************/。
break;
}
case 6:
{
/***********************************************************************/。
/* 执行快速排序 */。
for(i=0; i<n; i++)。
table1[i] = table[i];。
compare = move = 0;。
QuickSort(table1, 0, n-1);。
printf("\t\tQuick Sorting \n");。
printf("----------------------------------------\n");。
printf("Analysis details : \n");。
printf("\tcompare : %ld times.\n", compare);。
printf("\tmove : %ld times.\n\n", move);。
/***********************************************************************/。
break;
}
default:
break;
}/* end of switch*/。
system("pause");。
getch();
}
/* 顺 序 查 找 */。
int SequenceSearch(int e[], int len, int key)。
int i;
for(i=0; i<len ; i++)。
if(++compare && e[i]==key)。
return i;
++compare;
return -1;
/* 二 分 查 找 */。
int BinarySearch(int e[], int len, int key)。
int high,low,mid;。
high=len-1;
low=0;
while(low<=high)。
mid=(low+high)/2;。
++compare;
if(key==e[mid])。
return mid;
else if(key>e[mid]) 。
low=mid+1;
else
high=mid-1;
}
++compare;
return -1;
/* 直 接 插 入 排 序 */。
void StraightInsertSort(int e[], int len)。
int i,j,temp;
for(i=1; i<len; i++)。
{
temp=e[i];
++move;
for(j=i-1; j>=0; j--)。
{
if(++compare && e[j] > temp)。
{
e[j+1]=e[j];。
++move;
}
else
break;
}
e[j+1]=temp;
++move;
}
/* 快 速 排 序 */。
void QuickSort(int e[], int first, int end)。
int i=first,j=end,temp=e[first];。
while(i<j)
while(++compare && i<j && e[j]>=temp)。
j--;
e[i]=e[j];
++move;
while(++compare && i<j && e[i]<=temp)。
i++;
e[j]=e[i];
++move;
e[i]=temp;
if(first<i-1)。
QuickSort(e,first,i-1);。
if(end>i+1) 。
QuickSort(e,i+1,end);。
/* 归 并 排 序 */。
void MergeSort(int e[],int a[],int first,int end)。
void Merge(int e[],int a[],int first,int m,int end);。
int m;
int bak[MAX];
if(first==end) 。
a[first]=e[first];。
else
{
m=(first+end)/2;。
MergeSort(e,bak,first,m);。
MergeSort(e,bak,m+1,end);。
Merge(bak,a,first,m,end);。
}
for(m=0;m<=end;m++)。
e[m]=a[m];
void Merge(int e[],int a[],int first,int m,int end)。
int i=first,j=m+1,k=first;。
while(i<=m && j<=end)。
{
++compare;
++move;
if(e[i]<=e[j]) 。
a[k++]=e[i++];。
else
a[k++]=e[j++];。
}
while(i<=m && ++move)。
a[k++]=e[i++];。
while(j<=end && ++move) 。
a[k++]=e[j++];。
/* 堆 排 序 */。
void HeapSort(int e[],int len)。
void sift(int e[],int l,int m);。
int i,temp;
for(i=len/2-1;i>=0;i--) 。
sift(e,i,len);。
for(i=len-1;i>=1;i--)。
{
move += 2;
temp=e[i];
e[i]=e[0];
e[0]=temp;
sift(e,0,i-1);。
}
void sift(int e[],int l,int m)。
int i,j,x;
i=l;
j=2*i+1;
x=e[i];
while(j<=m)。
{
if(j<m && ++compare && e[j]<e[j+1]) 。
j++;
if(++compare && x<e[j])。
{
++move;
e[i]=e[j];
i=j;
j=2*i+1;
}
else j=m+1;
}
e[i]=x;
++move;
void Print(int e[], int len, int cols)。
int i;
for(i=1; i<=len; i++)。
{
printf("%6d", e[i-1]);。
if(i%cols == 0)。
printf("\n");。
}
printf("\n");
运行测试:
晕/////真麻烦。。。。。
数据结构实习报告规范
实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:
1、需求分析
以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:
(1)输入的形式和输入值的范围;
(2)输出的形式;
(3)程序所能达到的功能;
(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果。
2、概要设计
说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3、详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。
4、调试分析
内容包括:
(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;
(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想;
(3)经验和体会等。
5、用户使用说明
说明如何使用你编写的程序,详细列出每一步操作步骤。
6、测试结果
列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
7、附录
题 目 : [数据结构] 约瑟夫-实习报告 。
尺 寸 : 约瑟夫-实习报告.doc 。
目 录 : 一、需求分析
二、概要设计
三、程序具体设计及函数调用关系 。
四、调试分析
五、测试结果
原 文 : 实习报告
题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,......,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。
班级: 姓名: 学号: 完成日期:
一、需求分析
1. 本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。
2. 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示"提示信息"之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。
3. 程序执行的命令包括:
1)构造单向循环链表;2)
4. 测试数据
m 的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序为6,1,4,7,2,1,3,5)。
二、概要设计
1.单向循环链表的抽象数据类型定义为:
ADT List{
数据对象:D={ai | ai∈正整数,I=1,2,......,n,n≥0} 。
数据关系:R1={< ai-1,ai > |,ai-1,ai∈D,I=1,2,......,n} 。
基本操作:
Init List(&L) 。
操作结果:构造一个空的线性表L。
List Insert(&L,i,e) 。
初始条件:线性表L已存在,1≤i≤List Length(L)+1. 。
操作结果:在L中第i个位置之前插入新的数据无素e,L长度加1。
List Delete(&L,i,&e) 。
初始条件:线性表L存在非空,1≤i≤List Length(L). 。
操作结果:删除L的第i个元素,并用e返回其值,L长度减1。
2. 程序包含四个模块:
1)主程序模块:
我正好在做课设,我把我的总结给你。
数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且也已经成为其他理工专业的热门选修课。随着高级语言的发展,数据结构在计算机的研究和应用中已展现出强大的生命力,它兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性。
紧张的两周数据结构实训很快就过去了,通过这两周的实践学习,不仅使我们巩固了以前的知识并在此基础上还对数据结构的特点和算法有了更深的了解,使我们在这门课程的实际应用上也有了一个提高。
首先这两周的学习,使我们在巩固了原有的理论知识上,又培养了灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力,使我们体会到自身知识和能力在实际中的应用和发挥。其次,它激发了我们创新意识,开发创造的能力和培养沟通能力。另外,让我们进一步熟悉了数据结构的设计应用。每一处编码都是在反复的熟悉数据结构的结构特性,及其语法、函数和程序设计思想的过程,对我们数据结构的学习和提高很有益处,并且使我们明白了程序设计过程,如解决一些实际问题,从解决实际问题的角度,我们可以这样来看:第一要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;第二,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的数据结构的基本类型——线性表、栈、队列、串、数组、广义表、树和二叉树以及图等,然后确定处理过程——算法,通过在编译环境中的编译与调试,可到最终的程序。最后,在这次的实训过程中,我们深刻的认识到了自己在学习方面的不足之处,我知道我还有太多的基本的思想没有真正的理解,当然我们不会灰心,我们会在以后的日子里努力弥补我们的不足。
在两周的实训中,我们也体会到了团队合作的重要性,从最初的查阅资料到最后的程序的成功运行,我们组有过山穷水尽的困惑;有过柳暗花明的惊喜;有过唇枪舌剑的辩论;有过相互鼓励的安慰。两个礼拜的时间我们经历了很多,也收获了很多。与其说这次的实训是体力与脑力的作业,不如说它是合作精神和毅力的考验。经过这次课程设计,我们不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题。
总之,两个礼拜的课程设计让我们受益匪浅。我们深深认识到,要学好一门学科,没有刻苦钻研的精神是不行的,只有在不断的尝试中,经历失败,从失败中总结经验,然后再不断的尝试,才能获得成功。
晕了,真是好纠结,我在写完下面的代码后,才在网上找了找,居然发现和你的题目完全一样的代码,算了,我就直接发在网上找到的文档和代码给你吧,可怜我写了这么久代码呀。。。。。已发,请注意查收。
代码写好了。
VC下经测试通过。
不过如果你还要论文之类的或者设计文档,我也比较难帮到你了。
#include <iostream>。
using namespace std;。
class node
public:
node(int i):data(i),left(NULL),right(NULL){}。
void inorder(node *&root) //中序遍历,符合升序输出。
{
if(root!=NULL)。
{
inorder(root->left);。
cout<<root->data<<' ';。
inorder(root->right);。
}
}
void insert(node *&ptr,int item) //在查找树中插入元素。
{
if(ptr==NULL)。
ptr=new node(item);。
else if(item<ptr->data)。
insert(ptr->left,item);。
else insert(ptr->right,item);。
}
node *find(node *&ptr,int item) //在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
{
if(ptr==NULL)。
return NULL;。
if(ptr->data==item)。
return ptr;。
else if(item<ptr->data)。
find(ptr->left,item);。
else find(ptr->right,item);。
}
node *&findy(node *&ptr,int item) //在查找树中查找肯定存在的元素,并返回其引用。
{
if(ptr->data==item)。
return ptr;。
else if(item<ptr->data)。
findy(ptr->left,item);。
else findy(ptr->right,item);。
}
node* rl(){return left;}。
node* rr(){return right;}。
void dele(node *&ptr) //删除值为item所在结点。
{
if(ptr->rl()==NULL&&ptr->rr()==NULL)。
ptr=NULL;
else if(ptr->rr()==NULL)。
ptr=ptr->rl();。
else
ptr=ptr->rr();。
}
private:
int data;
node *left; //左孩子结点。
node *right; //右孩子结点。
};
int main()
int t,i=0,j;
cout<<"输入数字个数(结点个数):";。
cin>>t;
cout<<"输入"<<t<<"个数字,数字之间用空格隔开:";。
cin>>j;
node *x=new node(j);。
for(;i<t-1;i++)。
{
cin>>j;。
x->insert(x,j);。
}
cout<<"中序遍历为:";。
x->inorder(x); //作中序遍历。
cout<<"\n输入操作(当输入-1时程序结束):"<<endl;。
cin>>j;
while(j!=-1)
{
node *t=x->find(x,j); //定位结点。
if(t!=NULL)
{
node *&y=x->findy(x,j);。
x->dele(y);。
cout<<"中序遍历为:";。
x->inorder(x);。
}
else cout<<"无"<<j;。
cout<<"\n输入操作(当输入-1时程序结束):"<<endl;。
cin>>j;。
}
return 0;
附测试数据一组
22 33 1 50 88 99 77 55。
33
50
51
55
-1
有什么不明的话可以M我或者留言我。
1、目的:通过实践,让学生加深对数据结构知识的理解,提高计算机算法设计能力,锻炼学生的综合能力,掌握程序的实际开发流程,以提高算法解决问题的能力,增强算法设计的自觉性和把握算法实施操作的能力。
2、意义:帮助学生更深地理解数据结构的知识内容,使他们能够实践运用和掌握程序开发实际流程,以及分析、设计、实现、测试和维护计算机程序等技能。有助于帮助学生加深对算法设计思想及其在计算机程序中的实际应用。