文档库 最新最全的文档下载
当前位置:文档库 › 北邮数据结构实验第三次实验排序

北邮数据结构实验第三次实验排序

北邮数据结构实验第三次实验排序
北邮数据结构实验第三次实验排序

数据结构实验报告

1.实验要求

(1)实验目的

通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。

(2)实验内容

使用简单数组实现下面各种排序算法,并进行比较。

排序算法:

1、插入排序

2、希尔排序

3、冒泡排序

4、快速排序

5、简单选择排序

6、堆排序(选作)

7、归并排序(选作)

8、基数排序(选作)

9、其他

要求:

1、测试数据分成三类:正序、逆序、随机数据

2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数

(其中关键字交换计为3次移动)。

3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到

微秒(选作)

4、对2和3的结果进行分析,验证上述各种算法的时间复杂度

编写测试main()函数测试排序算法的正确性。

2. 程序分析

存储结构

顺序表:

示意图:

关键算法分析

(1)测试数据的产生:正序、逆序、随机数据

用两个数组实现乱序、顺序以及逆序数据的排序。

基本思想为:随机序列产生一个指定长度的乱序序列,然后通过memcpy()函数拷贝

到第二个数组里,第二个数组作为乱序序列的保存数组,每次对第一个数组进行排序,之后拷贝第二个数组中的乱序序列到第一个数组,实现各次乱序排列。只要算法正确(第一步可以检验),之后顺序排列只需反复对第一个数组进行操作即可,再后用第二个数组保存逆序数组,然后同样在每次排序之后复制第二数组存储的乱序序列到第一组,对第一组反复排序即可。

<1> pRandom1=new long int[Max+1];pRandom2=new long int[Max+1];

<2> srand((unsigned)time(NULL)); for(int i = 1; i <= Max;i++ ) pRandom2[i]=rand();

<3> memcpy,,(Max+1)*sizeof(long int));

(2)排序算法:

<1>插入排序:依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕。

/1/int j=0;

/2/ for(int i =2; i <= Max;i++) parray[0]=parray[i];comparetimes[0]++;

/4/parray[j+1]=parray[0];movetimes[0]+=2;

示意图:

r1,r2,r3,…,ri-1,ri,ri+1,…,rn

有序区待插入无序区

<2>希尔排序:先将整个序列分割成若干个子列,分别在各个子列中运用直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。

int Sort::ShellSort(long int parray[])

{int j=0;

for(int d=Max/2;d>=1;d/=2)

{for(int i=d+1;i<=Max;i++)

{ parray[0]=parray[i];

comparetimes[1]++;

for(j=i-d;j>0 && parray[0]

{ parray[j+d]=parray[j];

movetimes[1]++;}

parray[j+d]=parray[0];

movetimes[1]+=2;}}

return 0;}

<3>冒泡排序:两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止。

int Sort::BubbleSort(long int parray[])

{ int exchange=Max;

int bound,j;

while(exchange)

{ bound=exchange;

exchange=0;

for(j=1;j

{ comparetimes[2]++;

if(parray[j]>parray[j+1])

{ parray[0]=parray[j];

parray[j]=parray[j+1];

parray[j+1]=parray[0];

exchange=j;

movetimes[2]+=3;}}}

return 0;}

示意图:

r1,r2,r3,…,ri-1,ri,ri+1,…,rn

反序则交换有序区

<4>快速排序:首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成。

int Sort::QuickSort(long int parray[])

{QuickSortRecursion(parray,1, Max);return 0;}

int Sort::QuickSortRecursion(long int parray[], int first=1, int end=Max) {if (first

{ int pivot=QuickSortPatition(parray, first, end);

QuickSortRecursion(parray, first, pivot-1);pFunction[i]);

建立两个数组分别统计运行次数,再统一使用一个数组记录七种算法在三种不同数据情况下的移动次数和交换次数。在分别运行乱序、顺序和逆序数组排序时取出前两个数组的值写入第三个数组,然后置零继续统计。

(4)算法的执行时间:

获取当前系统时间,精确到微秒,分别在代码运行前后调用记录前后时间,再相减即可得到代码运行时间。此处调用函数QueryPerformanceCounter()用于得到高精度计时器的值。

long double Sort::GetNowT33ime()

{

L ARGE_INTEGER litmp;

LONG64 QPart;

QueryPerformanceCounter(&litmp); Q Part=;

r eturn (long double)QPart;

(5)各种算法的时间复杂度与空间复杂度:

3. 程序运行结果

(1)流程图:

(2)测试条件:

本实验中随机产生的数据量为50(3)测试结论

运行结果:

分析:

<1>多次运行之后统计,从乱序的时间消耗来看,基本符合理论分析

<2>由于加入了统计次数的代码,势必增加时间开销,这样统计出来的时间将有一定的误差。

假若比较次数和移动次数相差较多,则将产生较大的实验误差。

4. 总结

(1)调试时出现的问题及解决的方法

在调试过程中,我遇到了一些困难。例如:循环的条件控制不正确。通过云阅读书本,我发现,错误的原因是没能正确理解概念。经过反复的尝试,不断对知识的理解,最终我将错误改正。

(2)心得体会

通过此次实验,我对各这种排序有了更加直观和深刻的认识,对书本上介绍的各种算法有了更熟练的掌握。

在编程的过程中,我也遇到了一些困难,多是有关c++语法等方面的困难,通过不断的调试与查询资料,我对c++的一些语法更加了解,这对我以后的编程有很大的帮助。

(3)下一步的改进

本程序代码设计时运用了递归的调用方式,效率还可以通过将其转换为栈模拟的方式得以提高。

源代码:由3部分组成

pFunction[i]);

=();

[i][j]=

/****************************主调函数*********************************/ int main()

{

S ort obj;

();

m emcpy,,(Max+1)*sizeof(long int));

i nt i(0),j(0);

/*************************乱序序列*********************************/ ();

f or(i=0;i<7;i++)

{

Statistics(obj,i,0);

cout<

;

if(i!=6)

memcpy,,(Max+1)*sizeof(long int));

}

(0);

/*************************顺序序列*********************************/ ();

f or( i=0;i<7;i++)

Statistics(obj,i,1);

(2);

/*************************逆序序列*********************************/ ();

f or(i=1;i<=Max;i++)

[i]=[Max+1-i];

m emcpy,,(Max+1)*sizeof(long int));

f or(i=0;i<7;i++)

{

Statistics(obj,i,2);

memcpy,,(Max+1)*sizeof(long int));

}

(4);

/************************统计排序数据******************************/ (funcName);

r eturn 0;

}

