排序综合数据结构课程设计论文

排序综合数据结构课程设计论文
排序综合数据结构课程设计论文

天津职业技术师范大学

课程设计任务书

理学院数学0902 班学生(16)马新月课程设计课题:

16、综合排序:

利用随机函数随机产生N=200个随机整数,对这些数进行多种方法的排序。要求:1)至少采用三种方法实现上述问题求解(插入排序、希尔排序、冒泡排序、快速排序、堆排序、归并排序)。把排序后的结果存在不同的文

件中。

2)记录不同排序方法的运行时间,找出自己排序方法中最快的两种方法。

3)统计每种算法所用的比较次数和交换次数,以列表显示出来。

一、课程设计工作日自 2012 年 2 月 21 日至 2012 年

3 月

4 日

二、同组学生:马新月

三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时

间、主要参考资料等):

课题来源:教师提供

课题类型:设计

课程设计的目的

1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操

作实现算法,以及它们在程序中的使用方法。

2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力

天津职业技术师范大学

课程设计评审表学院班学生

1概要

1.1设计目的

数据结构与算法课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。学习数据结构与算法是为了将实际问题中涉及的对象在计算机中表示出来并对它们进行处理。通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

1)本演示程序对以下6种常用的内部排序算法进行实测比较:冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序;

2)待排序表的元素的关键字为整数。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动);

3)演示程序以以用户和计算机的对话方式执行,在计算机终端上显示提示信息,对随机数组进行排序,并输出比较指标值;

4)最后对结果作出简单分析。

1.2预期目标

按要求输入不同的操作。输入后,根据不同的输入进行不同的操作,最终达到对各算法进行比较的目的。通过此次课程设计主要达到以下目的了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

2排序算法

2.1各排序算法的特点

1)冒泡排序

冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。

2)直接插入排序

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

3)简单选择排序

(1)在一组元素V[i]~V[n-1]中选择具有最小排序码的元素(2)若它不是这组元素中的第个元素,则将它与这一组元素中的第一个元素对调;(3)在这组元素中剔除这个具有最小排序码的元素,在剩下的元素V[i+1]~V[n-1]中重复执行第(1)(2)步,直到剩余元素只有一个为止。

4)快速排序

首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序;

5)希尔排序

先取一个正整数d1

6) 堆排序

堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素;堆的定义: N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2]);

2.2各算法的比较方法

1.稳定性比较

插入排序、冒泡排序、简单选择排序及其他线形排序是稳定的

希尔排序、快速排序、堆排序是不稳定的

2.时间复杂性比较

插入排序、冒泡排序、选择排序的时间复杂性为O(n2)

其它非线形排序的时间复杂性为O(nlog2n)

线形排序的时间复杂性为O(n);

3.辅助空间的比较

线形排序的辅助空间为O(n),其它排序的辅助空间为O(1);

4.其它比较

插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。

反而在这种情况下,快速排序反而慢了。

当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。

若待排序的记录的关键字在一个明显有限范围内时,且空间允许是用桶排序。

当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下,宜用归并排序。

当n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序

3流程图及详细算法

3.1流程图

函数的调用关系图反映了演示程序的层次结构:

图3.1 流程图

3.2流程图模块说明

1)Main为主函数模块

2)bubblesort,insertsort,selectsort,quicksort,shellsort,heansort分别对应冒泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序的各函数模块

3)在初始化数据之后,选择对应的排序模块进行排序,并对排序做出比较

3.3可排序表的抽象数据类型定义:

typedef struct{ //定义一个RedType型结构体,存放关键字

int key; //关键字为整型

} RedType;

class LinkList //定义一个顺序表

{

public:

RedType r[MAXSIZE+1]; //长度为MAXSIZE+1的数组r,数组里每个元素均为RedType

int Length; //数组长度

int CmpNum, ChgNum; //关键字的比较次数,移动次数

LinkList(); //构造函数

bool LT(int i, int j); //比较i和j的大小

void Display(); //输出数组元素

void Insert( int dk); //插入排序

void ShellSort(); //希尔排序

int Partition( int low, int high); //比基准小的数放左边,比起大的数放右边,返回基准位置

void QSort( int low, int high); //从low到high位置进行快速排序

void QuickSort(); //对有序表进行快速排序

void HeapAdjust( int s, int m); //将无序堆调整为大顶堆

void HeapSort(); //堆排序,将大顶堆转换为小顶堆

void BubbleSort(); //冒泡排序

int SelectMinKey( int k); //找到数组中最小值,返回最小值位置

void SelSort(); //对顺序表进行选择排序

void SelectSort(); //界面设计

void AllAbove(); //统计以上所有排序关键字的比较次数、移动次数及所消耗的时间

};

