北京理工大学数据结构实验报告4

合集下载

北理工数据结构实验 排序

北理工数据结构实验 排序

本科实验报告实验名称:排序一、实验目的2、通过编程、上机调试,进一步理解排序的方法。

3、具体尝试插入排序、快速排序、选择排序的操作步骤。

4、锻炼动手编程,独立思考的能力。

二、实验题目排序输入10个数,从插入排序、快速排序、选择排序三类算法中各选一种编程实现三、实验基础知识插入排序、快速排序、选择排序三类算法的基本思想四、实验设计方法1、概要设计(1)、插入排序(此次使用直接插入排序)void InsertionSort ( SqList &L ){ // 对顺序表L 作直接插入排序。

for ( i=2; i<=L.length; ++i )if (L.r[i].key < L.r[i-1].key){L.r[0] = L.r[i]; // 复制为监视哨for ( j=i-1; L.r[0].key < L.r[j].key; -- j )L.r[j+1] = L.r[j]; // 记录后移L.r[j+1] = L.r[0]; // 插入到正确位置}} // InsertSort(2)、快速排序(此次用的是起泡排序)V oid Bubblesort(elem R[],int n){I=n;While(i>1){lastExchangeIndex = 1;for(j=1;j<i;j++)if(R[j+1].key<R[j].key){swap(R[j],R[j+1]);lastExchangeIndex =j; //记下进行交换的记录位置}I=lastExchangeIndex ; //本趟进行过交换的最后一个记录的位置}//Bubblesort(3)、选择排序V oid selectsort(elem r[],int n){//对记录序列r[1..n]作简单选择排序。

for(i=1;i<n;++i){//选择第i小的记录,并交换到位j=selectminkey(r,i);//zai r[i..n]中选择关键字最小的记录if(i!=j) R[i] R[j];//与第i个记录交换}}//selectsort五、实验结果及数据分析数据为3 2 4 1 5 0 6 9 8 7的十个数的三种排序方法1、插入排序2、快速排序3、选择排序六、总结此次编程实验,较前几次而言稍微简单一点,并且以前用过起泡排序法,所以对排序方面比较熟悉,但是也遇到了一些问题,例如数组下标问题没处理好,让我在编程实践中花费了大量时间检查。

数据结构实验报告4

数据结构实验报告4

数据结构实验报告——实验4学号::得分:______________一、实验目的1、复习线性表的逻辑结构、存储结构及基本操作;2、掌握顺序表和(带头结点)单链表;3、了解有序表。

二、实验容1、(必做题)假设有序表中数据元素类型是整型,请采用顺序表或(带头结点)单链表实现:(1)OrderInsert(&L, e, int (*compare)(a, b))//根据有序判定函数compare,在有序表L的适当位置插入元素e;(2)OrderInput(&L, int (*compare)(a, b))//根据有序判定函数compare,并利用有序插入函数OrderInsert,构造有序表L;(3) OrderMerge(&La, &Lb, &Lc, int (*compare)())//根据有序判定函数compare,将两个有序表La和Lb归并为一个有序表Lc。

2、(必做题)请实现:(1)升幂多项式的构造,升幂多项式是指多项式的各项按指数升序有序,约定系数不能等于0,指数不能小于0;(2)两个升幂多项式的相加。

三、算法描述(采用自然语言描述)1.创建带头节点的链表,输入两个有序表数据La Lb归并两个有序表得有序表Lc输出三个有序表输入需插入数据e将e插入有序表Lc输出插入e后的Lc2.创建链表按指数升序输入多项式得序数和指数输出多项式按指数升序输入第二个多项式得序数和指数两个多项式相加输出第二个多项式和两个多项式得和四、详细设计(画出程序流程图)1.2.五、程序代码(给出必要注释)1.#include<stdio.h>#include<malloc.h>typedef struct LNode{int date;struct LNode *next;} LNode,*Link;typedef struct LinkList{Link head;//头结点int lenth;//链表中数据元素的个数} LinkList;int compare (LinkList *L,int e)//有序判定函数 compare {int Lc=0;Link p;p=L->head;p=p->next;while(p!=NULL){if(e>p->date){p=p->next;Lc++;}elsereturn Lc;}return Lc;}void OrderInsert (LinkList *L,int e,int (*compare)())//根据有序判定函数compare,在有序表L 的适当位置插入元素e;{Link temp,p,q;int Lc,i;temp=(Link)malloc(sizeof(LNode));temp->date=e;p=q=L->head;p=p->next;Lc=(*compare)(L,e);if(Lc==L->lenth){while(q->next!=NULL){q=q->next;}q->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;q=q->next;}q->next=temp;temp->next=p;}++L->lenth;}void OrderMerge (LinkList *La,LinkList *Lb,int (*compare)())//根据有序判定函数 compare ,将两个有序表 La 和 Lb 归并为一个有序表{int i,Lc=0;Link temp,p,q;q=La->head->next;while(q!=NULL){p=Lb->head;temp=(Link)malloc(sizeof(LNode));temp->date=q->date;Lc=(*compare)(Lb,q->date);if(Lc==Lb->lenth){while(p->next!=NULL){p=p->next;}p->next=temp;temp->next=NULL;}else{for(i=0; i<Lc; i++){p=p->next;}temp->next=p->next;p->next=temp;}q=q->next;++Lb->lenth;}}LinkList *Initialize (LinkList *NewList){int i;Link temp;NewList=(LinkList *)malloc((2+1)*sizeof(LinkList));for(i=0; i<2+1; i++){temp=(Link)malloc(sizeof(LNode));temp->date=0;temp->next=NULL;(NewList+i)->head=temp;(NewList+i)->lenth=0;}return NewList;}void Insert (LinkList *NewList){int a,i;char c;printf("在第1个表中插入数据,输入“ N ”再对下个表插入数据 \n");for(i=0; i<2; i++){while(1){scanf("%d",&a);c=getchar();if(c=='N'){if(i<2-2)printf("在第 %d个表中插入数据,输入“ N ”再对下个表插入数据 \n",i+2); else if(i==2-2)printf("在第 %d个表中插入数据,输入“ N ”结束。

数据结构实验报告_实验报告_

数据结构实验报告_实验报告_

数据结构实验报告想必学计算机专业的同学都知道数据结构是一门比较重要的课程,那么,下面是小编给大家整理收集的数据结构实验报告,供大家阅读参考。

数据结构实验报告1一、实验目的及要求1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们。

本实验训练的要点是“栈”和“队列”的观点;二、实验内容1) 利用栈,实现数制转换。

2) 利用栈,实现任一个表达式中的语法检查(选做)。

3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);三、实验流程、操作步骤或核心代码、算法片段顺序栈:Status InitStack(SqStack &S){S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}Status DestoryStack(SqStack &S){free(S.base);return OK;}Status ClearStack(SqStack &S){S.top=S.base;return OK;}Status StackEmpty(SqStack S){if(S.base==S.top)return OK;return ERROR;}int StackLength(SqStack S){return S.top-S.base;}Status GetTop(SqStack S,ElemType &e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base) return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;Status Push(SqStack &S,ElemType e){if(S.top-S.base>=S.stacksize){S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemTyp e));if(!S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status Pop(SqStack &S,ElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}Status StackTraverse(SqStack S){ElemType *p;p=(ElemType *)malloc(sizeof(ElemType));if(!p) return ERROR;p=S.top;while(p!=S.base)//S.top上面一个...p--;printf("%d ",*p);}return OK;}Status Compare(SqStack &S){int flag,TURE=OK,FALSE=ERROR; ElemType e,x;InitStack(S);flag=OK;printf("请输入要进栈或出栈的元素:"); while((x= getchar)!='#'&&flag) {switch (x){case '(':case '[':case '{':if(Push(S,x)==OK)printf("括号匹配成功!\n\n"); break;case ')':if(Pop(S,e)==ERROR || e!='('){printf("没有满足条件\n");flag=FALSE;}break;case ']':if ( Pop(S,e)==ERROR || e!='[')flag=FALSE;break;case '}':if ( Pop(S,e)==ERROR || e!='{')flag=FALSE;break;}}if (flag && x=='#' && StackEmpty(S)) return OK;elsereturn ERROR;}链队列:Status InitQueue(LinkQueue &Q) {Q.front =Q.rear=(QueuePtr)malloc(sizeof(QNode));if (!Q.front) return ERROR;Q.front->next = NULL;return OK;}Status DestoryQueue(LinkQueue &Q) {while(Q.front){Q.rear=Q.front->next;free(Q.front);Q.front=Q.rear;}return OK;}Status QueueEmpty(LinkQueue &Q){if(Q.front->next==NULL)return OK;return ERROR;}Status QueueLength(LinkQueue Q){int i=0;QueuePtr p,q;p=Q.front;while(p->next){i++;p=Q.front;q=p->next;p=q;}return i;}Status GetHead(LinkQueue Q,ElemType &e) {QueuePtr p;p=Q.front->next;if(!p)return ERROR;e=p->data;return e;}Status ClearQueue(LinkQueue &Q){QueuePtr p;while(Q.front->next ){p=Q.front->next;free(Q.front);Q.front=p;}Q.front->next=NULL;Q.rear->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,ElemType e) {QueuePtr p;p=(QueuePtr)malloc(sizeof (QNode));if(!p)return ERROR;p->data=e;p->next=NULL;Q.rear->next = p;Q.rear=p; //p->next 为空return OK;}Status DeQueue(LinkQueue &Q,ElemType &e) {QueuePtr p;if (Q.front == Q.rear)return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front; //只有一个元素时(不存在指向尾指针) free (p);return OK;}Status QueueTraverse(LinkQueue Q){QueuePtr p,q;if( QueueEmpty(Q)==OK){printf("这是一个空队列!\n");return ERROR;}p=Q.front->next;while(p){q=p;printf("%d<-\n",q->data);q=p->next;p=q;}return OK;}循环队列:Status InitQueue(SqQueue &Q){Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)exit(OWERFLOW);Q.front=Q.rear=0;return OK;}Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}int QueueLength(SqQueue Q){return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}Status DestoryQueue(SqQueue &Q){free(Q.base);return OK;}Status QueueEmpty(SqQueue Q) //判空{if(Q.front ==Q.rear)return OK;return ERROR;}Status QueueTraverse(SqQueue Q){if(Q.front==Q.rear)printf("这是一个空队列!");while(Q.front%MAXQSIZE!=Q.rear){printf("%d<- ",Q.base[Q.front]);Q.front++;}return OK;}数据结构实验报告2一.实验内容:实现哈夫曼编码的生成算法。

北理工数据结构实验遍历二叉树

北理工数据结构实验遍历二叉树

本科实验报告实验名称:遍历二叉树课程名称:数据结构实验时间:任课教师:实验地点:良乡机房实验教师:实验类型:□原理验证■综合设计□自主创新学生姓名:学号/班级:组号:学院:同组搭档:专业:成绩:一、实验目的1、熟悉VC环境,学习使用C语言实现树的基本操作。

2、通过编程、上机调试,进一步理解数、二叉数、拓展二叉数的基本概念。

3、了解并熟悉二叉数的存储结构及其各种操作,掌握各种二叉数的遍历方法。

4、锻炼动手编程,独立思考的能力。

二、实验题目遍历二叉树(1)问题描述遍历二叉树:要求:请输入一棵二叉树的扩展的前序序列,经过处理后生成一棵二叉树,然后对于该二叉树输出前序、中序和后序遍历序列。

例如:124*5***3**三、实验基础知识线性表、二叉树的基本概念的熟练掌握并实际运用。

并了解创建树、遍历二叉树的思想解决问题的能力四、实验设计方法1、概要设计为实现上述程序功能,首先需要二叉树的抽象数据结构。

⑴二叉树的抽象数据类型定义为:ADT BinaryTree {数据对象D:D是具有相同特性的数据元素的集合。

数据关系R:若D=Φ,则R=Φ,称BinaryTree为空二叉树;若D≠Φ,则R={H},H是如下二元关系;(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr =Φ;(3)若D1≠Φ,则D1中存在惟一的元素x1,<root,x1>∈H,且存在D1上的关系H1 ⊆H;若Dr≠Φ,则Dr中存在惟一的元素xr,<root,xr>∈H,且存在上的关系Hr ⊆H;H={<root,x1>,<root,xr>,H1,Hr};(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

基本操作:CreateTree(&T)操作结果:按先序次序建立二叉链表表示的二叉树TPreOrderTraverse( T,Visit())初始条件:二叉树T已经存在,visit是对结点操作的应用函数操作结果:先序遍历二叉树T ,对每个结点调用visit函数仅一次;一旦visit()失败,则操作失败。

数据结构实验4-2

数据结构实验4-2

实验2稀疏矩阵的表示和转置实验人:学号:时间:2019.4.8一、实验目的1.掌握稀疏矩阵的三元组顺序表存储结构2.掌握稀疏矩阵的转置算法。

二、实验内容采用三元组表存储表示,求稀疏矩阵M的转置矩阵T。

(算法5.1)三、实验步骤:1.构建稀疏矩阵M。

2.求稀疏矩阵M的转置矩阵T。

3.输出稀疏矩阵M和稀疏矩阵T。

四、算法说明1.首先应输入矩阵的行数、列数和非零个数。

2.其次输入你所构建的稀疏矩阵,采用三元组顺序表存储表示,并判别给出的两个矩阵的行、列数进行稀疏矩阵的转置时要做到,将每个三元组的i,j相互调换;并且重排三元组之间的次序便可实现矩阵的转置。

3.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的转置。

五、测试结果六、分析与探讨这次实验是稀疏矩阵的表示和转置编写的程序题,但是有关稀疏矩阵的写法在我平时上课时我就感觉有点难消化,以及对于矩阵的相关知识和三元组表的相关知识方面已经有些遗忘了。

所以在编写实验内容之前我把数据结构书上有关稀疏矩阵的内容反反复复又看了两遍,了解了三元组顺序表、行逻辑链接的顺序表以及十字表的方法。

在这次程序编写中我用到了三元组顺序表的方法。

首先,根据实验内容采用三元组表存储表示,求稀疏矩阵M的转置矩阵T所围绕的程序算法5.1进行编程以及调试;其次,根据课程设计的要求进行实验目的以及实验意义的分析;最后,根据实验步骤对主函数main 进行编写,将项目设计的算法思想,基本算法,主函数调用一一呈现出来。

主函数中主要包含构建稀疏矩阵M,输出构建稀疏矩阵M以及转置矩阵T三个部分。

在整个课程设计中总是在编写程序中发生一些很小的错误,比如对元素缺少定义、缺个分号以及大小写方面。

在编写的时候总会很粗心,有时会很没耐性,但都被我一一克服了,同时还有认真仔细,尽量保证不出现错误,看到自己的代码错误少了,也会更有信心和动力。

最后,编程时要注意要有条理,这样有利于修改错误,减少时间的花费。

北京理工大学-实验四--实验报告表

北京理工大学-实验四--实验报告表
AB 地址存储器
RAM把第一个操作数存放在哪个寄存器上,通过哪组总线传送给CPU
:
数据存储器 DBΒιβλιοθήκη CPU把取到的第一个操作数存放在哪里
GR
步骤5 加法计算
CPU把两个加数放入哪里进行加法运算
ALU 计算器
当两个加数相加结束后,CPU把相加结果存放在哪里
加数一所在的通用寄存器中
00000034
RAM中加数一的编码与内存地址
00000000000011000036
步骤2 取指令
CPU使用哪根总线将PC中的内存地址送至RAM
AB
RAM将CPU传来的指令地址存储在哪里
地址储存器
MAR中存放的是什么具体的二进制编码是什么
指令编码0001110100110110
#
MAR中二进制编码对应的内存地址是什么该内存地址中存放了什么数据该数据放在哪个寄存器中
000A 指令编码 指令寄存器
PC被访问后其中的内容发生了什么变化为什么
PC中的指令地址自动加一
因为这一指令执行完要执行下一次指令
RAM将MDR中的数据通过哪条总线传送给力CPU
DB
CPU将RAM传来的指令存放在哪里
指令寄存器 IR
IR中存放的指令二进制编码是什么
0001 110100 110110

步骤3 指令译码
IR中的操作码和两个操作数的内存地址分别是什么(请分别用用六位二进制数和四位十六进制表示)
0000010001
操作数1:110100 0034
操作数2:110110 0036
译码在哪里进行并通过哪组总线把该操作传递给RAM
CU控制器 CB
步骤4 取数据
CPU通过哪组总线传送地址RAM将这个地址存放在哪里

数据结构 实验报告

数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

操作系统为 Windows 10。

三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。

对链表进行排序,如冒泡排序或插入排序。

2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。

利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。

3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。

进行二叉树的插入、删除节点操作。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先遍历和广度优先遍历。

四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。

北京理工大学数据结构实验报告选作1

北京理工大学数据结构实验报告选作1

《数据结构与算法统计》实验报告学院:班级:学号:姓名:一、实验目的1.熟悉VC++6.0环境,学习使用C++实现链表的存储结构;2.通过编程,上机调试,进一步理解线性表、链表的基本概念。

二、实验内容归并顺序表(选作)。

请按以下要求编程实现:①从键盘输入两个升序排列的整数序列linka和linkb,每个序列以输入0为结束标记。

②将链表linka和linkb归并为linkc,linkc仍然为升序排列。

归并完成后,linka和linkb为空表。

输出linkc。

③对linkc进行处理,保持升序不变,删除其中重复的整数,对重复的整数只保留一个,输出删除重复整数后的链表。

例如:linka输入为:10 20 30 40 50 0linkb输入为:15 20 25 30 35 40 45 50 0归并后的linkc为:10 15 20 20 25 30 30 35 40 40 45 50 50删除重复后的linkc为:10 15 20 25 30 35 40 45 50三、程序设计1、概要设计说明程序的主要功能,主程序的流程以及各个程序模块之间的调用关系,给出主要流程图。

应用单链线性表寄存数字序列。

⑴单链线性表的抽象数据类型线性表的定义如下:ADT LinkList {数据对象:D = { ai | ai ∈ElemSet, i=1,…,n,n≥0 }数据关系:R1 = { <ai-1, ai> | ai-1,ai ∈D, i=2, …,n }基本操作:Creat(LinkList &L)操作结果:构造单链线性表L。

MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)初始条件:单链线性表La,Lb,Lc已经存在。

操作结果:归并La,Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。

Delete(LinkList &L)初始条件:链表L已经存在。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构与算法统计》实验报告——实验四学院:班级:学号:姓名:一、实验目的1、熟悉VC 环境,学会使用C 语言利用顺序表解决实际问题。

2、通过上机、编程调试,加强对线性表的理解和运用的能力。

3、锻炼动手编程,独立思考的能力。

二、实验内容从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。

三、程序设计1、概要设计为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。

(1)抽象数据类型:ADT SqList{数据对象:D={|,1,2,,,0}i i a a ElemSet i n n ∈=≥数据关系:R1=11{,|,,1,2,,}i i i i a a a a D i n --<>∈= 基本操作:InPut(SqList &L)操作结果:构造一个线性表L 。

OutPut(SqList L)初始条件:线性表L 已存在。

操作结果:按顺序在屏幕上输出L 的数据元素。

InsertSort(SqList &L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行插入排序。

QuickSort(SqList &L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行快速排序。

SelectSort(SqList &L)初始条件:线性表L 已存在。

操作结果:对L 的数据元素进行选择排序。

}ADT SqList⑵主程序流程由主程序首先调用InPut(L)函数创建顺序表,调用InsertSort(L)函数进行插入排序,调用OutPut(L)函数显示排序结果。

再由主程序首先调用InPut(L)函数创建顺序表,调用QuickSort(L)函数进行交换排序,调用OutPut(L)函数显示排序结果。

再由主程序首先调用InPut(L)函数创建顺序表,调用SelectSort(L)函数进行选择排序,调用OutPut(L)函数显示排序结果。

⑶模块调用关系由主函数模块调用创建顺序表模块,排序模块与显示输出模块。

⑷流程图2、详细设计(1)数据类型设计#define MAXSIZE 15//用作示例的小顺序表的最大长度typedef struct{int key;//关键字项int otherinfo;//其它数据项}RedType;//记录类型typedef struct{RedType r[MAXSIZE+1];//r[0]闲置或用作哨兵单元int length;//顺序表长度}SqList;//顺序表类型(2)操作算法设计void InPut(SqList &L)//输入数字,创建顺序表{int i;printf("请输入10个数字:\n");L.length=10;for(i=1;i<=L.length;i++){scanf("%d",&L.r[i].key);}}void InsertSort(SqList &L)//对顺序表L作直接插入排序{int i,j;for(i=2;i<=L.length;i++){if(L.r[i].key<L.r[i-1].key)//如果“<”,需将L.r[i]插入有序子表{L.r[0].key=L.r[i].key;//复制为哨兵L.r[i].key=L.r[i-1].key;for(j=i-2;L.r[0].key<L.r[j].key;j--){L.r[j+1].key=L.r[j].key;//记录后移}L.r[j+1].key=L.r[0].key;//插入到正确位置}}}int Partition(SqList &L,int low,int high)//交换顺序表L中子表r[low…high]的记录,枢轴记录到位,并返回其所在位置,/此时在它之前(后)的记录均不大(小)于它。

{int pivotkey;L.r[0].key=L.r[low].key;//用子表的第一个记录作枢轴记录pivotkey=L.r[low].key;//枢轴记录关键字while(low<high)//从表的两端交替地向中间扫描{while(low<high&&L.r[high].key>=pivotkey){--high;//将比枢轴记录小的记录移到低端}L.r[low].key=L.r[high].key;while(low<high&&L.r[low].key<=pivotkey){++low;//将比枢轴记录大的记录移到高端}L.r[high].key=L.r[low].key;}L.r[low].key=L.r[0].key;//枢轴记录到位return low;//返回枢轴位置}void QSort(SqList &L,int low,int high)//对顺序表L中的子序列L.r[low…high]作快速排序{int pivotloc;if(low<high)//长度大于1{pivotloc=Partition(L,low,high);//将L.r[low…high]一分为二QSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置QSort(L,pivotloc+1,high);//对高子表递归排序}}void QuickSort(SqList &L)//对顺序表L做快速排序{QSort(L,1,L.length);}void SelectSort(SqList &L)//对顺序表L作简单选择排序{int i,j,k;for(i=1;i<L.length;i++)//选择第i小的记录,并交换到位{k=i;for(j=i+1;j<L.length;j++)//在L.r[i…L.length]中选择key最小的记录{if(L.r[j].key<L.r[k].key){k=j;}}if(i!=k)//与第i个记录交换{L.r[0].key=L.r[i].key;L.r[i].key=L.r[k].key;L.r[k].key=L.r[0].key;}}}void OutPut(SqList L)//输出顺序表{int i;for(i=1;i<=L.length;i++){printf("%d ",L.r[i].key);}printf("\n");}⑶主函数设计void main()//主程序{SqList L;printf("插入排序法:\n");InPut(L);//创建线性表LInsertSort(L);//对L进行插入排序OutPut(L);//输出线性表Lprintf("交换排序法:\n");InPut(L);//创建线性表LQuickSort(L);//对L进行交换排序OutPut(L);//输出线性表Lprintf("选择排序法:\n");InPut(L);//创建线性表LSelectSort(L);//对L进行选择排序OutPut(L);//输出线性表L}四、程序调试分析⑴在快速排序中,对一些后引入的变量,如pivotkey没有声明,导致编译失败。

⑵在直接插入排序中,由于对程序理解不深,将if的{}扩错了位置,导致程序不能按预期输出。

五、程序运行结果测试一:插入排序法:请输入10个数字:1 3 5 7 92 4 6 8 00 1 2 3 4 5 6 7 8 9交换排序法:请输入10个数字:1 3 5 7 92 4 6 8 00 1 2 3 4 5 6 7 8 9选择排序法:请输入10个数字:1 3 5 7 92 4 6 8 01 2 3 4 5 6 7 8 9 0测试二:插入排序法:请输入10个数字:49 38 65 97 76 13 27 67 52 3413 27 34 38 49 52 65 67 76 97交换排序法:请输入10个数字:49 38 65 97 76 13 27 67 52 3413 27 34 38 49 52 65 67 76 97选择排序法:请输入10个数字:49 38 65 97 76 13 27 67 52 3413 27 38 49 52 65 67 76 97 34六、程序清单#include <iostream>#include <stdio.h>#define MAXSIZE 15//用作示例的小顺序表的最大长度typedef struct{int key;//关键字项int otherinfo;//其它数据项}RedType;//记录类型typedef struct{RedType r[MAXSIZE+1];//r[0]闲置或用作哨兵单元int length;//顺序表长度}SqList;//顺序表类型void InPut(SqList &L);void InsertSort(SqList &L);void OutPut(SqList L);void QuickSort(SqList &L);void QSort(SqList &L,int low,int high);void SelectSort(SqList &L);void main()//主程序{SqList L;printf("插入排序法:\n");InPut(L);//创建线性表LInsertSort(L);//对L进行插入排序OutPut(L);//输出线性表Lprintf("交换排序法:\n");InPut(L);//创建线性表LQuickSort(L);//对L进行交换排序OutPut(L);//输出线性表Lprintf("选择排序法:\n");InPut(L);//创建线性表LSelectSort(L);//对L进行选择排序OutPut(L);//输出线性表L}void InPut(SqList &L)//输入数字,创建顺序表{int i;printf("请输入10个数字:\n");L.length=10;for(i=1;i<=L.length;i++){scanf("%d",&L.r[i].key);}}void InsertSort(SqList &L)//对顺序表L作直接插入排序{int i,j;for(i=2;i<=L.length;i++){if(L.r[i].key<L.r[i-1].key)//如果“<”,需将L.r[i]插入有序子表{L.r[0].key=L.r[i].key;//复制为哨兵L.r[i].key=L.r[i-1].key;for(j=i-2;L.r[0].key<L.r[j].key;j--){L.r[j+1].key=L.r[j].key;//记录后移}L.r[j+1].key=L.r[0].key;//插入到正确位置}}}int Partition(SqList &L,int low,int high)//交换顺序表L中子表r[low…high]的记录,枢轴记录到位,并返回其所在位置,//此时在它之前(后)的记录均不大(小)于它。

相关文档
最新文档