//

const int Max =50;

class Sort

{

public:

S ort();

~Sort();

v oid CreateData(void);

int InsertSort(long int []);

i nt ShellSort(long int []);

int BubbleSort(long int []);

i nt QuickSort(long int []);

i nt QuickSortRecursion(long int [], int ,int);

i nt QuickSortPatition(long int [], int , int );

int SelectSort(long int []);

i nt HeapSort(long int []);//堆排序

v oid HeapSortSift(long int [], int , int );//筛选

i nt MergeSort(long int []);

v oid Merge(long int [],long int [], int , int , int );//归并排序v oid MergePass(long int [],long int [] , int );

l ong double GetNowTime(void);

void PrintArray(long int*);

v oid SetTimesZero(void);

v oid RecordTimes(int);

f riend void Statistics(Sort &,int ,int);

v oid PrintStatistics(char *[]);

f riend int main(void);

private:

l ong int *pRandom1;

l ong int *pRandom2;

l ong double runtime[7][3];

i nt comparetimes[7];

int movetimes[7];

i nt timestable[7][6];

l ong double startTime,endTime;

};

//

#include""

#include

#include <>

#include <>

#include<>

#include

#include<>

#include

#include

using namespace std;

/**********************************************************构造函数**********************************************************************/ Sort::Sort()

{

m emset(timestable,0,sizeof(int)*7*6);

}

/***********************************************************构造数组**********************************************************************/ void Sort::CreateData()

{

p Random1=new long int[Max+1];

p Random2=new long int[Max+1];

s rand((unsigned)time(NULL));

for(int i = 1; i <= Max;i++ )

pRandom2[i]=rand();

c out<<"随机乱序数组如下:\n"; //输出原始数组

P rintArray(pRandom2);

}

/********************************************************简单插入排序*******************************************************************/ int Sort::InsertSort(long int parray[])

