数据结构实验四:顺序表的排序实验

数据结构实验四:顺序表的排序实验
数据结构实验四:顺序表的排序实验

一,实验题目

实验四:顺序表的排序实验

设计算法将一个整型数组调整为这样的数组:所有3的倍数在最左边,所有除以3余1的数在中间,而所有除以3余2的数在最左边。要求算法的时间尽可能少。

二,问题分析

本程序要求实现将一个整型数组调整为这样的数组:所有3的倍数在最左边,所有除以3余1的数在中间,而所有除以3余2的数在最左边。根据题目要求,可以用顺序表来实现。程序所能达到的是将顺序表中的元素根据被3整除的情况有规则的输出。

1,数据的输入形式和输入值的范围:输入的顺序表的个数为大于0且小于顺序表最大长度的整型数据,而顺序表的元素为整型。

2,结果的输出形式:程序正确运行后,应输出顺序表中的元素是:所有3的倍数在最左边,所有除以3余1的数在中间,而所有除以3余2的数在最左边。

3,测试数据:

(1)顺序表长度i:4,顺序表元素:33,45,78,99

(2)顺序表长度i:5,顺序表元素:-12,-4,10,39,93

(3)顺序表长度i:6,顺序表元素:25,43,8,99,45,32

三,概要设计

1,为了实现以上程序功能,需要:

1)建立一个含有i个元素的顺序表

2)对顺序表的元素进行分区,将所有3的倍数在最左边,所有除以3余1的数在中间,而所有除以3余2的数在最左边。

2,本程序包含3个函数

1)主函数main()

2)顺序表输入函数sqlset()

3)顺序表分区函数dispart()

四,详细设计

1,顺序表类型定义:

typedef struct{

int r[list_size+1];

int length,a,b,c;

int x[list_size+1]; //用于存放能被3整除的数

int y[list_size+1]; //用于存放除以3余1的数

int z[list_size+1]; //用于存放除以3余2的数

}recordlist;

2,顺序表元素函数伪代码:

recordlist *sqlset(){

recordlist *L; int i;

L->length=-1; //初始化顺序表长度

L->a=0; //初始化存放能被3整除的顺序表的长度

L->b=0;

L->c=0;

scanf("%d",&i);

for(L->length=0;L->lengthlength++)

scanf("%d",&L->r[L->length]);

}

3,分块函数伪代码:

recordlist *dispart(recordlist *L,int m){ // m为顺序表的长度

int i;

for(i=0;i

if(L->r[i]%3==0){

L->x[L->a]=L->r[i];

L->a++;}

else if(L->r[i]%3==1) {

L->y[L->b]=L->r[i];

L->b++;}

else {

L->z[L->c]=L->r[i];

L->c++;}

}

for(i=0;ia;i++) printf("%d ",L->x[i]); printf("\t\t");

for(i=0;ib;i++) printf("%d ",L->y[i]); printf("\t\t");

for(i=0;ic;i++) printf("%d ",L->z[i]); printf("\n");

return L;

}

五,源程序

#include "stdio.h"

#include "malloc.h"

#define list_size 100

typedef struct{

int r[list_size+1];

int length,a,b,c;

int x[list_size+1]; //用于存放能被3整除的数

int y[list_size+1]; //用于存放除以3余1的数

int z[list_size+1]; //用于存放除以3余2的数

}recordlist;