3.4程序代码

3.4.1 函数声明

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXSIZE 1000

#define TRUE 1

#define FALSE 0

typedef int BOOL;

typedef struct{

int key;

} RedType;

class LinkList

{

public:

RedType r[MAXSIZE+1];

int Length;

int CmpNum, ChgNum; LinkList();

bool LT(int i, int j);

void Display();

void Insert( int dk);

void ShellSort();

int Partition( int low, int high); void QSort( int low, int high); void QuickSort();

void HeapAdjust( int s, int m); void HeapSort();

void BubbleSort();

int SelectMinKey( int k);

void SelSort();

void SelectSort();

void AllAbove();

};

LinkList::LinkList(){

int i;

for (i = 0; i <= MAXSIZE; i++) r[i].key = rand()%1000; Length=MAXSIZE+1; CmpNum=0;

ChgNum=0;

}

bool LinkList::LT(int i, int j){ (CmpNum)++;

if (i < j)

return TRUE;

else

return FALSE;

}

void LinkList::Display()

{

int j;

for(int i=0;i<=MAXSIZE;i++)

{

cout<

if(++j%10==0)

cout<

}

cout<

}

4.3.2六种排序算法代码

//插入排序

void LinkList::Insert(int dk){

int i, j;

RedType Temp;

for (i = dk; i < Length; i++)

{

if (LT(r[i].key, r[i - dk].key))

{

memcpy(&Temp, &r[i], sizeof(RedType));

for (j = i - dk; j >= 0 && LT(Temp.key, r[j].key); j -= dk)

{

(ChgNum)++;

memcpy(&r[j + dk], &r[j], sizeof(RedType));

}

memcpy(&r[j + dk], &Temp, sizeof(RedType));

}

}

}

//希尔排序

void LinkList::ShellSort()

{

int t=Length+1;

do{

t=t/3+1;

Insert( t);

}

while(t>1);

}

//快速排序

int LinkList::Partition(int low, int high){

RedType Temp;

int PivotKey;

memcpy(&Temp, &r[low], sizeof(RedType)); PivotKey = r[low].key;

while (low < high){

while (low < high &&r[high].key >= PivotKey){

high--;

(CmpNum)++;

}

(ChgNum)++;

memcpy(&r[low], &r[high], sizeof(RedType));

while (low < high && r[low].key <= PivotKey){

low++;

(CmpNum)++;

}

(ChgNum)++;

memcpy(&r[high], &r[low], sizeof(RedType)); }

memcpy(&r[low], &Temp, sizeof(RedType)); return low;

}

void LinkList::QSort( int low, int high){

int PivotLoc = 0;

if (low < high){

PivotLoc = Partition( low, high);

QSort(low, PivotLoc - 1);

QSort( PivotLoc + 1, high);

}

}

void LinkList::QuickSort(){

QSort(0, Length - 1);

}

//堆排序

void LinkList::HeapAdjust(int s, int m){

RedType Temp;

int j = 0;

s++;

memcpy(&Temp, &r[s - 1], sizeof(RedType));

for (j = 2 * s; j <= m; j *= 2){

if (j < m && LT(r[j - 1].key, r[j].key))

++j;

if (!LT(Temp.key, r[j - 1].key))

break;

(ChgNum)++;

memcpy(&r[s - 1], &r[j - 1], sizeof(RedType));

s = j;

}

memcpy(&r[s - 1], &Temp, sizeof(RedType));

}

void LinkList::HeapSort(){

int i = 0;

RedType Temp;

for (i = Length / 2-1; i >= 0; i--)

HeapAdjust(i, Length);

for (i = Length; i > 1; i--){

memcpy(&Temp, &r[0], sizeof(RedType));

(ChgNum)++;

memcpy(&r[0], &r[i - 1], sizeof(RedType));

memcpy(&r[i - 1], &Temp, sizeof(RedType));

HeapAdjust( 0, i - 1);

}

}

//冒泡排序

void LinkList::BubbleSort(){

int i, j;

RedType temp;

for (i = 1; i <= MAXSIZE; i++){

for (j = 1; j <= MAXSIZE - i; j++){

if (!LT(r[j].key, r[j + 1].key)){

(ChgNum)++;

memcpy(&temp, &r[j], sizeof(RedType));

memcpy(&r[j], &r[j + 1], sizeof(RedType));

memcpy(&r[j + 1], &temp, sizeof(RedType));

}

}

}

}