{

i nt j=0;

f or(int i =2; i <= Max;i++)

{

parray[0]=parray[i];

comparetimes[0]++;//比较次数统计

for(j=i-1;parray[0]

{

parray[j+1]=parray[j];

movetimes[0]++;//移动次数统计

}

parray[j+1]=parray[0];

movetimes[0]+=2;

}

return 0;

}

/**********************************************************希尔排序***********************************************************************/ int Sort::ShellSort(long int parray[])

{

i nt j=0;

for(int d=Max/2;d>=1;d/=2)

{

for(int i=d+1;i<=Max;i++)

{

parray[0]=parray[i];

comparetimes[1]++;

for(j=i-d;j>0 && parray[0]

{

parray[j+d]=parray[j];

movetimes[1]++;

}

parray[j+d]=parray[0];

movetimes[1]+=2;

}

}

r eturn 0;

}

/**********************************************************冒泡排序***********************************************************************/ int Sort::BubbleSort(long int parray[])

{

i nt exchange=Max;

i nt bound,j;

w hile(exchange)

{

bound=exchange;

exchange=0;

for(j=1;j

{

comparetimes[2]++;

if(parray[j]>parray[j+1])

{

parray[0]=parray[j];

parray[j]=parray[j+1];

parray[j+1]=parray[0];

exchange=j;

movetimes[2]+=3;

}

}

}

return 0;

}

/***********************************************************快速排序**********************************************************************/ int Sort::QuickSort(long int parray[])

{

Q uickSortRecursion(parray,1, Max);

r eturn 0;

}

int Sort::QuickSortRecursion(long int parray[], int first=1, int end=Max) {

i f (first

{

int pivot=QuickSortPatition(parray, first, end);

QuickSortRecursion(parray, first, pivot-1);//左侧子序列排序

QuickSortRecursion(parray, pivot+1, end); //右侧子序列排序

}

return 0;

}

int Sort::QuickSortPatition(long int r[], int first, int end )

{

i nt i=first;

i nt j=end;

i nt temp;

while (i

{

while (i

{

j--;

comparetimes[3]++;

} //右侧扫描

if (i

{

temp=r[i]; //将较小记录交换到前面

r[i]=r[j];

r[j]=temp;

i++;

movetimes[3]+=3;

}

while (i

{

i++;

comparetimes[3]++;

} //左侧扫描

if (i

{

temp=r[j];

r[j]=r[i];

r[i]=temp; //将较大记录交换到后面

j--;

movetimes[3]+=3;

}

}

return i; //i为轴值记录的最终位置

}

/***********************************************************选择排序**********************************************************************/ int Sort::SelectSort(long int parray[])

{

i nt i,j,index,temp;

for (i=1; i

index=i;

for (j=i+1; j<=Max; j++)

{

comparetimes[4]++; //在无序区中选取最小记录

if (parray[j]

index=j;

}

if (index!=i)

{

temp=parray[i];

parray[i]=parray[index];

parray[index]=temp;

movetimes[4]+=3;

}

}

return 0;

}

/*************************************************************堆排序***********************************************************************/ int Sort::HeapSort(long int parray[])

{

i nt i;

f or (i=Max/2; i>=1; i--)

HeapSortSift(parray, i, Max) ;

for (i=1; i

{

parray[0]=parray[Max-i+1];

parray[Max-i+1]=parray[1];

parray[1]=parray[0];

movetimes[5]+=3;

HeapSortSift(parray, 1, Max-i);

}

return 0;

}

void Sort::HeapSortSift(long int parray[], int k, int m)

{

i nt i,j;

i=k;

j=2*i; //置i为要筛的结点,j为i的左孩子

while (j<=m) //筛选还没有进行到叶子

{

if (j

{

j++;

comparetimes[5]++;

} //比较i的左右孩子,j为较大者 if (parray[i]>parray[j])

{

comparetimes[5]++;

break;

} //根结点已经大于左右孩子中的较大者else

{

parray[0]=parray[i];

parray[i]=parray[j];

parray[j]=parray[0];

movetimes[5]+=3;

i=j;

j=2*i; //被筛结点位于原来结点j的位置

}

}

}

/************************************************************归并排序*********************************************************************/ int Sort::MergeSort(long int parray[])

{

l ong int r1[Max+1];

i nt h(1);

while (h

{

MergePass(parray, r1, h); //归并

h=2*h;

MergePass(r1, parray, h);

h=2*h;

}

return 0;

}

void Sort::Merge(long int parray[], long int r1[], int s, int m, int t) //一次归并

{

i nt i=s;

i nt j=m+1;

i nt k=s;

while (i<=m && j<=t)

{

comparetimes[6]++;

movetimes[6]++;

if (parray[i]<=parray[j])

{

r1[k++]=parray[i++];

}

else

r1[k++]=parray[j++];

}

if (i<=m)

while (i<=m)

{

r1[k++]=parray[i++];

movetimes[6]++;

}

else

while (j<=t)

{

r1[k++]=parray[j++];

movetimes[6]++;

}

}

void Sort::MergePass(long int parray[], long int r1[], int h) //一趟归并{

i nt i(1),k;

while (i<=Max-2*h+1)

{

Merge(parray, r1, i, i+h-1, i+2*h-1);

i+=2*h;

}

if (i

Merge(parray, r1, i, i+h-1, Max);

else for (k=i; k<=Max; k++)

{

r1[k]=parray[k];

movetimes[6]++;

}

}

/************************************************************获取当前时间**********************************************************************/ long double Sort::GetNowTime()

{

L ARGE_INTEGER litmp;

LONG64 QPart;

QueryPerformanceCounter(&litmp);

Q Part=;

r eturn (long double)QPart;

}

/**************************************************************打印数组************************************************************************/ void Sort::PrintArray(long int *pRandom)

{

f or(int j=1;j<=Max;j++)

c out<

c out<

}

/************************************************************数组置零函数***********************************************************************/ void Sort::SetTimesZero()

{

m emset(comparetimes,0,sizeof(int)*7);

m emset(movetimes,0,sizeof(int)*7);

}

void Sort::RecordTimes(int j)

{

f or(int i=0;i<7;i++)

{

timestable[i][j]=movetimes[i];

timestable[i][j+1]=comparetimes[i];

}

}

/************************************************************输出排序数据***********************************************************************/ void Sort::PrintStatistics(char* funcname[])

{

i nt i(0),j(0);

c out<<" 排序方法\t"<<"乱序耗时(μs) "<<"顺序耗时(μs) "<<"逆序耗时(μs)"<

f or(i=0;i<7;i++)

cout<

<

c out<<'\n'<<"\t\t\t移动次数统计表\n\n";

c out<<" 排序方法\t"<<" 乱序序列\t"<<" 顺序序列\t"<<" 逆序序列\t"<

f or(i=0;i<7;i++)

{

cout<

for(j=0;j<6;j+=2)

cout<<'\t'<<'\t'<

cout<

}

c out<<'\n'<<"\t\t\t比较次数统计表\n\n";

c out<<" 排序方法\t"<<" 乱序序列\t"<<" 顺序序列\t"<<" 逆序序列\t"<

f or(i=0;i<7;i++)

{

cout<

for(j=1;j<6;j+=2)

cout<<'\t'<<'\t'<

cout<

}

}

/*************************************************************类的析构函数

**********************************************************************/ Sort::~Sort()

{

d elet

e pRandom1;

d elet

e pRandom2;

}

数据结构实验十一:图实验

一,实验题目 实验十一:图实验 采用邻接表存储有向图,设计算法判断任意两个顶点间手否存在路径。 二,问题分析 本程序要求采用邻接表存储有向图,设计算法判断任意两个顶点间手否存在路径,完成这些操作需要解决的关键问题是:用邻接表的形式存储有向图并输出该邻接表。用一个函数实现判断任意两点间是否存在路径。 1,数据的输入形式和输入值的范围:输入的图的结点均为整型。 2,结果的输出形式:输出的是两结点间是否存在路径的情况。 3,测试数据:输入的图的结点个数为:4 输入的图的边得个数为:3 边的信息为:1 2,2 3,3 1 三,概要设计 (1)为了实现上述程序的功能,需要: A,用邻接表的方式构建图 B,深度优先遍历该图的结点 C,判断任意两结点间是否存在路径 (2)本程序包含6个函数: a,主函数main() b,用邻接表建立图函数create_adjlistgraph() c,深度优先搜索遍历函数dfs() d,初始化遍历数组并判断有无通路函数dfs_trave() e,输出邻接表函数print() f,释放邻接表结点空间函数freealgraph() 各函数间关系如右图所示: 四,详细设计 (1)邻接表中的结点类型定义:

typedef struct arcnode{ int adjvex; arcnode *nextarc; }arcnode; (2)邻接表中头结点的类型定义: typedef struct{ char vexdata; arcnode *firstarc; }adjlist; (3)邻接表类型定义: typedef struct{ adjlist vextices[max]; int vexnum,arcnum; }algraph; (4)深度优先搜索遍历函数伪代码: int dfs(algraph *alg,int i,int n){ arcnode *p; visited[i]=1; p=alg->vextices[i].firstarc; while(p!=NULL) { if(visited[p->adjvex]==0){ if(p->adjvex==n) {flag=1; } dfs(alg,p->adjvex,n); if(flag==1) return 1; } p=p->nextarc; } return 0; } (5)初始化遍历数组并判断有无通路函数伪代码: void dfs_trave(algraph *alg,int x,int y){ int i; for(i=0;i<=alg->vexnum;i++) visited[i]=0; dfs(alg,x,y); } 五,源代码 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #define max 100 typedef struct arcnode{ //定义邻接表中的结点类型 int adjvex; //定点信息 arcnode *nextarc; //指向下一个结点的指针nextarc }arcnode; typedef struct{ //定义邻接表中头结点的类型 char vexdata; //头结点的序号 arcnode *firstarc; //定义一个arcnode型指针指向头结点所对应的下一个结点}adjlist; typedef struct{ //定义邻接表类型 adjlist vextices[max]; //定义表头结点数组

北邮信通院数据结构实验报告三哈夫曼编码器之欧阳光明创编

数据结构实验报告 欧阳光明(2021.03.07) 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期: 2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统 计,统计每个字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编 码,并将每个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并 将编码后的字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符 串进行译码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析, 讨论赫夫曼编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study

data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有 出现的 字符一律不用编码。 2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。

weight lchild rchildparent 2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent

《数据结构与算法设计》实验大纲及实验内容详细要求

《数据结构与算法设计》实验大纲及实验内 容详细要求 一、课程编号: 二、课程类型:必修 适用专业:通信工程 实验学时:32学时 三、本课程的地位、作用与任务 数据结构课程的目标是使学生掌握数据的基本的逻辑结构和存储结构、一些典型的数据结构算法及程序设计方法,要求学会分析数据对象特征,掌握数据组织方法和计算机的表示方法,为数据选择适当的逻辑结构、存储结构以及相应的处理算法,要求具备算法分析的基本技术和能力,并培养良好的程序设计风格,掌握开发复杂、高效程序的技能。 在实验前要预习或者自行补充部分学时,同时进行部分代码准备,实验后要认真完成实验报告。 四、课程基本要求 1.学生应根据每个实验的任务和教师所提的要求,带C语言教材和课程教材。 2.完成指定的实验任务,保存源代码并输出、记录实验结果。 3.实验结束后按时提交实验报告,对于未完成部分,应该利用课余时间补充完成。 五、实验安排 本实验课程共32学时,五个实验(单元),分16次实验,每次2学时。 实验一:C程序编程、调试实验 1、实验学时:4学时(学生堂下自行加4学时) 2、实验目的: 1)巩固复习前期所学C语言的基本数据类型和自定义数据类型等知识点,强化 学习数据结构语言和编程基础。 2)巩固复习前期所学C语言的函数参数传递、指针和结构体等知识点,加强学

习数据结构语言基础。 3)能够较熟练调试程序 3、实验内容: 1)学生信息的显示。具体要求如下: ●定义一个结构体描述学生信息(学号,姓名,性别,年龄,住址); ●设计一个函数,用于显示单个学生信息,函数的参数为前面定义的结构 体类型; ●设计一个主函数,在主函数中输入学生的信息,并调用前面定义的函数 进行显示(学生人数不少于5人)。 2)输入若干个整数存储到数组元素值,然后按输入顺序进行逆置存储,最后打 印出逆置后的元素值。要求用指针和动态内存分配方法实现。例如输入:1023045,逆置后显示为:5430210。 3)编写扑克牌发牌程序。在VC++的调试环境下观察数据存储位置、存储数据的 变化、数据之间的逻辑次序、物理存储位置次序。 4)对上述C程序进行调试,运行,从中理解数据和算法的概念,总结调试方法。 实验二:线性表的存储及基本操作、综合应用 1、实验学时:6学时 2、实验目的: 1)掌握线性表的逻辑特征 2)熟练掌握线性表的链式存储结构定义及基本操作 3)理解循环链表和双链表的特点和基本运算 4)加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实 际问题的编程能力。 5)掌握顺序表和链表的概念,学会对问题进行分析,选择恰当的逻辑结构和物理 结构 6)和实验一一起撰写一份实验报告,总结学习效果 3、实验内容: 使用顺序表和链表两种存储结构(linked list),存储输入的一组数据整数,能够进