recordlist *sqlset(){ //顺序表元素函数

recordlist *L; //定义一个recordlist型指针变量L

int i;

L=(recordlist*)malloc(sizeof(recordlist)); //为顺序表申请空间L->length=-1; //初始化顺序表长度

L->a=0; //初始化存放能被3整除的顺序表的长度

L->b=0; //初始化存放除以3余1的顺序表的长度

L->c=0; //初始化存放除以3余2的顺序表的长度

printf("请输入顺序表的长度i(i

scanf("%d",&i);

printf("请输入%d个顺序表元素:",i);

for(L->length=0;L->lengthlength++)

scanf("%d",&L->r[L->length]);

return L;

}

recordlist *dispart(recordlist *L,int m){ //顺序表分区函数,m为顺序表的长度int i;

for(i=0;i

{

if(L->r[i]%3==0) //能被3整除的情况

{

L->x[L->a]=L->r[i];

L->a++;

} //把能被3整除的数放到顺序表中

else if(L->r[i]%3==1) //除以3余1的情况

{

L->y[L->b]=L->r[i];

L->b++;

} //把除以3余1的数放到顺序表中

else //除以3余2的情况

{

L->z[L->c]=L->r[i];

L->c++;

} //把除以3余2的数放到顺序表中

}

for(i=0;ia;i++) //输出

printf("%d ",L->x[i]);

printf("\t\t");

for(i=0;ib;i++)

printf("%d ",L->y[i]);

printf("\t\t");

for(i=0;ic;i++)

printf("%d ",L->z[i]);

printf("\n");

return L;

}

void main(){

recordlist *A; //定义一个recordlist型指针变量A

A=sqlset(); //调用输入函数输入顺序表

A=dispart(A,A->length); //调用对元素进行分块输出函数,输出分块后的顺序表元素}

六,调试分析

1,在函数调用时弄错了实参的数据类型,导致出错,其中length没有用正确的格式,应该为A->length,而不能直接使用length作为顺序表的长度。

2,在输入顺序表函数中,应返回一个recordlist型的顺序表,而在编程时没有返回,故出现了一个小错误。

七,使用说明

用户运行该程序后,首先提示用户“请输入顺序表的长度i:”,用户根据提示输入i个书序表元素,输入顺序表元素完毕后,则得到一个新的顺序表,其所有3的倍数在最左边,所有除以3余1的数在中间,而所有除以3余2的数在最左边。先输入顺序表元素,再对其分区输出。

八,测试结果

1,顺序表长度为5,顺序表元素有正有负且除以3后的情况下:

2,顺序表长度为4,顺序表元素均能被3 整除的情况:

2,顺序表长度为6,且除以3后的情况:

数据结构实验4

(一)题目 1. 按下述原则编写快排的非递归算法: (1) 一趟排序之后,若子序列已有序(无交换),则不参加排序,否则先对长度较短的子序列进行排序,且将另一子序列的上、下界入栈保存; (2) 若待排记录数<=3,则不再进行分割,而是直接进行比较排序。 测试实例:{49 38 65 97 76 13 27 49 88 21 105} (二)算法思路 (1) 建立存储序列上下界的栈序列。 (2) 对栈顶作如下判断: A. 若栈顶中记录的头与尾相距小于3,对对应的子序列进行排序,然后出栈,进入(3); B. 若栈顶中记录的头与尾相距大于等于3,则进行分块,判断分块是否有序, a.若两分块都有序,则出栈,进入(3); b.若只有一分块有序,则改变栈顶内容为无序分块内容,进入(3); c.若两分块都无序,则改变栈顶内容为较长的无序块,然后把较短的无序块 压进栈。进入(3) (3)重复(2)的操作,直至栈空,得到最终结果。 (三)程序结构 定义的结构体及声明 (四)源码

using namespace std; typedef struct _stack{ int left; //lowerbound int right; //upperbound struct _stack *next; }qstack; //to store the child sequence's left and right void sort(int *arr, int left, int right){ //sort child sequence less than 3 for(int i = left; i <= right; i++){ int k = i; for(int j = i+1; j <= right; j++){ if(arr[k] > arr[j]) k = j; } if(k != i){ int t; t = arr[k]; arr[k] = arr[i]; arr[i] = t; } } } bool sorted(int *arr, int left, int right){ for(int i = left; i < right; i++){ if(arr[i] > arr[i+1]) return false; } return true; } void qsort(int *arr, int left, int right){ qstack *head; head = new qstack; head->left = left; head->right = right; head->next = NULL; qstack *p; while(head != NULL){ if(head->right - head->left < 3){ //if less than 3, sort and pop sort(arr, head->left, head->right);

数据结构实验8实验报告

暨南大学本科实验报告专用纸 课程名称数据结构实验成绩评定 实验项目名称习题6.37 6.38 6.39 指导教师孙世良 实验项目编号实验8 实验项目类型实验地点实验楼三楼机房学生姓名林炜哲学号2013053005 学院电气信息学院系专业软件工程 实验时间年月日午~月日午温度℃湿度(一)实验目的 熟悉和理解二叉树的结构特性; 熟悉二叉树的各种存储结构的特点及适用范围; 掌握遍历二叉树的各种操作及其实现方式。 理解二叉树线索化的实质是建立结点与其在相应序列中的前去或后继之间的直接联系,熟练掌握二叉树的线索化的过程以及在中序线索化树上找给定结点的前驱和后继的方法。 (二)实验内容和要求 6.37试利用栈的基本操作写出先序遍历的非递归形式的算法。 6.38同题6.37条件,写出后序遍历的非递归算法(提示:为分辨后序遍 历时两次进栈的不同返回点需在指针进栈时同时将一个标志进栈)。 6.39假设在二叉链表的结点中增设两个域:双亲域以指示其双亲结点; 标志域以区分在遍历过程中到达该结点时应继续向左或向右或访问该节点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。(三)主要仪器设备 实验环境:Microsoft Visual Studio 2012 (四)源程序

6.37: #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 typedef struct bitnode{ char data; struct bitnode *lchild,*rchild; }bitnode,*bitree; void create(bitree &T){ char t; t=getchar(); if(t==' ') T=NULL; else{ if( !( T=(bitnode*)malloc(sizeof(bitnode)) ) ) exit(0); T->data=t; create(T->lchild); create(T->rchild); } } typedef struct{ bitree *base; bitree *top; int stacksize; }sqstack; void initstack(sqstack &S){ S.base=(bitree*)malloc(STACK_INIT_SIZE *sizeof(bitree)); if(!S.base) exit(0); S.top=S.base; S.stacksize=STACK_INIT_SIZE; } void Push(sqstack &s,bitree e){ if(s.top - s.base >= s.stacksize){ s.base =

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构实验五-查找与排序的实现

实验报告 课程名称数据结构实验名称查找与排序的实现 系别专业班级指导教师11 学号实验日期实验成绩 一、实验目的 (1)掌握交换排序算法(冒泡排序)的基本思想; (2)掌握交换排序算法(冒泡排序)的实现方法; (3)掌握折半查找算法的基本思想; (4)掌握折半查找算法的实现方法; 二、实验内容 1.对同一组数据分别进行冒泡排序,输出排序结果。要求: 1)设计三种输入数据序列:正序、反序、无序 2)修改程序: a)将序列采用手工输入的方式输入 b)增加记录比较次数、移动次数的变量并输出其值,分析三种序列状态的算法时间复杂 性 2.对给定的有序查找集合,通过折半查找与给定值k相等的元素。 3.在冒泡算法中若设置一个变量lastExchangeIndex来标记每趟排序时经过交换的最后位置, 算法如何改进? 三、设计与编码 1.本实验用到的理论知识 2.算法设计