//选择排序

int LinkList::SelectMinKey( int i)

{

int Min = i;

for (int k=i; k < Length; k++)

{

if (!LT(r[Min].key, r[k].key))

Min = k;

}

return Min;

}

void LinkList::SelSort(){

int i, j;

RedType temp;

for (i = 0; i < Length; i++){

j = SelectMinKey( i);

if (i != j){

(ChgNum)++;

memcpy(&temp, &r[i], sizeof(RedType));

memcpy(&r[i], &r[j], sizeof(RedType));

memcpy(&r[j], &temp, sizeof(RedType));

}

}

}

4.3.3 排序算法的选择

void LinkList::SelectSort(){

cout<<"1. 插入排序"<

cout<<"2. 希尔排序"<

cout<<"3. 快速排序"<

cout<<"4. 堆排序"<

cout<<"5. 冒泡排序"<

cout<<"6. 选择排序"<

cout<<"7. 以上各种排序"<

cout<<"8. 退出程序"<

cout<<"请选择需要进行的操作:"<

}

void LinkList::AllAbove(){

int TempTime;

int SpendTime;

cout<

LinkList();

cout<<"插入排序:"<

TempTime = (int)GetTickCount();

Insert( 1);

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

LinkList();//随机数列复位

cout<

cout<<"希尔排序:"<

TempTime = (int)GetTickCount();

ShellSort();

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

LinkList(); //随机数列复位

cout<

cout<<"快速排序:"<

TempTime = (int)GetTickCount();

QuickSort();

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

LinkList(); //随机数列复位

cout<

cout<<"堆排序:"<

TempTime = (int)GetTickCount();

HeapSort();

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

LinkList(); //随机数列复位

cout<

cout<<"冒泡排序:"<

TempTime = (int)GetTickCount();

BubbleSort();

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

LinkList(); //随机数列复位

cout<

cout<<"选择排序:"<

TempTime = (int)GetTickCount();

SelSort();

SpendTime = (int)GetTickCount() - TempTime;

cout<

cout<<"CompareNumber="<

}

4.3.4主函数程序代码

void main(){

int i,j;

int select = 0;

int SpendTime = 0;

int TempTime;

do{

LinkList L;

L.SelectSort();

cin>>select;

switch (select)

{

case 1:

cout<<"插入排序前:"<

L.Display();

cout<<"插入排序后:"<

TempTime = (int)GetTickCount();

L.Insert(1);

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 2:

cout<<"希尔排序前:"<

L.Display();

cout<<"希尔排序后:"<

cout<

TempTime = (int)GetTickCount();

L.ShellSort();

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 3:

cout<<"快速排序前:"<

L.Display();

cout<<"快速排序后:"<

TempTime = (int)GetTickCount();

L.QuickSort();

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 4:

cout<<"堆排序前:"<

L.Display();

cout<<"堆排序后:"<

TempTime = (int)GetTickCount();

L.HeapSort();

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 5:

cout<<"冒泡排序前:"<

L.Display();

cout<<"冒泡排序后:"<

TempTime = (int)GetTickCount();

L.BubbleSort();

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 6:

cout<<"选择排序前:"<

L.Display();

cout<<"选择排序后:"<

TempTime = (int)GetTickCount();

L.SelSort();

SpendTime = (int)GetTickCount() - TempTime;

L.Display();

cout<

cout<<"比较次数="<

break;

case 7:

L.AllAbove();

break;

default:

cout<<"please input numbers again"<

break;

}

}

while(select!=8);

}

4运行结果

4.1调试分析

1.对正序、逆序和若干不同程度随机打乱的可排序表,进行各种排序方法的比较测试,得到的测试数据具有较好的典型性和可比较性。通过设计和实现指定程序的随机乱序算法,对伪随机数序列的产生有了具体的认识和实践。

2.将排序算法中的关键字比较和交换分别由Less和Swap两个内部操作实现,较好的解决了排序算法的关键字比较次数和移动次数的统计问题。而赋值是直接统计的。

3.本实习作业采用循序渐进的策略,首先设计和实现可排序表的建立和随机操作,然后用插入排序验证各种内部辅助操作的正确性,进而逐个加入其他排序算法,最后完成对测试结果的显示。调试能力有了提高。

4.2输入输出

1.进入程序后即显示文本方式的用户界面:

图5.1 进入程序后的界面

2.开始运行时的用户界面:

1)输入1回车,即得直接插入排序的排序结果及其关键字比较次数和移动次数和时间。如图5.2:

图5.2 输入1后的运行结果

2)输入2回车,即得希尔排序的排序结果及其关键字比较次数和移动次数及时间,如图5.3:

图5.3 输入2后的运行结果

3)输入3回车,即得快速排序的排序结果及其关键字比较次数和移动次数及时间,如图5.4:

图5.4 输入3后的运行结果

4)输入4回车,即得堆排序的排序结果及其关键字比较次数和移动次数及时间,如图5.5:

图5.5 输入4后的运行结果

5)输入5回车,即得冒泡排序的排序结果及其关键字比较次数和移动次数及时间,如图5.6:

图5.6 输入5后的运行结果

6)输入6回车,即得选择排序的排序结果及其关键字比较次数和移动次数及时间,如图5.7:

图5.7 输入6后的运行结果

7)输入7回车,即得以上所有排序的排序结果及其关键字比较次数和移动次数及时间,如图5.8:

图5.8 输入7后的运行结果

8)输入8回车,即退出该程序。

数据结构课程设计参考题目

数据结构课程设计题目 数据结构课程设计题目(大题目).doc 一、公司销售管理系统 项目开发基本要求 1.客户信息管理:对客户的基本信息进行添加、修改和删除。 2.产品信息管理:对产品的基本信息进行添加、修改和删除。 3.供应商信息管理:对供应商的基本信息进行添加、修改和删除。 4.订单信息管理:对订单的基本信息进行添加、修改和删除。 二、高校科研管理系统 系统主要用于帮助高校或科研单位管理和维护各项科研相关资料 项目开发基本要求 1.系统用户管理模块:为系统新用户设置用户名及口令;操作员更改自己的系统口令。2.数据字典管理模块:管理项目性质包括:分为国家自然科学基金、863、部省科委及企业集团四种情况;范围包括:分为全国、国际、地方三种情况;检索源包括:分为EI、SCI、核心和一般四种情况。 3.项目参加人员管理模块包括:显示添加修改删除查询。 4.项目基本情况模块包括:显示添加修改删除查询。 5.项目获奖情况模块包括:显示添加修改删除查询。 6.期刊论文管理模块包括:显示添加修改删除查询。 7.著作管理模块包括:显示添加修改删除查询。 8.科研工作量统计模块:按照学校科研工作量计算办法,为每位科研人员进行科研工作量的计算和统计。 9.科研积分统计模块:按照学校科研积分计算办法,为每位科研人员进行科研计分的计算和统计。 三、网络五子棋对战 四、不同排序算法模拟 五、科学计算器 数据结构课程设计题目 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)能统计各学校总分,

数据结构课程设计报告模板

《数据结构I》三级项目报告 大连东软信息学院 电子工程系 ××××年××月

三级项目报告注意事项 1. 按照项目要求书写项目报告,条理清晰,数据准确; 2. 项目报告严禁抄袭,如发现抄袭的情况,则抄袭者与被抄袭者均 以0分计; 3. 课程结束后报告上交教师,并进行考核与存档。 三级项目报告格式规范 1. 正文:宋体,小四号,首行缩进2字符,1.5倍行距,段前段后 各0行; 2. 图表:居中,图名用五号字,中文用宋体,英文用“Times New Roman”,位于图表下方,须全文统一。

目录 一项目设计方案 (3) 二项目设计分析 (4) 三项目设计成果 (4) 四项目创新创业 (5) 五项目展望 (6) 附录一:项目成员 (6) 附录二:相关代码、电路图等 (6)

一项目设计方案 1、项目名称: 垃圾回收 2、项目要求及系统基本功能: 1)利用数据结构的知识独立完成一个应用系统设计 2)程序正常运行,能够实现基本的数据增加、删除、修改、查询等功能3)体现程序实现算法复杂度优化 4)体现程序的健壮性 二项目设计分析 1、系统预期实现基本功能: (结合本系统预期具体实现,描述出对应基本要求(增、删、改、查等)的具体功能) 1. 2. 3. 4. 5. 6. 7. 2、项目模块功能描述 (基本分为组织实施组织、程序功能模块编写、系统说明撰写等。其中程序功能子模块实现) 模块一: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块二: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块n: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

数据结构拓扑排序课程设计