数据结构实验报告图实验

图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10;

template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp

#include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) {

《数据结构设计》内容要求要点

禁止抄袭,否则一律不及格。机会仅有一次!!!!! 《数据结构课程设计》 一、基本要求 (1)选择一个与线性表、堆栈和队列、数组、树、图、排序、查找等相关的专题,利用C语言或java来实现,解决具有一定规模的、具有实际意义的应用题目。 (2)论文内容主要包括封面、正文、参考文献等,其中正文内容主要引言、系统分析设计、系统实现和小结几部分组成。 (3)论文格式参考下面文档《模板》撰写课程报告。 (4)特别要求自己独立完成。 (5)第15周周一提交课程设计论文、电子版、源代码。 二、创新要求 在基本要求达到后,可进行创新设计,如改善算法性能、友好的人机界面。 可选题目列表: 1.运动会分数统计 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 功能要求: 1)可以输入各个项目的前三名或前五名的成绩; 2)能统计各学校总分, 3)可以按学校编号或名称、学校总分、男女团体总分排序输出; 4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 5)数据存入文件并能随时查询 6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称 输出形式:有合理的提示,各学校分数为整形 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指

数据结构实验报告图实验

邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; }

int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: " cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } }

北邮数据结构实验3哈夫曼编码

数据结构实验报告 实验名称:实验3——哈夫曼编码 学生姓名: 班级: 班内序号: 学号: 日期:2013年11月24日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 2. 程序分析 2.1存储结构: struct HNode { char c;//存字符内容 int weight; int lchild, rchild, parent; }; struct HCode

{ char data; char code[100]; }; //字符及其编码结构 class Huffman { private: HNode* huffTree; //Huffman树 HCode* HCodeTable; //Huffman编码表 public: Huffman(void); void CreateHTree(int a[], int n); //创建huffman树 void CreateCodeTable(char b[], int n); //创建编码表 void Encode(char *s, string *d); //编码 void Decode(char *s, char *d); //解码 void differ(char *,int n); char str2[100];//数组中不同的字符组成的串 int dif;//str2[]的大小 ~Huffman(void); }; 结点结构为如下所示: 三叉树的节点结构: struct HNode//哈夫曼树结点的结构体 { int weight;//结点权值 int parent;//双亲指针 int lchild;//左孩子指针 int rchild;//右孩子指针 char data;//字符 }; 示意图为: int weight int parent int lchild int rchild Char c 编码表节点结构:

数据结构课程设计题目及要求

实验一~实验四任选一题;实验五~实验九任选一题。 实验一运动会分数统计 一、实验目的: (1)熟练掌握线性表的两种存储方式 (2)掌握链表的操作和应用。 (3)掌握指针、结构体的应用 (4)按照不同的学校,不同项目和不同的名次要求,产生各学校的成绩单、团体总分报表。 二、实验内容: 【问题描述】 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。 【基本要求】 产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。 【测试数据】 对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。 【实现提示】 可以假设m≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。 【选作内容】 允许用户指定某些项目可采取其他名次取法。

实验二停车场管理 一、实验目的: (1)熟练掌握栈顺存和链存两种存储方式。 (2)掌握栈的基本操作及应用。 (3)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 二、实验内容: 【问题描述】 设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 【测试数据】 设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。 【实现提示】 需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。(3)汽车可以直接从便道开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 (4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。

数据结构实验

实验1 (C语言补充实验) 有顺序表A和B,其元素值均按从小到大的升序排列,要求将它们合并成一 个顺序表C,且C的元素也是从小到大的升序排列。 #include main() { intn,m,i=0,j=0,k=0,a[5],b[5],c[10];/* 必须设个m做为数组的输入的计数器,不能用i ,不然进行到while 时i 直接为5*/ for(m=0;m<=4;m++)scanf("%d",&a[m]);// 输入数组a for(m=0;m<=4;m++)scanf("%d",&b[m]);// 输入数组b while(i<5&&j<5) {if(a[i]b[j]){c[k]=b[j];k++;j++;} else{c[k]=a[i];k++;i++;j++;}// 使输入的两组数组中相同的数只输出一 个 } if(i<5) for(n=i;n<5;n++) {c[k]=a[n];k++;} elseif(j<5) for(n=j;n<5;n++) {c[k]=b[n];k++;} for(i=0;i

求A QB #include main() { inti,j,k=0,a[5],b[5],c[5];//A=a[5],B=b[5],A n B=c[5] for(i=0;i<5;i++)scanf("%d",&a[i]);// 输入a 数组 for(i=0;i<5;i++)scanf("%d",&b[i]);〃输入b 数组 for(i=0;i<5;i++) {for(j=0;j<5;j++) if(a[i]==b[j]){c[k]=a[i];k++;}// 当有元素重复时,只取一个放入 c 中} for(i=0;i #defineN4 main() { inti,j,m,k,a[N+1];//k 为最后输出数组的长度变量

北邮数据结构第四次实验题目一排序

数据结构实验报告实验名称:实验四排序(题目1) 姓名: 班级: 班内序号: 学号:

1.实验要求 实验目的:学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。实验内容:使用简单数组实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、希尔排序 3、冒泡排序 4、快速排序 5、简单选择排序 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换 计为3次移动)。 3、对2的结果进行分析,验证上述各种算法的时间复杂度。 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 2.2 关键算法分析 2.2.1 插入排序 插入排序的基本方法是寻找一个指定元素在待排序元素中的位置,然后插入。一趟直接插入排序的C++描述过程如下: ①将待插入纪录赋值给哨兵r[0]:r[0]=r[i]; ②从后向前进行顺序查找:for(j=i-1;r[0]

{r[j+1]=r[j];move++; comp++;} //循环中移动计数器++ comp++; //比较计数器++ r[j+1]=r[0];move++; //移动计数器++ } comp++; //比较计数器++ } cout<<"本次直接插入排序数据长度为:"<=1;d=d/2) //以d 为增量在子序列中进行插入排序 { for(int i=d+1;i<=n;i++) //一趟希尔排序 { if(r[i]0&&r[0]

北邮数据结构实验四-链表排序

数据结构实验报告 实验名称:实验四——链表的排序 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 [内容要求] 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其 中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒 (选作) 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度 编写测试main()函数测试线性表的正确性 代码要求 1、必须要有异常处理,比如删除空链表时需要抛出异常; 2、保持良好的编程的风格: 代码段与段之间要有空行和缩近 标识符名称应该与其代表的意义一致 函数名之前应该添加注释说明该函数的功能 关键代码应说明其功能 3、递归程序注意调用的过程,防止栈溢出

2. 程序分析 2.1 存储结构 [内容要求] 存储结构:双链表 2.2 关键算法分析 [内容要求] 定义类: template class LinkList { public: LinkList(){front = new Node ;front->next=rear;front->prior=NULL;rear=new Node;rear->next=NULL;rear->prior=front;} LinkList(T a[],int n); void BackLinkList(T a[]);//恢复原链表 ~LinkList();//析构函数 void PrintList();//打印数列 void InsertSort();//插入排序 void BubbleSort();//冒泡排序 Node * Partion(Node *i,Node *j);//快速排序中寻找轴值的函数 void Qsort(Node *i,Node *j);//快速排序 void SelectSort();//选择排序 Node*front; Node*rear; }; 成员函数包括:构造函数:单链表,打印单链表,插入排序,快速排序,冒泡排序,选择排序,析构函数 公有成员:头指针和尾指针 1、构造函数: LinkList::LinkList(T a[],int n) { front=new Node; rear=new Node; front->prior=NULL;front->next=rear; rear->next=NULL;rear->prior=front; Node *s; for (int i=n-1;i>=0;i--) {

《数据结构》实验指导书

数据结构实验课程大纲 本大纲是针对计算机科学与技术专业本科对数据结构的基本要求而编写的。 一、目的与任务 数据结构是一门实践性很强的课程,每个学生必须完成一定数量的上机作业。通过上机作业,要求在数据结构的逻辑特性和存贮表示、基本数据结构的选择和应用、算法设计及其实现等方面加深对课程基本内容的理解。同时,在程序设计方法、程序设计风格及上机操作等基本技能和科学作风方面受到比较系统的、严格的训练。提高分析问题和用计算机解决实际问题的能力。为后续课程的学习以及为应用软件特别是非数值软件的开发打下良好的理论基础和实践基础。 二、课程内容 1.顺序表的表示和运算(0-2学时) 2.链表的表示和运算(2学时) 3.栈的应用(2-3学时) 4.队列的应用(2-3学时) 5.二叉树的基本操作和应用(2-6学时) 6.图及其应用(2-6学时) 7.排序(4-6学时) 8.查找(2-4学时) 三、基本要求 1.逐步理解和掌握程序设计和上机操作的基本方法和技能。 2.理解并实现各种基本数据结构的存贮表示、运算方法及其典型应用;学会根据实际问题的要求设计算法的 数据结构,并具有一定的比较和选用数据结构及算法的能力。 3.理解并实现常用的查找和排序的基本方法。 四、学时分配

五、实验内容 注:带*的内容以及练习与思考题,可根据实际学时、专业方向特点等具体要求,做相应调整或从略。 实验一、顺序表 实验目的: 熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。 实验要求: 了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。 实验内容: 编写程序实现下列的要求: (1) 设数据元素为整数,实现这样的线性表的顺序存储表示。 (2) 键盘输入10个数据元素,利用顺序表的基本操作,建立该表。 (3) 利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。 (4) * 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。要求尽可能少地修改前面的程序来得到新程序。(这里用于比较的字段为分数) 练习及思考题: (1)不同类型的数据元素所对应的顺序表在类型定义和操作实现上有什么异同? (2)顺序表的操作上有什么特点? (3)不固定数据元素的个数,而通过特殊数据来标记输入数据的结束,实现这样的输入操作。 实验二、链表 实验目的: 熟悉链式表的逻辑特性、存储表示方法的特点和链式表的基本操作。 实验要求: 了解并熟悉链式表的逻辑特性、存储表示方法和链式表的基本操作的实现和应用。 实验内容: 编写程序实现下列的要求: (1) 设学生成绩表中的数据元素为学生成绩(含姓名、成绩字段),实现这样的线性表的链式存储表示。 (2) 键盘输入若干个数据元素(用特殊数据来标记输入数据的结束),利用链表的基本操作(前插或后插算法),建立学生成绩单链表。 (3) 键盘输入关键字值x,打印出表中所有关键字值<=x的结点数据。(用于比较的关键字字段为分数)。 (4) 输入关键字值x,删除表中所有关键字值<=x的结点。(用于比较的关键字字段为分数)。 (5) * 释放该链表(删除所有结点)。 (6) * 若要求建立的学生成绩单链表为有序表,重新编写算法和程序实现前面的要求(3)。(用于比较的字段为分数)。 练习及思考题: (1)不同类型的数据元素所对应的链式表在类型定义和操作实现上有什么异同? (2)有头结点的链式表,有什么特点?

数据结构实验报告(图)

附录A 实验报告 课程:数据结构(c语言)实验名称:图的建立、基本操作以及遍历系别:数字媒体技术实验日期: 12月13号 12月20号 专业班级:媒体161 组别:无 姓名:学号: 实验报告内容 验证性实验 一、预习准备: 实验目的: 1、熟练掌握图的结构特性,熟悉图的各种存储结构的特点及适用范围; 2、熟练掌握几种常见图的遍历方法及遍历算法; 实验环境:Widows操作系统、VC6.0 实验原理: 1.定义: 基本定义和术语 图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E),其中:V(G)是顶点(V ertex)的非空有限集E(G)是边(Edge)的有限集合,边是顶点的无序对(即:无方向的,(v0,v2))或有序对(即:有方向的,)。 邻接矩阵——表示顶点间相联关系的矩阵 设G=(V,E) 是有n 1 个顶点的图,G 的邻接矩阵A 是具有以下性质的n 阶方阵特点: 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n2 9

无向图中顶点V i的度TD(V i)是邻接矩阵A中第i行元素之和有向图中, 顶点V i的出度是A中第i行元素之和 顶点V i的入度是A中第i列元素之和 邻接表 实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧) 特点: 无向图中顶点Vi的度为第i个单链表中的结点数有向图中 顶点Vi的出度为第i个单链表中的结点个数 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数 逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表。 图的遍历 从图中某个顶点出发访遍图中其余顶点,并且使图中的每个顶点仅被访问一次过程.。遍历图的过程实质上是通过边或弧对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构。图的遍历有两条路径:深度优先搜索和广度优先搜索。当用邻接矩阵作图的存储结构时,查找每个顶点的邻接点所需要时间为O(n2),n为图中顶点数;而当以邻接表作图的存储结构时,找邻接点所需时间为O(e),e 为无向图中边的数或有向图中弧的数。 实验内容和要求: 选用任一种图的存储结构,建立如下图所示的带权有向图: 要求:1、建立边的条数为零的图;

北邮信通院数据结构实验报告三哈夫曼编码器

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验三树 ----- 哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期:2014年12月11日 1. 实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable)利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):禾U用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符 一律不用编码。