3.编码 package sort_search; import java.util.Scanner; public class Sort_Search { //冒泡排序算法 public void BubbleSort(int r[]){ int temp; int count=0,move=0; boolean flag=true; for(int i=1;ir[j+1]){ temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; move++; flag=true; } } } System.out.println("排序后的数组为:"); for(int i=0;i

数据结构实验报告(四)

《数据结构》实验报告 班级: 学号: 姓名:

实验四二叉树的基本操作实验环境:Visual C++ 实验目的: 1、掌握二叉树的二叉链式存储结构; 2、掌握二叉树的建立,遍历等操作。 实验内容: 通过完全前序序列创建一棵二叉树,完成如下功能: 1)输出二叉树的前序遍历序列; 2)输出二叉树的中序遍历序列; 3)输出二叉树的后序遍历序列; 4)统计二叉树的结点总数; 5)统计二叉树中叶子结点的个数; 实验提示: //二叉树的二叉链式存储表示 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

一、程序源代码 #include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; struct TNode { char data; BiTree lchild; BiTree rchild; }; int IsEmpty_BiTree(BiTree *T) { if(*T == NULL) return 1; else return 0;

} void Create_BiTree(BiTree *T){ char ch; ch = getchar(); //当输入的是"#"时,认为该子树为空 if(ch == '#') *T = NULL; //创建树结点 else{ *T = (BiTree)malloc(sizeof(struct TNode)); (*T)->data = ch; //生成树结点 //生成左子树 Create_BiTree(&(*T)->lchild); //生成右子树 Create_BiTree(&(*T)->rchild); } } void TraverseBiTree(BiTree T) { //先序遍历 if(T == NULL) return;

数据结构实验五

1. 实验步骤: 先定义顺序表的结点: typedef struct { KeyType key; InfoType otherinfo; }ElemType; typedef struct { ElemType *R; int length; }SqList; 然后定义一个随机取数的函数,存到顺序表中: void CreateList(SqList &L,int n) 然后定义一个显示顺序表的函数,将顺序表中的数据显示出来: void ListTraverse(SqList L) 然后通过排序函数,将所有的数据按照从大到小的顺序排列: void BubbleSort(SqList &L) 实验结果: 测试数据: 38 86 9 88 29 18 58 27 排序后: 9 18 27 29 38 58 86 88 BubbleSort排序方法中数据的比较次数为:27 疑难小结: 这个程序的难点在于排序函数,总是把从第几个数开始排序以及怎样循环弄错。 源代码: #include using namespace std; #include typedef int KeyType; typedef char * InfoType; typedef struct { KeyType key; InfoType otherinfo; }ElemType; typedef struct { ElemType *R; int length; }SqList; int CmpNum; void CreateList(SqList &L,int n) { int i;

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

《数据结构与算法统计》 实验报告 ——实验四 学院: 班级: 学号: 姓名:

一、实验目的 1、熟悉VC 环境,学会使用C 语言利用顺序表解决实际问题。 2、通过上机、编程调试,加强对线性表的理解和运用的能力。 3、锻炼动手编程,独立思考的能力。 二、实验内容 从键盘输入10个数,编程实现分别用插入排序、交换排序、选择排序算法进行排序,输出排序后的序列。 三、程序设计 1、概要设计 为了实现排序的功能,需要将输入的数字放入线性表中,进行进一步的排序操作。 (1)抽象数据类型: ADT SqList{ 数据对象:D={|,1,2,,,0}i i a a Elem Set 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)函数显示排序结果。 ⑶模块调用关系

数据结构实验4_99XXX

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef char ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ if(st->top == -1) return 0;//为空 else return -1;//不为空 } void Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ printf("栈上溢出!\n"); } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } } void Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { printf("栈下溢出\n"); } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} } int main() { SqStack L; SqStack *st=&L; ElemType c; int i; InitStack(st); printf("输入回车结束入栈"); while((c=getchar())!='\n') { if(c=='(') Push(st,c); if((i=StackEmpty(st))==-1) { if(c==')') Pop(st,c); } if(c==')' && (i=StackEmpty(st))==0) { printf("右括号多出,配对失败"); goto loop;

数据结构实验五A

《数据结构与算法分析》 实验报告书 学期:2014 - 2015 学年第 2 学期 班级:信息管理与信息系统2班 学号: 1310030217 姓名:田洪斌 实验类别:(★)基础型()设计型 实验时间: 成绩: 信息管理系

一、实验内容 实现程序,按满二叉树给元素编号并输入的方式构造二叉树。 二、实验目的 1、掌握二叉树的静态及操作特点; 2、掌握二叉树的各种遍历方法; 3、掌握二叉树的存储、线索化等在C语言环境中的实现方法; 4、掌握哈夫曼树的构造方法及编码方法。 三、需求分析 用二叉树结构表示来完成输入、编辑、调试、运行的全过程。并规定: a.手动输入数字建立二叉树 b.程序可以输入、调试、运行、显示、遍历 c.测试数据:用户手动输入的数据 四、系统设计 1.数据结构设计 在本程序中对二叉树的存储主要用的是顺序存储结构,将二叉树存储在一个一维数组中。数据的输入输出都是采用整型数据进行。在主函数中只是定义数据类型,程序的实现功能化主要是在主函数中通过给要调用的函数参数来实现程序要求的功能。 2.程序结构设计 (1)程序中主要函数功能: main()/////////////////////////////////////////////主函数 menu()/////////////////////////////////////////////菜单 BiTree CreateBiTree()///////////////////////先序建立二叉树 (2)函数调用关系 见图4-1。

图4-1 函数关系图 五、 调试分析 1.算法和函数中出现了一些系统无法识别的变量,照成程序出现了错 误。原因是没有注意算法与源程序的区别。算法是简单的对源程序进行描述 的,是给人阅读的,所以有些变量没有定义我们就能看懂。而程序中的变量一定要先定义才能够被引用,才能被计算机识别。 2.在调试过程中遇到问题是利用C++程序进行调试的,找出错误并改正。 3.数据输出函数运行不正常,经检查程序,发现是定义错误,更改后错误排除; 六、 测试结果 1.运行时输入正确密码进入主界面,系统根据输入的数字选项来调用相应的函数。主要实现“功能选择”的界面,在这个界面里有显示系统的五大功能,根据每个功能前面的序号进行选择。以下为该界面: main BiTree CreateB iTree() meun()

数据结构-实验五-图

数据结构与算法课程实验报告实验五:图的相关算法应用 姓名:cll 班级: 学号:

【程序运行效果】 一、实验内容: 求有向网络中任意两点之间的最短路 实验目的: 掌握图和网络的定义,掌握图的邻接矩阵、邻接表和十字链表等存储表示。掌握图的深度和广度遍历算法,掌握求网络的最短路的标号法和floyd算法。 二、问题描述: 对于下面一张若干个城市以及城市间距离的地图,从地图中所有可能的路径中求出任意两个城市间的最短距离及路径,给出任意两个城市间的最短距离值及途径的各个城市。 三、问题的实现: 3.1数据类型的定义 #define MAXVEX 50 //最大的顶点个数 #define MAX 100000 typedef struct{ char name[5]; //城市的名称

}DataType; //数据结构类型 typedef struct{ int arcs[MAXVEX][MAXVEX]; //临接矩阵 DataType data[MAXVEX]; //顶点信息 int vexs; //顶点数 }MGraph,*AdjMetrix; //邻接矩阵表示图 3.2主要的实现思路: 用邻接矩阵的方法表示各城市直接路线的图,之后用Floyd算法求解两点直接的最短距离,并用递归的方法求出途经的城市。 主要源程序代码: #include #include #define MAXVEX 50 #define MAX 100000 typedef struct{ char name[5]; //城市的名称 }DataType; //数据结构类型 typedef struct{ int arcs[MAXVEX][MAXVEX]; //临接矩阵 DataType data[MAXVEX]; //顶点信息 int vexs; //顶点数 }MGraph,*AdjMetrix; //创建临接矩阵 void CreatGraph(AdjMetrix g,int m[][MAXVEX],DataType d[],int n){ /*g表示邻接矩阵,m[][MAXVEX]表示输入的邻接矩阵,d[]表示各城市的名称,n表示城市数目*/ int i,j; g->vexs = n; for(i=0;i < g->vexs;i++){ g->data[i] = d[i]; for(j=0;jvexs;j++){ g->arcs[i][j] = m[i][j]; } } } //求最短路径 void Floyd(AdjMetrix g,int F[][10],int path[][10]){ int i,j,k; for(i=0;ivexs;i++){ for(j=0;jvexs;j++){

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试 复习资料 习题及实验参考答案见附录 结论 1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。 2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列 3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。 4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。 5、在数据结构中,从逻辑上可以把数据结构分成( C ) A、动态结构和表态结构 B、紧凑结构和非紧凑结构 C、线性结构和非线性结构 D、内部结构和外部结构 6、算法的时间复杂度取决于( A ) A、问题的规模 B、待处理数据的初态 C、问题的规模和待处理数据的初态 线性表 1、线性表的存储结构包括顺序存储结构和链式存储结构两种。 2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。 A、(n-1)/2 B、n C、n+1 D、n-1 E、n/2 F、(n+1)/2 G、(n-2)/2 3、“线性表的逻辑顺序与存储顺序总是一致的。”这个结论是( B ) A、正确的 B、错误的 C、不一定,与具体的结构有关 4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D ) A、必须是连续的 B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以 5、带头结点的单链表为空的判定条件是( B ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 6、不带头结点的单链表head为空的判定条件是( A ) A、head==NULL B、head->next==NULL C、head->next=head D、head!=NULL 7、非空的循环单链表head的尾结点P满足( C ) A、p->next==NULL B、p==NULL C、p->next==head D、p==head 8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是( B ) A、O(1) B、O(n) C、O(n2) D、O(nlog2n) 9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )

数据结构课程实验报告-实验5

数据结构课程实验报告-实验5

HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名康小雪 学生学号 20090810310 专业班级计科三班 指导老师李晓鸿 完成日期2010-10-24

一、需求分析 1.该程序可以从通过从键盘输入一个中缀表达式,判断该表达式是否合法,若合法将 其转化为后缀表达式,并计算其结果,否则说明该表达式错误 2..输入的表达式包含数字和运算符及括号,之间用空格隔开 3.数字可以为整数和小数 4.运算结果保留两位小数 输入输出举例 输入:21+23*(12-6) 输出:21 23 12 6 -*+ 二、概要设计 在表达式中每个运算符应对应两个操作数,与二叉树中非叶子结点和叶子结点之间的关系刚好相同,于是,本题可采用二叉树来将中缀表达式变为后缀表达式。 最后用堆栈来实现后缀表达式的计算。 抽象数据类型 二叉树 ADT BiTree {

数据对象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,∈H,且存在D1shang de guanxi H1=H;ruo Dr≠空集,则Dr中存 在唯一的元素,xr,∈H,且 存在Dr上的关系Hr∈ H;H={,,H1,Hr}; (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,(Dr,{Hr})是一棵 符合本定义的二叉树,称为根的右子树基本操作P: InitBiTree(&T)

数据结构实验四题目一排序实验报告

数据结构实验报告 实验名称:实验四——排序 学生:XX 班级: 班序号: 学号: 日期: 1.实验要求 实验目的: 通过选择实验容中的两个题目之一,学习、实现、对比、各种排序的算法,掌握各种排序算法的优劣,以及各种算法使用的情况。 题目1: 使用简单数组实现下面各种排序算法,并进行比较。 排序算法如下: 1、插入排序; 2、希尔排序; 3、冒泡排序; 4、快速排序; 5、简单选择排序; 6、堆排序; 7、归并排序; 8、基数排序(选作); 9、其他。 具体要求如下: 1、测试数据分成三类:正序、逆序、随机数据。 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关 键字交换记为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微妙。 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度。 5、编写main()函数测试各种排序算法的正确性。 2. 程序分析 2.1 存储结构

存储结构:数组 2.2 关键算法分析 一、关键算法: 1、插入排序 a、取排序的第二个数据与前一个比较 b、若比前一个小,则赋值给哨兵 c、从后向前比较,将其插入在比其小的元素后 d、循环排序 2、希尔排序 a、将数组分成两份 b、将第一份数组的元素与哨兵比较 c、若其大与哨兵,其值赋给哨兵 d、哨兵与第二份数组元素比较,将较大的值赋给第二份数组 e、循环进行数组拆分 3、对数据进行编码 a、取数组元素与下一个元素比较 b、若比下一个元素大,则与其交换 c、后移,重复 d、改变总元素值,并重复上述代码 4、快速排序 a、选取标准值 b、比较高低指针指向元素,若指针保持前后顺序,且后指针元素大于标准值,后 指针前移,重新比较 c、否则后面元素赋给前面元素 d、若后指针元素小于标准值,前指针后移,重新比较 e、否则前面元素赋给后面元素 5、简单选择排序 a、从数组中选择出最小元素 b、若不为当前元素,则交换 c、后移将当前元素设为下一个元素 6、堆排序 a、生成小顶堆 b、将堆的根节点移至数组的最后 c、去掉已做过根节点的元素继续生成小顶堆

数据结构实验报告3543435

合肥师范学院实验报告册 2013 / 2014 学年第2 学期 系别计算机科学与技术系 实验课程数据库原理 专业计算机软件 班级软件一班 姓名周锦 学号1210431081 指导教师潘洁珠

实验一——数据库基本操作 一、实验目的 1.熟悉MS SQL SERVER运行界面,掌握服务器的基本操作。 2.掌握界面操作方法完成用户数据库建立、备份和还原。 3.建立两个实验用的数据库,使用企业管理器和查询分析器对数据库和表进行基本操作。 二、实验预习内容 在认真阅读教材及实验指导书的基础上,上机前请预习以下内容,并在空白处填写相应的步骤或命令。 1.熟悉SQL SERVER 2000 的运行环境,练习服务器基本操作:打开、停止、关闭。 2.使用SQL SERVER 2000 中的企业管理器完成以下任务。 数据库名称:STC 表:STU(sno char(9), sname varchar(50), ssex char(2) , sage int, sdept char(2) ); COUTSES(cno char(3), cname varchar(50), cpno char(3), credit int ); SC(sno char(9), cno char(3), grade int ); 说明:以上为表结构,以sno char(9)为例,说明sno属性设置为字符类型,宽度为9,int指整型数据。 1)建立数据库STC,分别建立以上三张表,并完成数据录入。(表结构及数据参见教材) 建立数据库:数据库→右击鼠标→新建数据库,出现如上图所示的框,然后填上所建数据库的名称。

数据结构上机实验5

数据结构上机实验(五)递归 班级:学号:姓名: 上机时间:地点: 一、实验目的 1.理解递归的定义和递归模型。 2.掌握递归设计的一般方法,能用递归算法解决一些较复杂应用问题。 二、实验内容 1.编写程序求解皇后问题 要求:(1)皇后的个数n由用户输入,其值不能超过20; (2)采用递归方法求解。 2.编写一个程序求解背包问题 三、实验过程 1.了解常用函数所在的头文件 stdlib.h stdlib 头文件里包含了C语言的一些函数 该文件包含了的C语言标准库函数的定义 stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。 conio.h conio.h不是C标准库中的头文件。 conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。 &表示引用传递。在函数参数表中,出现带&这个的形参,表示引用传递。2.程序实现(以下代码仅起参考作用) (1)求解皇后问题 #include #include const int N=20; //最多皇后个数 int q[N]; //存放各皇后所在的行号 int cont=0; //存放解个数 void print(int n) //输出一个解 { cont++; int i; printf(" 第%d个解:",cont);

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构实验四

贵州大学实验报告 学院:计信学院专业:通信工程班级:通信091 姓名何川学号0908060235 实验 组实验时间2011.12、 指导教 师 陈静成绩实验项目名称二叉树操作 实 验目的1、熟悉二叉树结点的结构和对二叉树的基本操作及具体实现。 2、利用递归方法编写对二叉树的各种遍历算法。 3、掌握递归方法在二叉树中的使用。 实验要求1、认真阅读和掌握本实验内容所给的全部程序。 2、在Visual C++6.0集成开发环境下编写和调试所有程序。 3、编写的所有算法须给出测试函数,并自行设计测试数据,对算法进行测试。 4、保存和打印出程序运行结果,并结合程序进行分析。 5、按照你对二叉树操作的需要,重新改写主文件并运行,打印出主文件清单 和运行结果。 实验原理Visual C++的编译环境下,独立完成实验要求的内容,独立完成编写、编以运行。 实 验 仪 器 安装了VC++6.0的PC机

实验步骤1、实现二叉树结点的定义和操作。该程序包括一个头文件,用来存储定义二 叉树结构类型以及对二叉树进行各种操作的函数声明;第二个为操作的实现文件,用来存储每一种操作的具体函数定义以及主函数。二叉树的操作包括二叉树初始化、创建二叉树,判断二叉树是否为空,求二叉树的深度和结点数,遍历二叉树等。 2、已知二叉树的前序遍历序列和中序遍历序列,编写可唯一确定该二叉树的 算法。 3、根据所给的n个带权叶子结点,编写算法构造哈夫曼树和哈夫曼编码。 实验内容(1)typedef char ElemType; struct BTreeNode{ ElemType data; BTreeNode *left; BTreeNode *right; }; void InitBTree(BTreeNode *&BT); void CreatBTree(BTreeNode *&BT,char *a); bool EmptyBTree(BTreeNode *BT); void TraverseBTree(BTreeNode *BT); int BTreeDepth(BTreeNode *BT); int BTreeCount(BTreeNode &BT); void PrintBTree(BTreeNode *BT); #include #include using namespace std; void InitBTree(BTreeNode *&BT){ BT=NULL; } void CreatBTree(BTreeNode *&BT,char *a){ const int MaxSize=100; BTreeNode *s[MaxSize]; int top=-1; BT=NULL; BTreeNode *p; int k; int i=0; while(a[i]){ switch(a[i]){ case ' ': break; case '(': if(top==MaxSize-1){ cout<<"栈空间不够,请重新分配栈空间!"<

数据结构实验5 (1)

《数据结构》实验报告 实验序号:5 实验项目名称:队列的操作学号姓名专业、班 实验地点指导教师实验时间 一、实验目的及要求 1. 熟悉队列的基本概念; 2. 掌握队列的链式表存储结构; 3.掌握队列的应用。 二、实验设备(环境)及要求 微型计算机; windows 操作系统; Microsoft Visual Studio 6.0集成开发环境。 三、实验内容与步骤 1.C++的库函数中已经实现了队列,引用方法为#include ,请上网查阅资料,完成习题。 ①创建一个队列。 ②将a、b、c、d、e、f依次入队。 ③若队列不为空,将元素出队并打印输出。 2.以下的链式队列采用队头指针和队尾指针分别跟踪队列的头尾两端,请删除队尾指针,只使用队头指针实现队列的初始化、入队、出队和销毁队列。 #include #include #define ERROR 1 #define OK 0 #define OVERFLOW 1 typedef int QElemType; typedef int Status;

//用 e 返回其值,并返回OK;否则返回ERROR 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; } int main() { int i,n=10; QElemType e; LinkQueue Q; InitQueue(Q); //初始化队列 printf("元素入队"); for(i=0;i #include #define ERROR 1 #define OK 0

相关文档
最新文档