(完整版)数据结构课程设计报告
数据结构课程设计实验报告完整版
数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。
二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。
在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。
三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。
2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。
3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。
4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。
5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。
四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。
2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。
通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。
3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。
链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。
在实现链表时,我们定义了一个节点结构,包含数据域和指针域。
通过指针的方式将节点连接起来,形成一个链式结构。
同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。
4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。
数据结构课程设计实验报告 完整版
第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构课程设计(5篇)
数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。
三、具体要求1)利用完全二叉树的性质建立一棵二叉树。
(层数不小于4层)2)统计树叶子结点的个数。
3)求二叉树的深度。
4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。
四、进度安排依照教学计划,课程设计时间为:2周。
本设计要求按照软件工程的基本过程完成设计。
建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
三个阶段时间分配的大概比例是:35: 45: 20。
五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。
其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。
4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。
5、源代码要求在关键的位置有注释,增加程序的可读性。
程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。
数据结构课程设计报告范例
Guangxi University of Science and Technology 课程设计报告课程名称:算法和编程综合实习课题名称:姓名:学号:院系:计算机科学和通信工程学院专业班级:通信指导教师:完成日期:2015年1月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所示,求出一条从入口到出口的通路,或得出没有通路的结论。
图A2.2设计要求:要求设计程序输出如下:(1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。
数据结构课程设计-表达式求值【完整版】
XXXXXX大学《数据结构》课程设计报告班级:学号:姓名:指导老师:目录一算术表达式求值一、需求分析二、程序得主要功能三、程序运行平台四、数据结构五、算法及时间复杂度六、测试用例七、程序源代码二感想体会与总结算术表达式求值一、需求分析一个算术表达式就是由操作数(operand)、运算符(operator)与界限符(delimiter)组成得。
假设操作数就是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号与表达式起始、结束符“#”,如:#(7+15)*(23—28/4)#。
引入表达式起始、结束符就是为了方便.编程利用“算符优先法”求算术表达式得值.二、程序得主要功能(1)从键盘读入一个合法得算术表达式,输出正确得结果。
(2)显示输入序列与栈得变化过程。
三、程序运行平台Visual C++6、0版本四、数据结构本程序得数据结构为栈。
(1)运算符栈部分:struct SqStack //定义栈{char *base; //栈底指针char *top; //栈顶指针intstacksize; //栈得长度};intInitStack (SqStack &s) //建立一个空栈S{if (!(s、base= (char *)malloc(50*sizeof(char))))exit(0);s、top=s、base;s、stacksize=50;return OK;}char GetTop(SqStack s,char &e) //运算符取栈顶元素{if (s、top==s、base) //栈为空得时候返回ERROR{ﻩ printf("运算符栈为空!\n");ﻩ return ERROR;}elsee=*(s、top-1); //栈不为空得时候用e做返回值,返回S得栈顶元素,并返回OK returnOK;}int Push(SqStack&s,char e) //运算符入栈{if (s、top—s、base >= s、stacksize)ﻩ{printf("运算符栈满!\n");ﻩs、base=(char*)realloc(s、base,(s、stacksize+5)*sizeof(char));//栈满得时候,追加5个存储空间if(!s、base)exit (OVERFLOW);s、top=s、base+s、stacksize;s、stacksize+=5;}ﻩ*(s、top)++=e;//把e入栈ﻩreturn OK;}int Pop(SqStack &s,char &e) //运算符出栈{if (s、top==s、base) //栈为空栈得时候,返回ERROR{printf("运算符栈为空!\n”);ﻩ return ERROR;}else{ﻩﻩe=*-—s、top;//栈不为空得时候用e做返回值,删除S得栈顶元素,并返回OK return OK;}}int StackTraverse(SqStack&s)//运算符栈得遍历{ﻩchar *t;ﻩt=s、base;ﻩif (s、top==s、base){ﻩ printf(”运算符栈为空!\n”); //栈为空栈得时候返回ERRORreturn ERROR;}while(t!=s、top){ﻩﻩprintf(" %c",*t); //栈不为空得时候依次取出栈内元素t++;ﻩ}return ERROR;}(2)数字栈部分:struct SqStackn//定义数栈{int *base; //栈底指针int*top; //栈顶指针int stacksize; //栈得长度};intInitStackn (SqStackn &s) //建立一个空栈S{s、base=(int*)malloc(50*sizeof(int));if(!s、base)exit(OVERFLOW);//存储分配失败s、top=s、base;s、stacksize=50;return OK;}int GetTopn(SqStackn s,int&e) //数栈取栈顶元素{if(s、top==s、base){printf("运算数栈为空!\n");//栈为空得时候返回ERRORﻩ return ERROR;}elseﻩe=*(s、top-1);//栈不为空得时候,用e作返回值,返回S得栈顶元素,并返回OKreturnOK;}int Pushn(SqStackn &s,int e) //数栈入栈{if(s、top—s、base>=s、stacksize){ﻩﻩprintf("运算数栈满!\n");//栈满得时候,追加5个存储空间ﻩs、base=(int*)realloc (s、base,(s、stacksize+5)*sizeof(int));if(!s、base) exit (OVERFLOW);ﻩs、top=s、base+s、stacksize;//插入元素e为新得栈顶元素s、stacksize+=5;}*(s、top)++=e; //栈顶指针变化returnOK;}int Popn(SqStackn &s,int &e)//数栈出栈{ﻩif (s、top==s、base){ﻩ printf("运算符栈为空!\n");//栈为空栈得视时候,返回ERRORﻩ return ERROR;ﻩ}else{ﻩﻩe=*—-s、top;//栈不空得时候,则删除S得栈顶元素,用e返回其值,并返回OK ﻩreturnOK;}}int StackTraversen(SqStackn &s)//数栈遍历{ﻩint*t;ﻩt=s、base ;ﻩif(s、top==s、base)ﻩ{printf("运算数栈为空!\n”);//栈为空栈得时候返回ERRORﻩ return ERROR;ﻩ}ﻩwhile(t!=s、top)ﻩ{printf(” %d”,*t); //栈不为空得时候依次输出t++;}return ERROR;}五、算法及时间复杂度1、算法:建立两个不同类型得空栈,先把一个‘#’压入运算符栈。
《数据结构》课程设计报告范本(doc 8页)
《数据结构》课程设计报告范本(doc 8页)《数据结构》课程设计报告一、课程设计的内容、要求1 线性表的另一种实现。
对顺序表空间被耗尽问题的一个解决办法是:当数组溢出时,用一个更大的数组替换该数组。
一个较好的法则是:当出现溢出时,数组长度加长一倍具有较高的时间和空间效率。
参照教材中顺序表的有关内容,按上面的要求实现顺序表,并测试当数组溢出时你的实现的运作情况。
二、所采用的数据结构ADT List{数据对象: D = {a i|a i ∈ElemSet, i=1,2…n>=0}数据关系: R1={<a i-1, a i>|a i-1, a i∈D, i=1,2,…,n}基本操作:void IniList(SqList& L);void DestroyList(SqList& L);bool ListEmpty(SqList L);int ListLength(SqList L);void GetElem(SqList L, int i, Elem &e);bool PriorElem(SqList L, Elem cur_e, Elem &pre_e);bool NextElem(SqList L, Elem cur_e, Elem &next_e);void ListInsert(SqList &L, int i, Elem e);void ListDelete(SqList &L, int i);void ClearList(SqList& L);}三、主要模块(或函数)及其功能typedef struct LIST{ElemType *data;int size;int max_size;}LIST;void InitList(LIST *list)//初始化{list->data = (int*)malloc(sizeof(ElemType)*INIT_SIZE);list->size = 0;list->max_size = INIT_SIZE;}void DestroyList(LIST &list){}bool NextElem(LIST list,int cur_e,int &next_e)//后继{if(cur_e < 0 || cur_e > list.size) return false;else{next_e = cur_e + 1;return true;}}void Insert(LIST *list,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}list->data[list->size] = value;list->size++;}void Insert_Back(LIST *list,int idx,ElemType value){if(list->size>=list->max_size){int i;ElemType *temp = (int*)malloc(sizeof(ElemType)*list->size*2);cout<<endl<<"线性表原容量改变:原大小为"<<list->max_size;for(i=0;i<list->size;i++){temp[i] = list->data[i];}free(list->data);list->data = temp;list->max_size*=2;cout<<"改变后大小"<<list->max_size<<endl;}if(idx>list->size){list->data[list->size] = value;}else{int i;for(i=list->size;i>idx;i--){list->data[i] = list->data[i-1];}list->data[idx] = value;}list->size++;}void ListDelete(LIST *list,int i,ElemType *e)//删除一个元素{int j;*e=list->data[i];for(j=i+1;j<=list->size-1;j++)list->data[j-1]=list->data[j];list->size--;}void Print_list(LIST *list){int i;if(list->size == 0){cout<<"当前线性表内没有元素。
《数据结构》课程设计报告
《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。
本课程目标如下:1. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。
3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。
本课程针对高年级学生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。
在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。
通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。
2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。
3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。
4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。
教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。
数据结构课程设计报告(最终版)
数据结构课程设计报告
题目:
组长:
成员:
成员:
成员:
成员:
成员:
指导教师:
年月日
一、课程设计题目:
二、问题定义:(由教师指定)
三、需求分析
以明确的无歧义的陈述说明课程设计的任务,强调的是程序要做什么?并明确规定:
1、输入的形式和输入值的范围;
2、输出的形式;
3、程序所能达到的功能;
4、算法涉及的基本理论分析:比如对文件压缩,算法用到了
Huffman树,就要从理论上对文件压缩的几种方式、Huffman树的定义、Huffman编码的原理、解码的过程等进行分析。
5、题目研究和实现的价值。
四、算法设计
1、概要设计
阐述说明本算法中用到的所有数据结构的定义及其含义、主程序的流程以及各程序模块之间的层次(调用)关系。
3.详细设计
(1)实现概要设计中定义的所有数据类型;
(2)所有函数的接口描述;
(3)所有函数的算法描述(只需要写出伪码算法);
(3)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序),可采用流程图、N – S 图或PAD图进行描述
(4)画出函数的调用关系图。
五、算法实现
以附件形式
六、软件测试
这里的测试主要是基于功能的黑盒测试,所以首先提出测试的功能点,然后给出测试数据(包括正确的输入及其输出结果和含有错误的输入及其输出结果。
)
要求在附件里给出软件的基本数据和测试数据。
七、技术讨论(可选)
八、收获与体会
九、软件运行的部分截图及说明。
数据结构专业课程设计方案报告模板参考
数据结构专业课程设计方案报告模板参考嘿,大家好!今天我来给大家分享一份关于数据结构专业课程的方案设计报告。
作为一名有着十年经验的大师,我可是见证了各种方案的诞生和演变。
那么,咱们废话不多说,直接进入主题吧!一、课程设计背景数据结构是计算机科学与技术领域的基础课程,对于培养同学们的逻辑思维能力、编程能力和算法设计能力具有重要意义。
随着信息技术的不断发展,数据结构的应用越来越广泛,已经成为各类软件开发、等领域的基础。
因此,本课程设计旨在帮助同学们掌握数据结构的基本原理和算法,提高同学们的实际编程能力。
二、课程设计目标1.理解数据结构的基本概念,熟悉各类数据结构的特点和应用场景。
2.学会使用常见的数据结构进行问题求解,具备分析问题和设计算法的能力。
3.掌握数据结构的基本算法,能够实现并优化相关算法。
三、课程设计内容1.线性表定义和特点常见操作(插入、删除、查找、排序等)应用场景(顺序存储、链式存储等)2.栈和队列定义和特点常见操作(入栈、出栈、入队、出队等)应用场景(递归、表达式求值、广度优先搜索等)3.树与二叉树定义和特点常见操作(创建、遍历、查找、插入、删除等)应用场景(查找排序、哈希表、优先队列等)4.图定义和特点常见操作(创建、遍历、查找、最短路径等)应用场景(社交网络、地图导航、最小树等)5.算法设计与分析常见算法(排序、查找、图算法等)时间复杂度分析空间复杂度分析四、课程设计方法1.理论教学:通过课堂讲解,使同学们了解数据结构的基本概念、原理和方法。
2.实践教学:通过上机实验,让同学们动手实现相关算法,提高编程能力。
3.课后作业:布置一些具有代表性的题目,让同学们独立思考,巩固所学知识。
五、课程设计评价1.课堂表现:考察同学们的出勤、发言、作业完成情况等。
2.上机实验:考察同学们的编程能力、算法实现情况等。
3.课后作业:考察同学们对知识点的掌握程度。
六、课程设计进度安排1.第一周:线性表2.第二周:栈和队列3.第三周:树与二叉树4.第四周:图5.第五周:算法设计与分析注意事项:1.理解深度与广度平衡每个数据结构都有其深奥的理论和复杂的实现细节,但初学者容易陷入要么只懂皮毛要么过度深入研究两极分化的困境。
数据结构课程设计报告(完整版)[1]
第二题:电梯模拟1、需求分析:模拟某校九层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留。
九个楼层由下至上依次称为地下层、第一层、第二层、……第八层,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;如果电梯在某层静止时间超过300t,则驶回1层侯命。
而题目的最终要求输出时:按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。
2、设计2.1设计思想:(1)数据结构设计本题中的电梯的变化,是一个动态变化的过程,要在动态过程中实现正常跳转,首先要确定各种跳转的状态,因而这里我使用枚举类型来表示电梯的各种状态的:enum {up,down,stop,home}State(home);同时初始化最初状态为电梯在本垒层。
而在电梯的运行过程中对于乘客来说,显然有一个进入电梯与出电梯的队列,因而在这里我是用的链表来实现这个过程的,同时用结构体来保存该乘客的信息:typedef struct passage{int now;//乘客当前所在的位置int dis;//乘客的目地地int wait;//最长的等待的时间int waitnow;//已经等待的时间struct passage *next;}Passage;虽然电梯中的状态是由枚举类型来实现的,但是在整个程序的运行过程中,我还是为电梯设置了一个结构体类型,以便保存更多的信息:typedef struct lift{int count_C;//计数电梯已到达的层数int count_A;//系统的总时间计数器记得必须初始化为0int flag_in[High];//九个楼层有无请求的标志哪个楼层如果有请求该标志置1int num;//等待队列中的人数记得要进行初始化为0int people;//电梯中人数int flag_out[High];}Lift;(2)算法设计顾名思义本程序在运行的过程中用到的算法便是—“电梯算法”,电梯算法借鉴了磁盘寻道C-LOOK算法,即电梯向一个方向运行,直到这个方向上没有服务为止。
数据结构课设报告
传入的s是字符串型编码,将s扩展到32位(进行位运算,不足的在后面补零),最终返回的是4个字节长度的unsignedint型编码。
解码:
voiddecode(unsignedinta,char*buf) {
for(inti = 0; i < 32; i++) {
buf[i] = (((a>> (31 - i)) & 0x1) != 0) ?'1':'0';
第一种解决方式就是改成fscanf读取,其遇到EOF返回-1;
第二种解决方式就是设置两个计数器,一个记录写入的个数,一个记录读取的个数。
5.总结(收获与体会)
本次数据结构课程设计从选题开始,便选择了一个大一就比较感兴趣的文本编码解码问题。哈夫曼编码本身在上学期的课程中就已经讲解得明白透彻,理解起来比较容易。这次课程设计,一方面是对之前哈夫曼树基本知识的巩固;另一方面也是在选择两个权值最小的叶子节点上方式的创新——使用了堆排序的思想。在上学期的课程中,对堆排序其实更多的是概念的理解:怎么建初堆、怎么调整、怎么排序……如果想要掌握更深层次的代码,还需要自己再进行扩展思考。
(3)根据字符频率构建哈夫曼树,并给出每个字符的哈夫曼编码,其中求最小权值要求用堆实现;
(4)利用已建好的哈夫曼树,将文本文件进行编码,将编码结果保存到文件中(code.dat)。
(5)根据相应哈夫曼编码,对编码后的文件进行译码,将code.dat文件译码为txt文件,与原文件(source.txt)进行比较。
{
if(HT[f].lchild == c)//都是下标,存储的也都是下标
cd[--start] ='0';//数组里面倒数第二个元祖,start初始为n-1
数据结构课程设计报告
数据结构课程设计报告引言:数据结构是计算机科学中一门重要的基础课程,它研究了如何组织和存储数据,以及如何高效地操作和访问数据。
本文将介绍我在数据结构课程设计中的实践和收获。
一、项目背景与需求分析我们的课程设计项目是设计一个图书管理系统,该系统能够实现图书的录入、查询、借阅和归还等功能。
通过这个项目,我们既能够巩固数据结构的知识,又能够提高我们的编程能力。
在进行需求分析时,我们首先明确了系统的功能需求和非功能需求。
功能需求包括图书的录入、查询、借阅和归还等基本操作,非功能需求则包括系统的性能、可靠性和用户友好性等。
二、系统设计与实现1. 数据结构的选择在设计图书管理系统时,我们需要选择合适的数据结构来存储图书的信息。
考虑到图书的数量较大且需要频繁地进行查询和操作,我们选择了哈希表作为存储图书信息的数据结构。
哈希表具有快速的插入和查询操作,能够提高系统的性能。
2. 数据的存储与管理为了实现图书的录入、查询、借阅和归还等功能,我们设计了相应的数据结构和算法。
首先,我们使用哈希表来存储图书的信息,每本图书都有一个惟一的图书编号。
当用户查询图书时,系统会根据图书编号快速地找到对应的图书信息。
当用户借阅或者归还图书时,系统会相应地更新图书的状态。
3. 系统的性能优化为了提高系统的性能,我们采取了一些优化措施。
首先,我们使用了合适的哈希函数来减少哈希冲突的发生。
其次,我们对系统进行了分块处理,将图书按照一定的规则分成多个块,每一个块都有一个独立的哈希表来存储图书的信息。
这样可以减少每次查询时需要扫描的图书数量,提高查询的效率。
三、系统测试与评估在完成系统设计和实现后,我们进行了一系列的测试和评估。
首先,我们进行了功能测试,验证系统是否能够正常地完成图书的录入、查询、借阅和归还等操作。
其次,我们进行了性能测试,测试系统在不同规模的数据集下的响应时间和吞吐量。
最后,我们进行了用户体验测试,邀请一些用户使用系统,并采集他们的反馈意见。
数据结构课程设计报告
数据结构课程设计报告设计报告一、项目简介:本项目是一个基于C++语言的数据结构课程设计,旨在通过实践巩固学习的数据结构知识,并提高编程能力和问题解决能力。
二、项目背景:数据结构是计算机科学中非常重要的一门课程,它研究的是数据的组织、存储和操作方法。
通过学习数据结构可以更好地理解和分析各种算法,并能够设计和实现高效的程序。
三、项目目标:本项目的主要目标是设计和实现一些常见的数据结构,包括链表、栈、队列、二叉树、图等。
通过实现这些数据结构,可以进一步加深对其特性和功能的理解,并能够灵活地应用于实际问题的解决。
四、项目内容:本项目主要包括以下几个部分:1. 链表:实现单链表、双链表和循环链表,并实现相关的操作,如插入、删除、查找等。
2. 栈:实现顺序栈和链式栈,并实现相关的操作,如入栈、出栈、判空、判满等。
3. 队列:实现顺序队列和链式队列,并实现相关的操作,如入队、出队、判空、判满等。
4. 二叉树:实现二叉树的创建、遍历(前序、中序、后序)、搜索等操作,并实现相关的应用,如表达式树、堆等。
5. 图:实现邻接矩阵和邻接表两种表示方法,并实现图的创建、深度优先搜索、广度优先搜索等操作,并实现相关的应用,如最小生成树、最短路径等。
6. 其他数据结构:根据实际需要,可以设计和实现其他一些数据结构,如哈希表、二叉搜索树等。
五、项目实施计划:1. 学习和理解数据结构的基本概念和特性。
2. 分析和设计各个数据结构的实现方法和相关操作。
3. 使用C++语言实现各个数据结构,并编写相应的测试程序进行验证。
4. 进行性能测试和功能测试,并进行相关的优化和改进。
5. 编写项目文档,包括设计报告、使用说明等。
六、项目成果:1. 完成了各个数据结构的设计和实现。
2. 实现了相应的测试程序进行验证和功能测试。
3. 编写了项目文档,包括设计报告、使用说明等。
七、项目总结:通过这个数据结构课程设计项目,我深入学习了各种常用数据结构的实现和应用,提高了自己的编程能力和问题解决能力。
数据结构课程设计报告(完结)
《数据结构》课程设计手册一、 栈的使用(一)需求分析本程序通过java 语言完成栈的构造,对堆栈的数据进行基本的存储操作。
具体包括,数据的入栈、出栈、读取等。
入栈操作:要求用户从键盘出入要进栈的数值或字符,对栈满的情况作出提示。
出栈操作:删除栈顶元素,并将删除的数据或字符在运行结果中显示。
对栈空的情况作出提示。
读取操作:在插入和删除的任意阶段都可讲栈中的元素读取出来,能够实现对栈中的数据元素个数进行统计。
(二)概要设计1.为了实现上述程序功能,需要定义栈的数据类型有: static int MAX=5;static String[] item =new String[MAX]; static int top; 2.本程序包含4个函数Push() 初始条件:栈未满 操作结果:往栈中插入数据; Pop() 初始条件:存在非空栈 操作结果:将栈中的数据删除;Get() 初始条件:存在非空栈 操作结果:显示非空栈中的所有元素; Main() 操作结果:调用以上函数。
程序流程图:Main() Pop()Push() Get()(三)详细设计具体代码见Stack.java基本操作:Stack()构造一个空的栈,初始状态top的指针为-1;入栈方法public static void push()。
该方法中,首先判断是否栈满(top>=MAX-1),如果栈满,则输出提示语“栈满 ,栈中最多能容纳5个元素”,否则从键盘输入数据,并且top指针加1。
出栈方法public static void pop()。
首先判断是否栈空(top<0),如果栈空,则输出提示信息“栈空 ,没有可操作的元素”,否则删除栈顶元素。
Top指针减1。
get()方法public static void get()。
如果栈非空,则显示栈中的元素,并通过count计算出栈中的元素个数。
主函数public static void main()通过switch-case语句调用相应的方法,从而实现栈的全部操作。
数据结构课程设计报告
数据结构课程设计报告学生姓名李娜学号*********班级地信10901长江大学2011.6目录1.需求分析 (3)1.1课程设计目的 (3)1.2课程设计内容 (3)1.3课程设计步骤 (4)1.4课程设计要求 (4)2.逻辑设计 (5)2.1运行环境 (5)2.2系统流程图 (5)3.详细设计 (11)4.调试过程 (22)4.1调试过程中出现的问题和处理方式 (22)4.2调试分析 (23)4.3调试结果 (23)4.总结 (26)5.附录(源代码) (27)1.需求分析:1.1课程设计目的《数据结构》主要介绍一些常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
数据结构课程设计是为数据结构课程独立开设的实践性教学环节。
数据结构课程设计对于巩固数据结构知识,加强学生的实际动手能力和提高学生综合素质是十分必要的。
课程设计的目的:1.要求学生达到熟练掌握C语言的基本知识和技能。
2.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。
3.提高程序设计和调试能力。
通过上级机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
4.培养算法分析能力。
分析所设计算法的时间复杂度和空间复杂度,进一步提高程序设计水平。
5.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
1.2课程设计内容(1)线性链表基本操作的实现问题描述:线性链表的插入、删除、遍历等操作的实现。
基本要求:要求生成线性表时,可以键盘上读取元素输出形式:有中文提示,链表元素为整形。
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,完成相关的功能要求。
数据结构课程设计报告
数据结构课程设计报告1. 引言在计算机科学领域中,数据结构是指组织和存储数据的方式,以便于使用和管理。
数据结构的设计和实现对于编程任务的效率和性能具有重要的影响。
本篇报告将针对我们在数据结构课程中的设计项目进行说明和总结。
2. 选题背景我们的选题是实现一个图书馆管理系统,旨在帮助图书馆更好地管理图书借阅和归还的流程。
这个系统涉及到图书馆的各个方面,包括图书的分类、借阅记录、读者信息等。
通过实现该系统,我们希望进一步理解和应用数据结构的概念和方法。
3. 数据结构的选择为了实现图书馆管理系统,我们需要选择合适的数据结构来组织和存储相关数据。
在该系统中,我们选择了以下几种数据结构:- 数组:用于存储图书的基本信息,如书名、作者、出版社等。
数组的随机访问特性使得可以快速地获取某本书的信息。
- 链表:用于存储读者的信息和借阅记录。
链表的插入和删除操作比较高效,符合图书馆管理系统中动态变化的需求。
- 栈:用于实现借书还书的操作。
栈的后进先出特性使得操作的顺序可以得到有效的控制。
4. 系统功能我们的系统包括以下功能:- 图书信息管理:包括添加图书、删除图书、更新图书信息等功能。
通过数组和链表的结合使用,我们可以实现对图书信息的动态管理。
- 读者信息管理:包括添加读者、删除读者、查询读者信息等功能。
同样使用链表结构,可以快速记录和查询读者的信息。
- 借阅和归还处理:通过栈的结构,实现借阅图书和归还图书的操作。
栈的先进后出特性确保了操作的顺序合理且安全。
- 查询功能:可以根据图书的编号、作者、出版社等条件进行图书和读者的查询操作。
通过数组和链表的结合,实现了高效的查询功能。
5. 实现过程与挑战在实现该系统的过程中,我们遇到了许多挑战。
其中一个主要的挑战是如何处理并发操作,例如同时有多个读者同时借阅图书或者查询图书的情况。
我们通过引入互斥锁和条件变量等机制,确保了数据的一致性和正确性。
6. 总结与展望通过本次的数据结构课程设计项目,我们深入了解了数据结构的应用和实践。
数据结构课程设计报告pdf
数据结构课程设计报告pdf一、课程目标知识目标:1. 让学生掌握数据结构的基本概念,包括线性表、树、图等结构的特点和应用场景。
2. 使学生了解常见的数据结构算法,如排序、查找等,并能运用到实际问题中。
3. 帮助学生理解算法复杂度分析,包括时间复杂度和空间复杂度,能够评估算法的优劣。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,能够根据问题选择合适的数据结构进行建模。
2. 提高学生的编程能力,使其能够熟练地使用所学数据结构编写高效、可读性强的代码。
3. 培养学生独立分析和解决问题的能力,通过实际项目案例,学会运用所学知识进行系统设计。
情感态度价值观目标:1. 培养学生对计算机科学的兴趣和热情,激发他们主动探索数据结构及相关领域的欲望。
2. 培养学生的团队协作精神,学会在团队中沟通、分工与合作,共同完成任务。
3. 培养学生具备良好的编程习惯,注重代码规范和优化,提高代码质量。
课程性质:本课程为高年级专业核心课程,旨在帮助学生建立扎实的计算机科学基础,提高编程能力和问题解决能力。
学生特点:学生具备一定的编程基础,具有较强的逻辑思维能力,对数据结构有一定了解,但尚需深入学习和实践。
教学要求:结合学生特点,课程注重理论与实践相结合,强调动手实践和实际应用。
通过案例分析和项目实战,使学生掌握数据结构的核心知识,提高解决实际问题的能力。
教学过程中,关注学生的个体差异,提供个性化指导,确保课程目标的达成。
二、教学内容本课程教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、链表、树、图等结构的特点和基本操作。
2. 算法复杂度分析:时间复杂度和空间复杂度,常见算法复杂度分析。
3. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序等。
4. 查找算法:顺序查找、二分查找、哈希查找等。
5. 树和图的应用:二叉树、平衡树、图的基本算法(深度优先搜索、广度优先搜索等)。
6. 线性表的应用:栈和队列的应用,链表操作等。
数据结构课程设计报告 (附有完整可运行出来的代码)
课程设计报告设计题目:公园导游图一、流程图二、程序代码#include<iostream>using namespace std;#include<stdio.h>typedef struct //定义图结构{int n; /* 图的顶点个数*/char v[100]; /* 顶点信息*/int e[100][100]; /* 边信息*/int shor; /* 最短路径信息*/}park;park *luru(park *x){int j,k;cout<<"请输入公园景点个数"<<endl;cin>>x->n;if(x->n<=0){cout<<"个数输入错误,请重新输入"<<endl;cin>>x->n;}cout<<"请输入景点名称,每个名称只允许一个字符代替"<<endl;for(j=0;j<x->n;j++)cin>>x->v[j];cout<<"请输入景点之间的路径长度,只允许整数型数值,无路径长度的输入0"<<endl;for(j=0;j<x->n;j++)for(k=0;k<x->n;k++){cout<<"请输入第"<<j+1<<"行"<<"第"<<k+1<<"列的路径长度"<<endl;cin>>x->e[j][k];}return x;}int search(park *x){char start,end,temp;int i=0,j=0,temp_1,temp1=10000;cout<<"请输入要查找的起始景点名称"<<endl;cin>>start;while(i<x->n && start!=x->v[i])i++;if(i==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}cout<<"请输入要查找的终点景点名称"<<endl;cin>>end;while(j<x->n && end!=x->v[j]){j++;if(j==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}x->shor=x->e[i][j];temp_1=x->e[i][j];for (int k=0;k<x->n;k++)//两个顶点最小权值判断{if (x->e[i][k]==0||x->e[k][j]==0 )continue;if(x->shor > x->e[i][k] + x->e[k][j]){x->shor = x->e[i][k] + x->e[k][j];temp=x->v[k];}}if(x->shor==0){cout<<"这两个节点中没有连通路,按任意键返回"<<endl;return 0;}if(x->shor==temp_1){cout<<"最短路径信息: "<<start<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;if(x->shor<temp_1 && x->shor<=temp1){cout<<"最短路径信息: "<<start<<"->"<<temp<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;}cout<<"查找失败,按任意键返回"<<endl;getchar();return 0;}int main(){park x;int i=1;luru(&x);do{search(&x);cout<<"是否继续?"<<endl<<"1.继续"<<endl<<"0.退出"<<endl;cin>>i;}while(i!=0);return 0;}三、运行结果。
数据结构课程设计完整版
西安郵電學院数据结构课程设计报告题目:魔王语言翻译/多项式相乘系部名称:专业名称:班级:学号:学生姓名:指导教师:时间:一、课程设计目的通过本次课程设计,强化上机动手能力,使我们在理论和实践的基础上进一步巩固《C语言程序设计》、《数据结构——使用C语言》课程学习的内容,初步掌握工程软件设计的基本方法,熟知链表,栈,队以及文件的使用方法,学会将知识应用于实际,提高分析和解决问题的能力,为毕业设计和以后工作打下基础。
二、课程设计内容【1】、魔王语言问题描述有一个魔王总是使用自己的一种非常精炼的而抽象的语言讲话,没有人能听懂。
但他的语言是能够逐步解释成人能听懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:(1)α→β1β2 ……βm(2)(θδ1δ2 ……δn)→θδnθδn-1 …… θδ1 θ在这两种形式中,从左到右均表示解释;从右到左均表示抽象。
试写一个魔王语言的解释系统,把他的话解释成人能听懂的话。
基本规则现在有以下三种规则,设大写字母表示魔王语言解释的词汇,小写字母表示人的语言的词汇;希腊字母表示可以用大写或小写替换的变量。
魔王语言可含人的词汇。
(1)B->tAdA(2)A->sae(3)示例:魔王说:B(ehnxgz)B解释成人的语言:tsaedsaeezegexenehetsaedsae若每个小写字母含义如下表示:t d s a e z g x n h天地上一只鹅追赶下蛋恨则魔王说的话是:天上一只鹅地上一只鹅鹅追鹅赶鹅下鹅蛋鹅恨鹅天上一只鹅地上一只鹅【2】、多项式相乘问题描述用带头结点的动态单链表来表示多项式,在此基础上完成多项式的乘法运算。
三、需求分析对所开发系统功能、性能的描述,想要实现的目标。
【1】魔王语言有一个魔王总是使用自己的一种非常精炼的而抽象的语言讲话,没有人能听懂。
但他的语言是能够逐步解释成人能听懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告一.前沿:排序是数据结构中的一块难点,也是重点。
熟练的掌握各种各样的排序算法是对每个编程人员的基本的要求。
历年的考研还是期末考中,排序都占了比较大的比重。
二.程序实现的功能:本程序采用了各种不同的方法对同一个输入进行排序,且每一个元素其本身亦是一个结构体,又可以进行扩充,使其可以存储其他的相关的信息。
在此我仅仅举了结构体本身只有一个元素的情况。
a)采用的数据类型:为了讨论的方便,本程序采用了复合型的结构体类型,且才用了静态线性表的形式,不能进行扩充,一旦空间开辟,就不能在扩充(注意)。
具体如下:typedef struct{ //每个元素的类型定义,为了讨论的方便本程序采用了单关键字;int key; //但可以根据需要扩充,每个关键字令其为整型的;}redtype;typedef struct{ //开辟的数组,以上述类型的元素组成;redtype *r; //存入要输入的元素的数组;int length; //数组的长度,shellsort中要用到;}sqlist;四.对部分头文件和函数的说明:<conio.h>:改头文件主要用来实现清屏,使得出的结果更清晰明白。
“shellsort(sqlist l,int d)”:该函数主要实现希尔排序,使无序的数据排列成有序的序列“quicksort(sqlist l,int low,int high)”:该函数实现的功能同上,只是原理不同“heapadjust(sqlist l,int s,int m)”:该函数实现调整无序的数据序列使其成为大顶堆,即树型结构的最上面是值最大的,这样进过一次的调整便得到了值最大的元素,即可进过多次的排序使一个无序的序列又序。
“heapsort(sqlist l)”:该函数实现建立堆的过程。
在其中间调用heapadjust实现最终建立大顶的任务。
“oesort(sqlist l,int n)”:该函数进行奇偶排序将无序的数据排成有序的。
五.核心程序算法:void shellsort(sqlist& l,int d){//采用希尔排序,本程序中的l.r[0].key使暂存单元,非哨兵。
d=l.length/2;while(d>0){for(i=d+1;i<=l.length;++i)if(l.r[i].key<l.r[i-d].key){l.r[0]=l.r[i];for(j=i-d;j>0&&l.r[0].key<l.r[j].key;j-=d)l.r[j+d]=l.r[j];l.r[j+d]=l.r[0];}d=d/2;}基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。
所有距离为dl的倍数的记录放在同一个组中。
先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法void quicksort(sqlist& l,int low,int high){//快速排序if(low<high) );//对r[low..high]进行一次快速排序{i=low;j=high;l.r[0]=l.r[i];do{while(i<j&&l.r[j].key>l.r[0].key)--j;if(i<j){l.r[i]=l.r[j];++i;}while(i<j&&l.r[i].key<=l.r[0].key)++i;if(i<j){l.r[j]=l.r[i];--j;}}while(i!=j);l.r[i]=l.r[0];quicksort(l,low,i-1); 对r[low..i-1]进行快速排序quicksort(l,i+1,high); 对r[I+1.high]进行快速排序基本思想设当前待排序的无序区为r[low..high],利用分治法可将快速排序的基本思想描述为:①分解:在r[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间r[low..pivotpos-1]和r[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
注意:划分的关键是要求出基准记录所在的位置pivotpos。
划分的结果可以简单地表示为(注pivot=r[pivotpos])r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..hi gh].keys 其中low≤pivotpos≤high。
②求解:通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和r[pivotpos+1..high]快速排序。
③组合:因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。
对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
void heapadjust(sqlist &l,int s,int m){// /筛选法调整堆,使其成为大顶堆rc=l.r[s].key;for(j=2*s;j<=m;j*=2){if(j<m&&l.r[j].key<l.r[j+1].key)j++;if(rc>l.r[j].key)break;l.r[s].key=l.r[j].key;s=j;}l.r[s].key=rc;}void heapsort(sqlist &l){//建堆的过程for(i=l.length/2;i>0;i--)heapadjust(l,i,l.length);for(i=l.length;i>1;i--){t=l.r[1].key,l.r[1].key=l.r[i].key,l.r[i].key=t;heapadjust(l,1,i-1);}}基本思想:堆排序利用了大根堆堆顶记录的关键字最大这一特征,使得在当前无序区中选取最大关键字的记录变得简单。
先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区。
再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录r[n]交换,由此得到新的无序区r[1..n-1]和有序区r[n],且满足r[1..n-1].keys≤r[n].key。
由于交换后新的根R[1]可能违反堆性质,故应将当前无序区r[1..n-1]调整为堆。
然后再次将r[1..n-1]中关键字最大的记录r[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区r[1..n-2]和有序区r[n-1..n],且仍满足关系r[1..n-2].keys≤r[n-1..n].keys,同样要将r[1..n-2]调整为堆。
直到无序区只有一个元素为止。
void oesort(sqlist& l,int n){//奇偶交换排序change=1;标志变量,若其为零,即两次更替的交换中都没有交换数据,即排序结束while(change){change=0;for(i=1;i<n;i+=2)//堆奇数进行一趟排序if(l.r[i].key>l.r[i+1].key){t=l.r[i].key,l.r[i].key=l.r[i+1].key,l.r[i+1].key=t;change=1;}for(i=2;i<n;i+=2)//堆偶数进行一趟排序if(l.r[i].key>l.r[i+1].key){t=l.r[i].key,l.r[i].key=l.r[i+1].key,l.r[i+1].key=t;change=1;}}}算法过程:①第一趟对序列中的所有奇数项i扫描,②第二趟对序列中的所有偶数项i扫描。
若ri] > r[i+1],则交换它们。
③第三趟有对所有的奇数项,第四趟对所有的偶数项,……④如此反复,直到整个序列全部排好序为止。
五.源程序:#include "stdio.h"#include "malloc.h"#include "conio.h"#define maxsize 5typedef struct{int key;}redtype;typedef struct{redtype *r;int length;}sqlist;void shellsort(sqlist l,int d){int i,j;d=l.length/2;while(d>0){for(i=d+1;i<=l.length;++i)if(l.r[i].key<l.r[i-d].key){l.r[0]=l.r[i];for(j=i-d;j>0&&l.r[0].key<l.r[j].key;j-=d) l.r[j+d]=l.r[j];l.r[j+d]=l.r[0];}d=d/2;}}void quicksort(sqlist l,int low,int high) {int i,j;if(low<high){i=low;j=high;l.r[0]=l.r[i];do{while(i<j&&l.r[j].key>l.r[0].key) --j;if(i<j){l.r[i]=l.r[j];++i;}while(i<j&&l.r[i].key<=l.r[0].key) ++i;if(i<j){l.r[j]=l.r[i];--j;}}while(i!=j);l.r[i]=l.r[0];quicksort(l,low,i-1);quicksort(l,i+1,high);}}void heapadjust(sqlist l,int s,int m) {int rc,j;rc=l.r[s].key;for(j=2*s;j<=m;j*=2){if(j<m&&l.r[j].key<l.r[j+1].key) j++;if(rc>l.r[j].key)break;l.r[s].key=l.r[j].key;s=j;}l.r[s].key=rc;};void heapsort(sqlist l){int i,t;for(i=l.length/2;i>0;i--)heapadjust(l,i,l.length);for(i=l.length;i>1;i--){t=l.r[1].key,l.r[1].key=l.r[i].key,l.r[i].key=t; heapadjust(l,1,i-1);}}void oesort(sqlist l,int n){int t,i,change;change=1;while(change){change=0;for(i=1;i<n;i+=2)if(l.r[i].key>l.r[i+1].key){t=l.r[i].key,l.r[i].key=l.r[i+1].key,l.r[i+1].key=t; change=1;}for(i=2;i<n;i+=2)if(l.r[i].key>l.r[i+1].key){t=l.r[i].key,l.r[i].key=l.r[i+1].key,l.r[i+1].key=t; change=1;}}}main(){int i,j,low,high,a[maxsize+1];char ch;sqlist l;clrscr();l.r=(redtype *)malloc(maxsize*sizeof(int));if(!l.r)printf("overflow");l.length=0;printf("\n\nplease input five elements:\n\n"); for(i=1;i<maxsize+1;i++){scanf("%d",&a[i]);l.length++;}getchar();do{for(j=1,i=1;j<maxsize+1;i++,j++)l.r[i].key=a[j];printf("\n\nWelcome to use PanWeiFeng's KeChenSheJi\n\n"); printf("s:shellsort\tq:quicksort\n\n");printf("h:heapsort\te:oesort\n\n");printf("o:quit\n\n");printf("please input the way:");ch=getchar();clrscr();printf("\n\nthe orignal array:");for(i=1;i<maxsize+1;i++)printf("%d ",l.r[i].key);printf("\n\n");/*printf("please input the way:");ch=getchar();*/getchar();switch(ch){case 's':shellsort(l,l.length);printf("\n\nthe odered arry:"); for(i=1;i<maxsize+1;i++)printf("%d ",l.r[i].key);printf("\n\n");break;case 'q':low=1;high=l.length;quicksort(l,low,high);printf("\n\nthe odered arry:"); for(i=1;i<maxsize+1;i++)printf("%d ",l.r[i].key);printf("\n\n");break;case 'h':heapsort(l);printf("\n\nthe odered arry:"); for(i=1;i<maxsize+1;i++)printf("%d ",l.r[i].key);printf("\n\n");break;case 'e':oesort(l,l.length);printf("\n\nthe odered arry:");for(i=1;i<maxsize+1;i++)printf("%d ",l.r[i].key);printf("\n\n");break;case 'o':exit(0);default:printf("\n\nerror!write again!\n");}}while(1);}六.程序运行结果:当你编译连接通过后,运行。