2. 程序分析 2.1存储结构 Huffman 树给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径 长度最小的二叉树称为Huffman 树,也叫做最优二叉树 哈夫虽树示意图 root 孩子双亲表示法 _____________________ JL________________ weight Ichild rchild pare nt

北邮信通院数据结构实验报告三哈夫曼编码器

数据结构实验报告 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期:2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的 字符一律不用编码。

2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。 weight lchild rchild parent

2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent 2-1-15 5-1-15 6-1-16 7-1-16 9-1-17 7017

《数据结构与算法》上机实验要求

《数据结构与算法》课程实验内容与要求 一、课程简介 本课程着重讲述①线性结构、树型结构、图等典型数据结构的逻辑特点、存储结构及其相应的基本算法。②各种查找算法③典型内部排序算法。 二、实验的作用、地位和目的 数据结构是一门技术基础课,通过实验深刻理解各种逻辑结构、存储结构的特性,培养为实际问题分析其数据对象、基本操作,选择逻辑结构、存储结构灵活应用基本算法,设计出具有专业水准的应用程序的能力。 三、实验方式与要求 ①首先要求学生在课下完成问题分析、算法设计,基本完成程序设计。 ②实验时,每位学生使用一台微机,独立调试,完成程序。 ③程序调试好后,由指导教师检测运行结果,并要求学生回答相关的问题。教师评出检查成绩。 ④学生记录程序的输入数据,运行结果及源程序。 ⑤在一周内完成实验报告。 四、考核方式与实验报告要求 实验成绩由指导教师根据学生的实验完成情况、源程序质量、回答问题情况、实验报告质量、实验纪律等方面给分。 学生在实验后的一周内提交实验报告。实验报告按照首页附件中实验报告模版书写。实验报告中应包括如下内容: ?实验内容按任课教师下达的实验任务填写(具体实验题目和要求); ?实验过程与实验结果应包括如下主要内容: 算法设计思路简介 算法描述:可以用自然语言、伪代码或流程图等方式 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等 ?源程序清单与实验结果或其它说明可打印,并装订在实验报告首页之后。 ?实验报告雷同者,本次实验成绩为0分或雷同实验报告平分得分