课题二拓扑排序 2.1 问题的提出2.1 问题的提出 任务:编写函数实现图的拓扑排序。 程序所实现的功能:建立对应的邻接表,对该图进行拓扑排序,并显示排序 结果。 输入: 顶点数, 边数及各顶点信息(数据格式为整形) 输出: 拓扑排序结果。 2. 2 概要设计 1.拓扑排序是指由某个集合上的一个偏序得到该集合上的一个全序。更直观地讲,一个偏序是自反的、反对称的,用图表示时每个点都有环且只有单向边。拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。 2.解决拓扑排序的方法如下: (1)在有向图中选一个没有前驱的顶点且输出之。 (2)从图中删除该顶点和所有以它为尾的弧。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。具体的算法实现参照源程序。 3.构造邻接表图:typedef struct{ AdjList vertices; int vexnum,arcnum; }Graph;//邻接表图 4.为了避免重复检测入度为零的顶点,源程序中设了一个栈,暂存所有入度为零的顶点:typedef struct stack{ int *base; int *top; int stacksize;

}sqstack;//栈的结构,存储图的顶点序号 2.3 流程图2.根据算法思想,画流程图如下:

2.4 源代码 //采用尾插法创的邻接图 #include using namespace std; const int MAX=20; const int STACK_INIT_SIZE=100; const int ERROR=0; typedef struct stack{ int *base; int *top; int stacksize; }sqstack;//栈的结构,存储图的顶点序号 typedef struct lnode { int adjvex; struct lnode *next; }ArcNode;//弧结点 typedef struct node2 { char data; ArcNode *fristarc; }VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧 typedef struct{ AdjList vertices; int vexnum,arcnum; }Graph;//邻接表图 void Initstack(sqstack &s) { s.base=new int;

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

数据结构课程设计报告

山东建筑大学 课程设计成果报告 题目: 1.数组实现两个矩阵的相乘运算 2.成绩分析问题 课程:数据结构A课程设计 院(部):管理工程学院 专业:信息管理与信息系统 班级:信管*** 学生姓名:*** 学号:******** 指导教师:******* 完成日期:2016年12月29日

目录 目录 (2) 一、课程设计概述 (3) 二、课程设计题目一 (3) 用数组实现两个矩阵的相乘运算 (3) 2.1[问题描述] (3) 2.2[要求及提示]: (3) 2.3[详细设计] (4) 2.4[调试分析] (5) 2.5[运行结果及分析] (5) 三、课程设计题目二 (6) 成绩分析问题 (6) 3.1[问题描述] (6) 3.2[概要设计] (6) 3.3[存储结构] (7) 3.4[流程图] (7) 3.5[详细设计] (8) 3.6[调试分析] (8) 3.7[运行结果及分析] (22) 四、参考文献: (25)

一、课程设计概述 本次数据结构课程设计共完成两个题:用数组实现两个矩阵相乘运算、成绩分析问题。使用语言:C 编译环境:vc6.0 二、课程设计题目一 用数组实现两个矩阵的相乘运算 2.1[问题描述] #include “stdio.h” int r[6][6]; void mult(int a[6][6] , int b[6][6]){ } main(){ int i,j; int num1[6][6],num2[6][6]; printf(“请输入第一个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num1[i][j]); printf(“请输入第二个矩阵的值:”,); for(i=1;i<=6;i++) for(j=1;j<=6;j++) scanf(“%d”,&num2[i][j]); mult(num1,num2); printf(“\n两个矩阵相乘后的结果为:”); for(i=1;i<=6;i++) {for(j=1;j<=6;j++) printf(“%4d”,r[i][j]); printf(“\n”); } } 2.2[要求及提示]: 1、要求完善函数mult( ),

拓扑排序课程设计报告

数据结构课程设计 设计题目:有向图拓扑排序 专业:信息与计算科学 学号:021240616 姓名:黄秋实 指导教师:文军 2013年11月28日

