查找算法的实现 数据结构实验
实验报告May 28 2015
姓名:陈斌学号:E11314079 专业:13计算机科学与技术数据结构第五次实验
学号E11314079专业计算机科学与技术姓名陈斌
实验日期2015.05.28教师签字成绩
实验报告
【实验名称】查找算法的实现
【实验目的】
掌握顺序查找、二分查找、二叉排序树和哈希表的相关算法和运算并编程实现【实验内容】
1.实现顺序查找的算法
编写一个程序,输出在顺序表
{ 12 , 3 , 4 , 10 , 23 , 1 , 9 , 18 }
中采用顺序方法分别查找关键字23 和20的过程。
要求:
(1)程序能够输出查找过程中参与比较的全部关键字;
(2)查找结果的表现形式:若查找成功,则输出关键字的位置,否则输出“找
不到该关键字!”的信息。
源代码:
head.h:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//OVERFLOW 在math.h 中已定义为3
typedef int Status;
typedef int Boolean; // 布尔类型
main.cpp:
#include "head.h"
typedef int KeyType;
#define N 8 /* 数据元素个数*/
typedef struct /* 数据元素类型*/
{
KeyType key; /* 关键字域*/
int others; /* 其它部分*/
}ElemType;
ElemType r[N]={{12,1},{3,2},{4,3},{10,4},{23,5},{1,6},{9,7},{18,8}};
typedef struct
{
ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,0号单元留空int length; /* 表长度*/
}SSTable;
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
int Search_Seq(SSTable &ST,KeyType key)
{ /* 在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为*/ /* 该元素在表中的位置,否则为0。算法9.1 */
ST.elem[0].key=key; /* 哨兵*/
cout<<"参与比较的关键字为:";
for(int i=ST.length;!EQ(ST.elem[i].key,key);--i) /* 从后往前找*/
cout< cout< return i; /* 找不到时,i为0 */ } Status Creat_Seq(SSTable &ST,int n) { //操作结果: 构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r) ST.elem=(ElemType *)calloc(n+1,sizeof(ElemType)); /* 动态生成n个数据元素空间(0号单元不用) */ if(!ST.elem) return ERROR; for(int i=1;i<=n;i++) *(ST.elem+i)=r[i-1]; /* 将全局数组r的值依次赋给ST */ ST.length=n; return OK; } Status Destroy(SSTable &ST) { /* 初始条件: 静态查找表ST存在。操作结果: 销毁表ST */ free(ST.elem); ST.elem=NULL; ST.length=0; return OK; } void Display(SSTable ST) { cout<<"待查找的顺序表为:\n"; for(int i=1;i<=ST.length;i++) cout<<"("< cout< } void main() { SSTable st; Creat_Seq(st,8); KeyType s; Display(st); for(int j=1;j<=2;j++) { cout<<"请输入待查找值的关键字:"; cin>>s; int i=Search_Seq(st,s); if(i) cout<<"关键字"< else cout<<"找不到该关键字!"< } Destroy(st); } 运行结果: 2.实现二分查找的算法 编写一个程序,输出在有序顺序表 { 2,8,12,20,26,30,43,67} 中采用二分查找法查找关键字12 和38的过程。要求: (1)程序能够输出查找过程中参与比较的全部关键字; (2)查找结果的表现形式:若查找成功,则输出关键字的位置,否则输出“找 不到该关键字!”的信息。 源代码: head.h: #include #include #include #include #include #include #include #include #include #include //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 //OVERFLOW 在math.h 中已定义为3 typedef int Status; typedef int Boolean; // 布尔类型 main.cpp: #include "head.h" typedef int KeyType; #define N 8 /* 数据元素个数*/ typedef struct /* 数据元素类型*/ { KeyType key; /* 关键字域*/ int others; /* 其它部分*/ }ElemType; ElemType r[N]={{2,1},{8,2},{12,3},{20,4},{26,5},{30,6},{43,7},{67,8}}; typedef struct { ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,0号单元留空int length; /* 表长度*/ }SSTable; #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)<=(b)) int Search_Bin(SSTable &ST,KeyType key) { /* 在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为*/ /* 该元素在表中的位置,否则为0。算法9.2 */ int low=1,high=ST.length; //置区间初值 cout<<"参与比较的关键字为:"; while(low<=high) { int mid=(low+high)/2; cout< if(EQ(key,ST.elem[mid].key))//找到待查元素 return mid; else if(LT(key,ST.elem[mid].key))//继续在前半区间进行查找 high=mid-1; else //继续在后半区间进行查找 low=mid+1; } cout< return 0; //有序表中不存在待查元素 } Status Creat_Seq(SSTable &ST,int n) { //操作结果: 构造一个含n个数据元素的静态顺序查找表ST(数据来自全局数组r) ST.elem=(ElemType *)calloc(n+1,sizeof(ElemType)); /* 动态生成n个数据元素空间(0号单元不用) */ if(!ST.elem) return ERROR; for(int i=1;i<=n;i++) *(ST.elem+i)=r[i-1]; /* 将全局数组r的值依次赋给ST */ ST.length=n; return OK; } Status Destroy(SSTable &ST) { /* 初始条件: 静态查找表ST存在。操作结果: 销毁表ST */ free(ST.elem); ST.elem=NULL; ST.length=0; return OK; } void Display(SSTable ST) { cout<<"待查找的有序表为:\n"; for(int i=1;i<=ST.length;i++) cout<<"("< cout< } void main() { SSTable st; Creat_Seq(st,8); KeyType s; Display(st); for(int j=1;j<=2;j++) { cout<<"请输入待查找值的关键字:"; cin>>s; int i=Search_Bin(st,s); if(i) cout<<"\n关键字"< else cout<<"找不到该关键字!"< } Destroy(st); } 运行结果: 折半查找的判定树: 3. 实现二叉排序树的基本运算 编写一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能: (1) 由{4,19,10,1, 28,6, 13, 5, 12, 7}创建一个二叉排序树bt ; (2) 判断bt 是否为一棵二叉排序树(提示:写一个函数,在遍历过程中检查是否符合二叉排序树定义); (3) 采用非递归方法查找关键字为6的结点,并输出查找过程中参与比较的全部关键字。 20 8 30 43 67 26 12 2 源代码: head.h: #include #include #include #include #include #include #include #include #include #include //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 //OVERFLOW 在math.h 中已定义为3 typedef int Status; typedef int Boolean; // 布尔类型 main.cpp: #include"head.h" typedef int KeyType; #define N 10 typedef struct /* 数据元素类型*/ { KeyType key; /* 关键字域*/ }ElemType; ElemType r[N]={4,19,10,1,28,6,13,5,12,7}; typedef ElemType TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; /* 左右孩子指针*/ }BiTNode,*BiTree; #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)<=(b)) Status InitDSTable(BiTree &DT) { /* 操作结果: 构造一个空的动态查找表DT */ DT=NULL; return OK; } void DestroyDSTable(BiTree DT) { /* 初始条件: 动态查找表DT存在。操作结果: 销毁动态查找表DT */ if(DT) /* 非空树*/ { if(DT->lchild) /* 有左孩子*/ DestroyDSTable(DT->lchild); /* 销毁左孩子子树*/ if(DT->rchild) /* 有右孩子*/ DestroyDSTable(DT->rchild); /* 销毁右孩子子树*/ free(DT); /* 释放根结点*/ DT=NULL; /* 空指针赋0 */ } } Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) /* 算法9.5(b)*/ { //在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素,若查找//成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上/*访问的最后一个结点并返回FALSE,指针f指向T的双亲,其初始调用值为NULL */ if(!T) /* 查找不成功*/ { p=f; return FALSE; } else if EQ(key,T->data.key) /* 查找成功*/ { p=T; return TRUE; } else if LT(key,T->data.key) SearchBST(T->lchild,key,T,p); /* 在左子树中继续查找*/ else SearchBST(T->rchild,key,T,p); /* 在右子树中继续查找*/ } Status InsertBST(BiTree &T, ElemType e) { //当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE,/* 否则返回FALSE。算法9.6*/ BiTree p,s; if(! SearchBST(T,e.key,NULL,p)) /* 查找不成功*/ { s=(BiTree)malloc(sizeof(BiTNode)); s->data=e; s->lchild=s->rchild=NULL; if(!p) T=s; /* 被插结点*s为新的根结点*/ else if LT(e.key,p->data.key) p->lchild=s; /* 被插结点*s为左孩子*/ else p->rchild=s; /* 被插结点*s为右孩子*/ return TRUE; } else return FALSE; /* 树中已有关键字相同的结点,不再插入*/ } void TraverseDSTable(BiTree &DT,void(*Visit)(ElemType)) { /* 初始条件: 动态查找表DT存在,Visit是对结点操作的应用函数*/ /* 操作结果: 按关键字的顺序对DT的每个结点调用函数Visit()一次且至多一次*/ if(DT) { TraverseDSTable(DT->lchild,Visit); /* 先中序遍历左子树*/ Visit(DT->data); /* 再访问根结点*/ TraverseDSTable(DT->rchild,Visit); /* 最后中序遍历右子树*/ } } void print(ElemType c) { cout< } BiTree SearchBST(BiTree &T,KeyType key) { BiTree p=T; cout<<"参与比较的关键字为:"; while(p && !EQ(p->data.key,key)) { cout< if(LT(key,p->data.key)) p=p->lchild; else p=p->rchild; } if(p) cout< cout< return p; } void main() { BiTree bt,P; int j; KeyType s; InitDSTable(bt); cout<<"1.由{4,19,10,1, 28,6, 13, 5, 12, 7}创建一个二叉排序树bt."< cout<<"2.判断bt是否为一棵二叉排序树."< cout<<"3.采用非递归方法查找关键字为6的结点,并输出查找过程中参与比较的全部关键字."< cout<<"0.退出."< while(1) { cout<<"选择:"; int f; cin>>f; switch(f) { case 1: for(j=0;j if(!InsertBST(bt,r[j])) /* 依次插入数据元素*/ { cout<<"创建失败."< exit(0); } cout<<"创建成功."< break; case 2: cout<<"中序遍历二叉排序树所得关键字序列为:"; TraverseDSTable(bt,print); cout<<"\n由于中序遍历二叉排序树所得关键字序列有序,故bt是一棵二叉排序树."< break; case 3: cout<<"请输入待查找值的关键字:"; cin>>s; P=SearchBST(bt,s); if(P) cout<<"查找成功."< else cout<<"找不到该关键字!"< break; case 0: DestroyDSTable(bt); exit(0); default: cout<<"选择有误,重新"; } } } 运行结果: 程序创建的二叉排序树: 5 19 28 7 10 13 6 4 12 1 4.实现哈希表的相关运算 参考程序中给出了相关类型定义以及一些子程序,实现哈希表的相关运算,请在此基础上编写主程序完成如下功能: (1)建立{26,36,41,38,44,15,68,12,06,51,25}哈希表A[0…14], 哈希函数为H(k)=key % 13,并采用线性探测法解决冲突。输出哈希表;输 出查找成功的平均查找长度。 (2)在上述哈希表中查找关键字为25的记录; (3)在上述哈希表中删除关键字为38的记录,然后在表中查找关键字为38 的 记录,输出查找结果。 (4)重新将关键字为38的记录插入表中,然后输出哈希表。 要求输出格式如下: 哈希地址:0 1 2 (12) 关键字值:…………………… 探查次数:…………………… 源代码: head.h: #include #include #include #include #include #include #include #include #include #include //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 //OVERFLOW 在math.h 中已定义为3 typedef int Status; typedef int Boolean; // 布尔类型 main.cpp: #include"head.h" #define MaxSize 100 //定义最大哈希表长度 #define NULLKEY -1 //定义空关键字值 #define DELKEY -2 //定义被删关键字值 typedef int KeyType; //关键字类型 //typedef char * InfoType; //其他数据类型 typedef struct { KeyType key; //关键字域 //InfoType data; //其他数据域,实验中此域可省略 int count; //探查次数域 }HashTable[MaxSize]; //哈希表类型 void InsertHT(HashTable &ha,int &n,KeyType k,int p) //将关键字k插入到哈希表中{ int i,adr; adr=k % p; if (ha[adr].key==NULLKEY || ha[adr].key==DELKEY) //x[j]可以直接放在哈希表中{ ha[adr].key=k; ha[adr].count=1; } else //发生冲突时采用线性探查法解决冲突 { i=1; //i记录x[j]发生冲突的次数 do { adr=(adr+1) % p; i++; } while (ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY); ha[adr].key=k; ha[adr].count=i; } n++; } void CreateHT(HashTable &ha,KeyType x[],int n,int m,int p) //创建哈希表 { int i,n1=0; for (i=0;i { ha[i].key=NULLKEY; ha[i].count=0; } for (i=0;i InsertHT(ha,n1,x[i],p); } int SearchHT(HashTable ha,int p,KeyType k) //在哈希表中查找关键字k { int i=0,adr; while (ha[adr].key!=NULLKEY && ha[adr].key!=k) { i++; //采用线性探查法找下一个地址 adr=(adr+1) % p; } if (ha[adr].key==k) //查找成功 return adr; else //查找失败 return -1; } int DeleteHT(HashTable ha,int p,int k,int &n) //删除哈希表中关键字k { int adr; adr=SearchHT(ha,p,k); if (adr!=-1) //在哈希表中找到该关键字 { ha[adr].key=DELKEY; n--; //哈希表长度减1 return 1; } else //在哈希表中未找到该关键字 return 0; } void DispHT(HashTable &ha,int n,int m) //输出哈希表 { int i; printf(" 哈希表地址\t"); for (i=0;i printf(" %3d",i); printf("\n"); printf(" 哈希表关键字\t"); for (i=0;i if (ha[i].key==NULLKEY || ha[i].key==DELKEY) printf(" "); //输出3个空格 else printf(" %3d",ha[i].key); printf("\n"); printf(" 搜索次数\t"); for (i=0;i if (ha[i].key==NULLKEY || ha[i].key==DELKEY) printf(" "); //输出3个空格 else printf(" %3d",ha[i].count); } void calASL(HashTable &ha,int n,int m) { float avg=0; for (int i=0;i if (ha[i].key!=NULLKEY && ha[i].key!=DELKEY) avg=avg+ha[i].count; avg=avg/n; printf("\t平均搜索长度ASL(%d)=%g\n",n,avg); } void main() { HashTable hash; int n=11,m=15,p=13,f,i; KeyType s,x[]={26,36,41,38,44,15,68,12,06,51,25}; cout<<"1.建立哈希表."< cout<<"2.输出哈希表."< cout<<"3.计算平均搜索长度."< cout<<"4.查找关键字."< cout<<"5.删除关键字."< cout<<"6.插入关键字."< cout<<"0.退出."< while(1) { cout<<"\n选择:"; cin>>f; switch(f) { case 1: CreateHT(hash,x,n,m,p); cout<<"\t创建成功."< break; case 2: cout<<"\t\t -------------------------哈希表-------------------------"< DispHT(hash,n,m); cout<<"\t\t --------------------------------------------------------"< break; case 3: calASL(hash,n,m); break; case 4: cout<<"\t输入要查找的关键字:"; cin>>s; i=SearchHT(hash,p,s); if(i!=-1) cout<<"\t"< else cout<<"\t查找失败."< break; case 5: cout<<"\t输入要删除的关键字:"; cin>>s; if(DeleteHT(hash,p,s,n)) cout<<"\t删除成功."< else cout<<"\t在哈希表中未找到该关键字."< break; case 6: cout<<"\t输入要插入的关键字:"; cin>>s; InsertHT(hash,n,s,p); cout<<"\t插入成功."< break; case 0: exit(0); default: cout<<"\n选择有误,重新选择."; } } } 运行结果: 【小结或讨论】 通过本次实验,掌握了顺序查找、二分查找、二叉排序树和哈希表的相关算法和运算,并且能够编程实现相应的功能。 实验内容1里面的语句“ST.elem[0].key=key;”目的在于免去查找过程中每一步都要检测整个表是否查找完毕,ST.elem[0]起到了监视哨的作用,提高了程序的效率。 在折半查找过程中的判定树不是完全二叉树,但它的叶子结点所在层次之差最多为1,从而n个结点的判定树的深度和n个结点的完全二叉树的深度相同。 折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构。 二叉排序树既拥有类似于折半查找的特性,又采用了链表作存储结构,因此是动态 查找的一种适宜表示。中序遍历二叉排序树可得到一个关键字的有序序列。 对于不同的关键字可能得到同一哈希地址,即产生冲突,通常采用的处理冲突的方 法有以下几种:开放定址法、再哈希法、链地址法和建立一个公共溢出区。本次实验用的是开放定址法中线性探测再散列。 发生冲突的可能性和哈希表的装填因子(表中填入的记录数/哈希表的长度)有关,装 填因子越小,发生冲突的可能性就越小;相反就越大。 陕西科技大学实验报告 班级学号姓名实验组别 实验日期室温报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:查找与排序算法的实现和应用 实验目的: 1. 掌握顺序表中查找的实现及监视哨的作用。 2. 掌握折半查找所需的条件、折半查找的过程和实现方法。 3. 掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。 4. 掌握哈希表的基本概念,熟悉哈希函数的选择方法,掌握使用线性探测法和链地址法进行冲突解决的方 法。 5. 掌握直接插入排序、希尔排序、快速排序算法的实现。 实验环境(硬/软件要求):Windows 2000,Visual C++ 6.0 实验内容: 通过具体算法程序,进一步加深对各种查找算法的掌握,以及对实际应用中问题解决方 法的掌握。各查找算法的输入序列为:26 5 37 1 61 11 59 15 48 19输出 要求:查找关键字37,给出查找结果。对于给定的某无序序列,分别用直接插入排序、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。 各排序算法输入的无序序列为:26 5 37 1 61 11 59 15 48 19。 实验要求: 一、查找法 1. 顺序查找 首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序 表中进行查找。 2. 折半查找 任意输入一组数据作为个数据元素的键值,首先将此序列进行排序,然后再改有序表上 使用折半查找算法进对给定值key 的查找。 3. 二叉树查找 任意输入一组数据作为二叉排序树中节点的键值,首先创建一颗二叉排序树,然后再次二叉排序树上实现对一 定k的查找过程。 4. 哈希表查找 任意输入一组数值作为个元素的键值,哈希函数为Hash (key )=key%11, 用线性探测再散列法解决冲突问题。 二、排序算法 编程实现直接插入排序、希尔排序、快速排序各算法函数;并编写主函数对各排序函数进行测试。 实验原理: 1. 顺序查找: 在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以 数据结构实验报告全集 实验一线性表基本操作和简单程序 1 .实验目的 (1 )掌握使用Visual C++ 6.0 上机调试程序的基本方法; (2 )掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2 .实验要求 (1 )认真阅读和掌握和本实验相关的教材内容。 (2 )认真阅读和掌握本章相关内容的程序。 (3 )上机运行程序。 (4 )保存和打印出程序的运行结果,并结合程序进行分析。 (5 )按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>// 头文件 #include nodetype *create()// 建立单链表,由用户输入各结点data 域之值, // 以0 表示输入结束 { elemtype d;// 定义数据元素d nodetype *h=NULL,*s,*t;// 定义结点指针 int i=1; cout<<" 建立一个单链表"< 实验七查找 一、实验目的 1. 掌握查找的不同方法,并能用高级语言实现查找算法; 2. 熟练掌握二叉排序树的构造和查找方法。 3. 熟练掌握静态查找表及哈希表查找方法。 二、实验内容 设计一个读入一串整数,然后构造二叉排序树,进行查找。 三、实验步骤 1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。 2. 在二叉排序树中查找某一结点。 3.用其它查找算法进行排序(课后自己做)。 四、实现提示 1. 定义结构 typedef struct node { int key; int other; struct node *lchild, *rchild; } bstnode; void inorder ( t ) { if (t!=Null) { inorder(t→lchild); printf(“%4d”, t→key); inorder(t→rchild); } } bstnode *insertbst(t, s) bstnode *s, *t; { bstnode *f, *p; p=t; while(p!=Null) { f=p; if (s→key= =p→key) return t; if (s→key 第三节排序和查找 一、教材分析 排序和查找算法是一种数据处理问题最常用的算法思想,在日常生活和学习过程中,经常需要对各种数据进行查找,而且总是希望要查找的数据井然有序,这样可以节约时间和精力,其实就是排序问题,在绝大多数情况下,查找是和排序紧密结合在一起的。本节在编写上力求前面体现排序和查找算法的基本思想,设计了一个典型的“运动员比赛成绩管理问题”,本节在设计上,就是让学生通过经历一个充分体现查找和排序的活动的算法分析设计过程,体验和感受相对比较简单的冒泡排序法和顺序查找法的基本思想,了解排序和查找的应用场合。在实践示例中通过与基本排序查找算法对比引入改良的算法选择排序法和二分查找法,让学生深入理解和掌握排序和查找算法的基本思想。通过运动会管理程序不同模块对数组的引用,让学生了解变量的作用范围。通过课堂三个教学活动的分析设计,让学生深入理解和体会模块化程序设计思想。排序和查找算法的原理与解析法和穷举法相比复杂了一些,如果通过大量的实践应用,也是很容易掌握的,在学习指引中有明确的描述。 在活动设计上,用到了两个“分析”和一个“实现”,旨在让学生重点关注冒泡法的分析过程和顺序查找法的分析过程,并在程序实现的过程中,体会变量的作用范围和两个分析子程序的调用过程,在宏观上渗透模块化程序设计思想。 1.教学活动一分析:分析比赛成绩排序算法并编写程序 3.教学活动三分析:实现运动会管理的应用程序 4.选择排序算法及示例分析: 选择排序算法是对冒泡排序算法的改进,通过下面的活动分析,旨在让学生在对比分析过程中掌握排序的基本思想。熟练掌握两种排序算法的使用过程及关键问题的处理过程,尤其是不同排序算法之间的排序原理的区别,决定了学生在今后解决实际问题中选择何种排序算法的重要依据,是学生算法分析素养的提升的关键环节。 示例:寻找一个数列中最小数的方法 查询过程:采用循环和选择程序结构,按顺序逐一比较数列中相邻的两个数,通过交换位置或记忆位置的方式,找到最小数。 5.二分查找算法及示例分析: 二分查找算法是对顺序查找算法的改进,通过下面的活动分析,旨在让学生在对比分析过程中掌握不同的查询思想。熟练掌握两种查询算法的使用过程及关键问题的处理过程,尤其是不同查询算法之间的查询分析过程的区别,决定了学生在今后解决实际问题中选择何种查询算法的重要依据,是学生算法分析素养的提升的关键环节。 示例:在有序数列A{3,16,20,27,35,39,46,48,55,73}中查找20和71 中南民族大学管理学院学生实验报告 实验项目: 约瑟夫问题 课程名称:数据结构 年级: 专业:信息管理与信息系统 指导教师: 实验地点:管理学院综合实验室 完成日期: 小组成员: 2012 学年至2013 学年度第1 学期 一、实验目的 (1)掌握线性表表示和实现; (2)学会定义抽象数据类型; (3)学会分析问题,设计适当的解决方案; 二、实验内容 【问题描述】:编号为1,2,…,n的n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到m 时停止报数。报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 【基本要求】:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 【测试数据】:m 的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。 三、实验步骤 (一)需求分析 对于这个程序来说,首先要确定构造链表时所用的插入方法。当数到m 时一个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。由于是循环计数,所以才采用循环列表这个线性表方式。 程序存储结构利用单循环链表存储结构存储约瑟夫数据(即n个人的编码等),模拟约瑟夫的显示过程,按照出列的顺序显示个人的标号。编号为1,2,…,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始按顺时针方向自1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求是利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 程序执行的命令(1)构造单向循环链表。 (2)按照出列的顺序引出各个人的标号。 测试数据 m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5) (1)、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保留了front头结点。在每加入一个节点时,都会直接连接在front后面,从而保证一开始就赋值的rear尾节点不用修改。 伪代码阐释如下: 实验五 查找算法实现 1、实验目的 熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。 2、问题描述 查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。 3、基本要求 (1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。 (2)根据给定的数据建立平衡二叉树。 4、测试数据 随即生成 5、源程序 #include<> #include<> #include<> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)>(b)) typedef int Keytype; typedef struct { Keytype key; //关键字域 }ElemType; typedef struct BSTnode { ElemType data; int bf; struct BSTnode *lchild,*rchild; }BSTnode,*BSTree; void InitBSTree(BSTree &T) {T=NULL; } void R_Rotate(BSTree &p) {BSTnode *lc; lc=p->lchild; p->lchild=lc->rchild; lc->rchild=p; p=lc; } void L_Rotate(BSTree &p) {BSTnode *rc; rc=p->rchild; p->rchild=rc->lchild; 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include 数据结构课程设计 ——停车场管理问题 姓名: 学号: 问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的 车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 二、实现要求 要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。 三、实现提示 汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(‘A',,1,5)表示1号牌照车在5这个时刻到达,而(‘ D ',,5,20)表示5号牌照车在20这个时刻离去。整个程序可以在输入信息为(‘ E ',0,0)时结束。本题可用栈和队列来实现。 四、需求分析 停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。停车场的管理流程如 下 ①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。 ②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道) 中是否有车,有车则从队列头取出一辆车压入栈中。 实验报告七查找实验 一、实验目的: 1、熟悉线性查找算法。 2、掌握顺序查找、二分查找算法 二、实验内容: 1.SeqList类中增加下列成员方法: public int lastIndexOf(T key) { //返回最后出现的关键字为key元素位置int num=0; for(int i=0;i 云南大学软件学院数据结构实验报告 (本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □ 学期:2010秋季学期 任课教师: 实验题目: 查找算法设计与实现 姓名: 王辉 学号: 20091120154 电子邮件: 完成提交时间: 2010 年 12 月 27 日 云南大学软件学院2010学年秋季学期 《数据结构实验》成绩考核表 学号:姓名:本人承担角色: 综合得分:(满分100分) 指导教师:年月日(注:此表在难度为C时使用,每个成员一份。) (下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%) 1 哈希表查找。根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。 熟悉各种查找算法的思想。 2、掌握查找的实现过程。 3、学会在不同情况下运用不同结构和算法求解问题。 4 把每个学生的信息放在结构体中: typedef struct //记录 { NA name; NA tel; NA add; }Record; 5 void getin(Record* a)函数依次输入学生信息 6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。并采用二次探测再散列法解决冲突。 7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。完成按姓名查询的操作。将初始班级的通讯录信息存入文件。 二、【实验设计(Design)】(20%) (本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系) 1抽象数据类型的功能规格说明和结构体: #include 《数据结构实验》的实验题目及实验报告模板 实验一客房管理(链表实验) ●实现功能:采用结构化程序设计思想,编程实现客房管理程序的各个功能函数,从而熟练 掌握单链表的创建、输出、查找、修改、插入、删除、排序和复杂综合应用等操作的算法 实现。以带表头结点的单链表为存储结构,实现如下客房管理的设计要求。 ●实验机时:8 ●设计要求: #include 2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList [内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template 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;i 一、实验名称:Apriori和Fp-growth算法 二、实验日期:2013年10 月18 日 三、实验目的: 通过本次实验掌握Apriori和Fp-growth算法的思想 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置:内存,2G及以上硬盘250G及以上 软件环境:操作系统windows server 2003 数据库环境:Microsoft SQL SERVER 2005 五、实验的步骤和方法: 假设事务集合T如下表所示: 事务ID事务的项目集 T1A,B,E T2B,D T3B,C T4A,B,D T5A,C T6B,C T7A,C T8A,B,C,E 1、根据以上事务集合,通过Apriori算法实现: 1)假定最小事务支持数是2,写出搜索所有频繁项集的过程。 2)假定最小置信度为60%,写出1)题中已求出的频繁3-项集的所有项组成的强关联规则。 在事务数据库中,频繁项集L={A,B,E},可以由L产生哪些关联规则? L的非空子集S有:{A, B}, {A, E}, {B, E}, {A}, {B},{E}。可得到关联规则如下: A ∧ B → E conf=2/3=66% A ∧ E → B conf=2/2=100% B ∧ E → A conf=2/2=100% A → B ∧ E conf=2/5=40% B → A ∧ E conf=2/6=33% E → A ∧ B conf=2/2=100% 假设最小置信度为60%,则最终输出的关联规则为: A ∧ B → E 66% A ∧ E → B 100% B ∧ E → A 100% E → A ∧ B 100% 2、根据以上事务集合,通过Fp-growth算法实现: 南京工程学院实验报告 操作的函数程序清单,分别用顺序表和链表结构完成,并在首页上表明团队名称、成员及个人的工作(函数),未来的成绩评定时将包含这一部分的团队成绩及个人的工作成绩。 一、实验目的 1.熟悉上机环境,进一步掌握语言的结构特点。 2.掌握线性表的顺序存储结构的定义及实现。 3.掌握线性表的链式存储结构——单链表的定义及实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、程序主要语句及作用(main函数程序清单) 程序1的主要代码(附简要注释) #include 实验七查找和排序算法的实现 一.实验目的及要求 (1)学生在实验中体会各种查找和内部排序算法的基本思想、适用场合,理解开发高效算法的可能性和寻找、构造高效算法的方法。 (2)掌握运用查找和排序解决一些实际应用问题。 二.实验内容: (1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。 (2)编程实现一种内部排序算法(如插入排序、快速排序等)。 三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页) (1)编程实现一种查找算法(如折半查找、二叉排序树的查找、哈希查找等),并计算相应的ASL。 ?程序代码: 折半查找: 头文件: #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define maxlength 20 typedef int ElemType; typedef struct{ ElemType key; ElemType other; }card;//每条记录包含的数据项 typedef struct{ card r[maxlength]; int length; }SSTable;//一张表中包含的记录容量 void Create(SSTable &L); int Search(SSTable L,int elem); 功能函数: #include"1.h" #include"stdio.h" void Create(SSTable &L) { printf("新的线性表已经创建,请确定元素个数(不超过20)\n"); scanf("%d",&L.length); printf("请按递增序列输入具体的相应个数的整数元素(空格隔开)\n"); for(int i=0;i 常用算法经典代码(C++版) 一、快速排序 void qsort(int x,int y) //待排序的数据存放在a[1]..a[n]数组中 {int h=x,r=y; int m=a[(x+y)>>1]; //取中间的那个位置的值 while(h实验8查找与排序算法的实现和应用
(完整版)数据结构实验报告全集
数据结构实验七 查找
第三节 排序和查找
约瑟夫问题数据结构实验报告汇总.
数据结构实验——查找算法的实现
数据结构实验报告
数据结构停车场问题实验报告汇总
实验七 查找
数据结构实验报告七查找、
《数据结构实验》实验题目及实验报告模板
数据结构实验报告模板
数据结构实验报告及心得体会
实验7算法答案
数据结构实验报告
查找和排序算法的实现(实验七)
C常用经典算法及其实现