五、实验的软硬件环境 硬件环境:PⅡ以上微型计算机 软件环境:Windows98/2000, VC++6.0或turbo C 六、实验内容安排 实验一线性表应用 实验时间:2016年3月14日1-4节(地点:7-215) 实验目的:理解线性表的逻辑特点;掌握顺序表、链表存储结构,以及线性表的基本操作,如插入、删除、查找,以及线性表合并等操作在顺序存储结构和链式存储结构上的实现算法,并能够在实际问题背景下的灵活运用线性表来解决问题,实现相应算法。 具体实验题目与要求:(任课教师根据实验大纲自己指定) 每位同学可从下面题目中选择1-2题实现: 1.一元稀疏多项式简单的计算器 1)问题描述:用线性表表示一元稀疏多项式,设计一个一元多项式运算器 2)要求: (1)采用单链表存储结构一元稀疏多项式 (2)输入并建立多项式 (3)输出多项式 (4)实现多项式加、减运算 2.单链表基本操作练习 1)问题描述:在主程序中提供下列菜单: 1…建立链表 2…连接链表 3…输出链表 0…结束 2)实验要求:算法中包含下列过程,分别完成相应的功能: CreateLinklist(): 从键盘输入数据,创建单链表 ContLinklist():将前面建立的两个单链表首尾相连 OutputLinklist():输出显示单链表 3.约瑟夫环问题 1)问题描述:有编号为1, 2…n 的n 个人按顺时针方向围坐一圈,每人持有一个正整数密码。开始给定一个正整数m,从第一个人按顺时针方向自1开始报数,报到m者出列,不再参加报数,这时将出列者的密码作为m,从出列者顺时针方向的下一人开始重新自1开始报数。如此下去,直到所有人都出列。试设计算法,输出出列者的序列。 2)要求: 采用顺序和链式两种存储结构实现 实验报告格式及要求:按附件中实验报告模版书写。(具体要求见四)