数据结构课程设计 ----拓扑排序 一需求分析 1.问题描述 本次课程设计题目是:用邻接表构造图然后进行拓扑排序,输出拓扑排序序列 拓扑排序的基本思想为: 1).从有向图中选一个无前驱的顶点输出;2).将此顶点和以它为起点的弧删除;3). 重复1),2)直到不存在无前驱的顶点;4). 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。 2.拓扑排序有向图拓朴排序算法的基本步骤如下:①从图中选择一个入度为0的顶点,输出该顶点;②从图中删除该顶点及其相关联的弧,调整被删弧的弧头结点的入度(入度-1);③重复执行①、②直到所有顶点均被输出,拓朴排序完成或者图中再也没有入度为0的顶点(此种情况说明原有向图含有环)。 3基本要求 (1) 输入的形式和输入值的范围; 首先是输入要排序的顶点数和弧数,都为整型,中间用分隔符隔开;再输入各顶点的值,为正型,中间用分隔符隔开;然后输入各条弧的两个顶点值,先输入弧头,再输入弧尾,中间用分隔符隔开,输入的值只能是开始输入的顶点值否则系统会提示输入的值的顶点值不正确,请重新输入,只要继续输入正确的值就行。 (2) 输出的形式; 首先输出建立的邻接表,然后是最终各顶点的出度数,再是拓扑排序的序列,并且每输出一个顶点,就会输出一次各顶点的入度数。 (3) 程序所能达到的功能; 因为该程序是求拓扑排序,所以算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用顶点表示活动,有向边就表示活动间先后顺序,那么输出的拓扑序列就表示各顶点间的关系为反映出各点的存储结构,以邻接表存储并输出各顶点的入度。 二概要设计 1. 算法中用到的所有各种数据类型的定义 在该程序中用邻接表作为图的存储结构。首先,定义表结点和头结点的结构类型,然后定义图的结构类型。创建图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。 拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。 2.各程序模块之间的层次调用关系 第一部分,void ALGraph *G函数构建图,用邻接表存储。这个函数没有调

数据结构课程设计(内部排序算法比较_C语言)

数据结构课程设计 课程名称:内部排序算法比较 年级/院系:11级计算机科学与技术学院 姓名/学号: 指导老师: 第一章问题描述 排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。

第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。 (2)选择2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

数据结构课程设计独立题目

题目2:运动会分数统计 1.问题描述 参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 2.功能要求 1)可以输入各个项目的前三名或前五名的成绩; 2)能统计各学校总分; 3)可以按学校编号、学校总分、男女团体总分排序输出; 4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。 。 题目6:哈夫曼编/译码器 1.问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。 2.功能要求 I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile 中。 D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。 题目9:构造可以使n个城市连接的最小生成树 1.问题描述 给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。 2.功能要求 城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。

数据结构课程设计报告(0002)

数据结构课程设计报告

数据结构课程设计报告 学院:信息工程 专业:信息工程 老师:陈占龙 姓名:郝宝亮 学号:20111001149 班号:116112-05

2013年1月 目录 控制台 1.停车场管理 (3) 2.个人电话号码查询系统 (6) 3.排序运用 (12) 4.“火烧连营”问题 (16) 5.管道铺设施工的最佳方案选择 (19) MFC 1.停车场管理 (27) 2.个人电话号码查询系统 (29) 3.排序运用 (34) 总结 自我总结 (38)

实习题目一停车场管理 【问题描述】 设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【设计思想】 以栈模拟停车场,以队列模拟车场外的便

道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号以及到达或离去的时刻。对每一组输入的数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场推出来的汽车,也用顺序存 储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。【设计表示】 输入数据 停离 判断停车场计算停车费

数据结构课程设计:拓扑排序和关键路径复习进程

数据结构课程设计:拓扑排序和关键路径

1 ABSTRACT 1.1图和栈的结构定义 struct SqStack////栈部分 { SElemType *base;//栈底指针 SElemType *top;//栈顶指针 int stacksize;//栈的大小 int element_count;//栈中元素个素 }; /////////AOE网的存储结构 struct ArcNode //表结点 { int lastcompletetime;//活动最晚开始时间 int adjvex; //点结点位置 int info; //所对应的弧的权值 struct ArcNode *next;//指向下一个表结点指针 }; struct VNode //点结点 { VertexType data; //结点标志 int indegree; //该结点入度数 int ve; //记录结点的最早开始时间 int vl; //记录结点的最晚开始时间 struct ArcNode *first_out_arc; //存储下一个出度的表结点struct ArcNode *first_in_arc;//存储下一个入度的表结点 }; struct ALGraph

{ VNode *vertices; //结点数组 int vexnum; //结点数 int arcnum; //弧数 int kind; //该图的类型 }; 2系统总分析 2.1关键路径概念分析 2.1.1什么是关键路径 关键路径法(Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样CPM就应运而生了。对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。 2.1.2关键路径特点 关键路径上的活动持续时间决定了项目的工期,关键路径上所有活动的持续时间总和就是项目的工期。 关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完工时间的延迟。

数据结构课程设计-排序

一、问题描述 1、排序问题描述 排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。 本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。其中包括: (1)插入排序的有关算法:不带监视哨的直接插入排序的实现; (2)交换排序有关算法:冒泡排序、快速排序的实现; (3)选择排序的有关算法:直接选择排序、堆排序的实现; (4)归并排序的有关算法:2-路归并排序的实现。 2、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。 二、问题分析 本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。 冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。 冒泡排序的步骤: 1)置初值i=1; 2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j] 与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置; 3)i=i+1; 4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止; 要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。 快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。 快速排序步骤: 1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下