数据结构图实验报告

数据结构教程 上机实验报告 实验七、图算法上机实现 一、实验目的: 1.了解熟知图的定义和图的基本术语,掌握图的几种存储结构。 2.掌握邻接矩阵和邻接表定义及特点,并通过实例解析掌握邻接矩阵和邻接表的类型定义。 3.掌握图的遍历的定义、复杂性分析及应用,并掌握图的遍历方法及其基本思想。 二、实验内容: 1.建立无向图的邻接矩阵 2.图的xx优先搜索 3.图的xx优先搜索 三、实验步骤及结果: 1.建立无向图的邻接矩阵: 1)源代码: #include "stdio.h" #include "stdlib.h" #define MAXSIZE 30 typedefstruct{charvertex[MAXSIZE];//顶点为字符型且顶点表的长度小于MAXSIZE intedges[MAXSIZE][MAXSIZE];//边为整形且edges为邻近矩阵

}MGraph;//MGraph为采用邻近矩阵存储的图类型 voidCreatMGraph(MGraph *g,inte,int n) {//建立无向图的邻近矩阵g->egdes,n为顶点个数,e为边数inti,j,k; printf("Input data of vertexs(0~n-1): \n"); for(i=0;ivertex[i]=i; //读入顶点信息 for(i=0;iedges[i][j]=0; //初始化邻接矩阵 for(k=1;k<=e;k++)//输入e条边{}printf("Input edges of(i,j): "); scanf("%d,%d",&i,&j); g->edges[i][j]=1; g->edges[j][i]=1;}void main(){inti,j,n,e; MGraph *g; //建立指向采用邻接矩阵存储图类型指针 g=(MGraph*)malloc(sizeof(MGraph));//生成采用邻接举证存储图类型的存储空间}2)运行结果: printf("Input size of MGraph: "); //输入邻接矩阵的大小scanf("%d",&n); printf("Input number of edge: "); //输入邻接矩阵的边数scanf("%d",&e);

相关文档
相关文档 最新文档