数据结构课程设计题目

《数据结构》课程设计题目 1. 排序算法的性能分析 问题描述 设计一个测试程序,比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 基本要求 (1)对冒泡排序、直接排序、选择排序、箱子排序、堆排序、快速排序及归并排序算法进行比较。 (2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动)。 (3)输出比较结果。 选做内容 (1)对不同表长进行比较。 (2)验证各算法的稳定性。 (3)输出界面的优化。 2. 排序算法思想的可视化演示—1 基本要求 排序数据随机产生,针对随机案例,对冒泡排序、箱子排序、堆排序、归并算法,提供排序执行过程的动态图形演示。 3. 排序算法思想的可视化演示—2 基本要求 排序数据随机产生,针对随机案例,,对插入排序、选择排序、基数排序、快速排序算法,提供排序执行过程的动态图形演示。 4. 线性表的实现与分析 基本要求 ①设计并实现线性表。 ②线性表分别采取数组(公式化描述)、单链表、双向链表、间接寻址存储方 式 ③针对随机产生的线性表实例,实现线性表的插入、删除、搜索操作动态演示(图 形演示)。 5. 等价类实现及其应用 问题描述:某工厂有一台机器能够执行n个任务,任务i的释放时间为r i(是一个整数),最后期限为d i(也是整数)。在该机上完成每个任务都需要一个单元的时间。一种可行的调

度方案是为每个任务分配相应的时间段,使得任务i的时间段正好位于释放时间和最后期限之间。一个时间段不允许分配给多个任务。 基本要求: 使用等价类实现以上机器调度问题。 等价类分别采取两种数据结构实现。 6. 一元稀疏多项式计算器 问题描述 设计一个一元稀疏多项式简单计算器。 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,c n,e n,其中n是多项式的项数,c i,e i,分别是第i项的系数和指数,序列按指数降序排序; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值; (6)计算器的仿真界面(选做) 7. 长整数的代数计算 问题描述 应用线性数据结构解决长整数的计算问题。设计数据结构完成长整数的表示和存储,并编写算法来实现两长整数的加、减、乘、除等基本代数运算。 基本要求 ①长整数长度在一百位以上。 ②实现两长整数在取余操作下的加、减、乘、除操作,即实现算法来求解a+b mod n, a-b mod n, a?b mod n, a÷b mod n。 ③输入输出均在文件中。 ④分析算法的时空复杂性。 8. 敢死队问题。 有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。 要求:至少采用两种不同的数据结构的方法实现。 9. 简单计算器

数据结构课程设计报告 合并果子问题

合肥学院 计算机科学与技术系 课程设计报告 2011 ~2012 学年第二学期 课程数据结构与算法 课程设计名称合并果子问题 学生姓名杜双双 学号1004013037 专业班级计算机科学与技术10级3班 指导教师李红陈艳平王竹婷 2012 年2 月

课程设计报告 一、问题分析和任务定义 此程序需要完成如下要求:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。 例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力3+12=15。可以证明15为最小的体力耗费值。 实现本程序需要解决以下几个问题: 1、要使每次合并的体力消耗最小应该选择数目最小的两堆果子,那么如何选择出两堆最小的呢? 2、选择出了两堆果子如何进行合并? 3、如何计算最小的体力耗费值? 本问题的关键和难点在于数据结构的选择,找出最优的方法,在此选择哈夫曼树数据结构。 示例:三种果子,果子数目分别为1,2,3 哈夫曼树 最小体力消耗值:3+6=9 二、数据结构的选择和概要设计 上面采用哈夫曼树,则其存储就是哈夫曼树的存储结构。采用数组顺序存储结点信息。每一个结点包括四个域:存放该结点的weight 域、分别存放其左右孩子结点在数组中下标的lchild 域和rchild 域,以及记录该结点的父结点信息的parent 域。 只需用一个主函数就能解决问题。 三、详细设计和编码 数据结构: typedef struct {

教学计划安排检验程序(拓扑排序)报告书

设计题目: 示例数据:输入:学期数:5,课程数:12,课程间的先后关系数:16,课程的代表值:v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12。课程间两两间的先后关系:v1 v2,v1 v3, v1 v4,v1 v12,v2 v3,v3 v5,v3 v7,v3 v8,v4 v5, v5 v7,v6 v8,v9 v10, v9 v11 , v9 v12,v10 v12,v11 v6 输出:第1学期应学的课程:v1 v9 第2学期应学的课程:v2 v4 v10 v11 第3学期应学的课程:v3 v6 v12 第4学期应学的课程:v5 v8 第5学期应学的课程:v7

一需求分析 1.1 引言 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义: 若集合X上的关系是R,且R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。 设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。 比较简单的理解:偏序是指集合中只有部分成员可以比较,全序是指集合中所有的成员之间均可以比较。 一般应用:拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。 1.2 拓扑排序的了解 ①.问题的描述 在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。拓扑排序可以应用于教学计划的安排,根据课程之

数据结构课程设计排序实验报告

《数据结构》课程设计报告 专业 班级 姓名 学号 指导教师 起止时间

课程设计:排序综合 一、任务描述 利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 要求:根据以上任务说明,设计程序完成功能。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)随机生成N个整数,存放到线性表中; (2)起泡排序并计算所需时间; (3)简单选择排序并计算时间; (4)希尔排序并计算时间; (5)直接插入排序并计算所需时间; (6)时间效率比较。 2、数据对象分析 存储数据的线性表应为顺序存储。 三、数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计

数据结构课程设计题目表

《数据结构》课程设计课题表 课题1:设计出链表结构的相关函数库,以便在程序设计中调用。要求: (1)包括线性表的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题2:设计出顺序表结构的相关函数库,以便在程序设计中调用。要求: (1)包括线性表的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题3:设计程序以实现任意两个高次多项式的加法和乘法运算。 要求: (1)所设计的数据结构应尽可能节省存储空间。 (2)程序的运行时间应尽可能少。 课题4:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。 要求:要检查有关运算的条件,并对错误的条件产生报警。 课题5:设计出二叉链表结构的相关函数库,以便在程序设计中调用。要求: (1)包括二叉树的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题6:设计出树结构的相关函数库,以便在程序设计中调用。要求: (1)包括树结构的存储结构及各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题7:选择合适的存储结构表示广义表,并能实现下列运算要求: (1)用大写字母表示广义表,用小写字母表示原子,并提供设置广义表的值的功能。 (2)取广义表L的表头和表尾的函数head(L)和tail(L)。

数据结构课程设计报告范例

Guangxi University of Science and Technology 课程设计报告 课程名称:算法与编程综合实习 课题名称: 姓名: 学号: 院系:计算机学院 专业班级:通信121 指导教师: 完成日期:2012年12月15日

目录 第1部分课程设计报告 (3) 第1章课程设计目的 (3) 第2章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 设计要求 (4) 第3章课程设计总体方案及分析 (4) 3.1 问题分析 (4) 3.2 概要设计 (7) 3.3 详细设计 (7) 3.4 调试分析 (10) 3.5 测试结果 (10) 3.6 参考文献 (12) 第2部分课程设计总结 (13) 附录(源代码) (14)

第1部分课程设计报告 第1章课程设计目的 仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方………………………………………………………………………………………………………………………………………………………………………………………..(省略)

第2章课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图A 2.2设计要求: 要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。

拓扑排序课程设计报告

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:拓扑排序算法 院(系):计算机学院 专业:计算机科学与技术(嵌入式系统方向) 班级:14010105班 学号:2011040101221 姓名:王芃然 指导教师:丁一军

目录 沈阳航空航天大学.................................................... I 1 课程设计介绍.. (1) 1.1课程设计内容 (1) 1.2课程设计要求 (1) 2 课程设计原理 (2) 2.1课设题目粗略分析 (2) 2.2原理图介绍 (2) 2.2.1 功能模块图 (2) 2.2.2 流程图分析 (3) 3 数据结构分析 (7) 3.1存储结构 (7) 3.2算法描述 (7) 4 调试与分析 (12) 4.1调试过程 (12) 4.2程序执行过程 (12) 参考文献 (15) 附录(关键部分程序清单) (16)

1 课程设计介绍 1.1 课程设计内容 由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。若在图一的有向图上人为的加一个表示V2<=V3的弧(“<=”表示V2领先于V3)则图一表示的亦为全序且这个全序称为拓扑有序,而由偏序定义得到拓扑有序的操作便是拓扑排序。在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。编写算法建立有向无环图,主要功能如下: 1.能够求解该有向无环图的拓扑排序并输出出来; 2.拓扑排序应该能处理出现环的情况; 3.顶点信息要有几种情况可以选择。 1.2 课程设计要求 1.输出拓扑排序数据外,还要输出邻接表数据; 2.参考相应的资料,独立完成课程设计任务; 3.交规范课程设计报告和软件代码。

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

相关文档
最新文档