数据结构C语言实现顺序查找,折半查找,二叉排序树,哈希表实验原理(实验原理+程序代码+程序截图+实验小结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int i,n,num;
int top,bottom,mid;
int flag=1; //如果在表列中找到数字,则值为1,否则为0
int loc=-1;//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数;如果有这个数,则它的值为所在的位置
printf("你想在多少个数中进行折半查找,请输入(1--20):");
学号:E30814013专业:网络工程姓名:张芸
实验日期:2010-6-12教师签字:成绩
实验报告
实验目的:实现顺序查找,折半查找,二叉排序树,哈希表实验原理:
顺序查找
int Search_Seq(SSTable ST, KeyType key) { //算法9.1
//在顺序表ST中顺序查找其关键字等于key的数据元素。
scanf("%d",&n);
while(n<1 || n>20)
{
printf("你输入的数不正确,请重新输入。\n");
printf("你想在多少个数中进行折半查找,请输入(1--20):");
scanf("%d",&n);
}
printf("请你输入一个整数a[1]:");
scanf("%d",&a[1]);
for(i=0;i<5;i++)
{
scanf("%d",&b);
c=b%7;
A:if(a[c]==0)a[c]=b;
else {c=(c+1)%7;j++;goto A;}
printf("%d在哈希表的第%d位,第%d次放入哈希表\n",b,c,j);
j=1;}
}
实验小结:本程序通过相关算法实现二叉树的排列和查找,用中序遍历输出二叉树
//在开放定址哈希表H中查找关键码为K的元素,
//若查找成功,以p指示待查数据元素在表中位置,并返回SUCCESS;
//否则,以p指示插入位置,并返回UNSUCCESS,
// c用以计冲突次数,其初值置零,供建表插入时参考
p = Hash(K); //求得哈希地址
while ((H.elem[p].key != NULLKEY) && //该位置中填有记录
{
printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);
if( (num>a[top]) || (num<a[bottom]) ) //输入的数num>a[top]或者num<a[bottom],肯定num不在这个表列中
}
else
{
if (NULL == cursor->rchild)
{
cursor->rchild = node;
break;
}
cursor = cursor->rchild;
}
}
}
return;
}
/*查找指定值*/
BSTree Search(BSTree tree, ElemType item)
{
BSTree cursor = tree;
#define FALSE 0
#define LEN 10000
typedef int ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode *lchild, *rchild;
} BSTNode, *BSTree;
/*插入新节点*/
*tree = node;
else
{
BSTree cursor = *tree;
while (1)
{
if (item < cursor->data)
{
if (NULL == cursor->lchild)
{
cursor->lchild = node;
break;
}
cursor = cursor->lchild;
void Insert(BSTree *tree, ElemType item)
{
BSTree node = (BSTree)malloc(sizeof(BSTNode));
node->data = item;
node->lchild = node->rchild = NULL;
if (!*tree)
//若找到,则函数值为该元素在表中的位置,否则为0。
int i=0;
ST.elem[0].key=key; // "哨兵"
for (i=ST.length; ST.elem[i].key!=key; --i); //从后往前找
return i; //找不到时,i为0
} // Search_Seq
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
/*中缀遍历*/
void Inorder(BSTree tree)
{
BSTree cursor = tree;
if (cursor)
{
Inorder(cursor->lchild);
printf(OUTFMT, cursor->data);
Inorder(cursor->rchild);
}
}
/*回收资源*/
{
if(x==a[i])
{
y=1;
printf("你要查找的数%d在第个%d位置\n",x,i+1);
break;
}
}
if(y==0)printf("无法找到你要查找的数\n");
}
折半查找
#include <stdio.h>
#define N 21
void main(void)
{
int a[N];
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num等于找到的数
{
loc=mid;
printf("找到数%6d的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若a[mid]>num,则num一定在a[bottom]和a[mid-1]范围之内
// p返回的是插入位置
} // SearchHash
顺序查找
#include<stdio.h>
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,x,y;
printf("输入你要查找的数:\n");
scanf("%d",&x);
y=0;
for(i=0;i<10;i++)
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");
printf("请你输入要查找的数:");
scanf("%d",&num);
flag=1; //假设输入的数在表列中
top=n;
bottom=1;
mid=(top+bottom)/2;
while(flag)
} while (choice=='y'||choice=='Y');
Cleanup(root);
}
哈希表
#include<stdio.h>
void main()
{
int a[10];
int b,i,j,c;
j=1;
for(i=0;i<9;i++)
a[i]=0;
printf("请输入5个数(非零)\n");
i=2;
while(i<=n) //输入从小到大的表列
{
printf("请你输入一个整数a[%d]:",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你输入的数不满足要求,请重新输入。\n");
}
//输出表列
printf("\n输出表列\n");
printf("Searching...\n");
ret = Search(root, item);
if (NULL == ret)
printf("查找失败!");
else
printf("查找成功!");
printf("\n继续测试按y,退出按其它键。\n");
choice = getchar();
!equal(K, (H.elem[p].key))) //并且关键字不相等
collision(p, ++c); //求得下一探查地址p
if (equal(K, (H.elem[p].key)))
return SUCCESS; //查找成功,p返回待查数据元素位置
else return UNSUCCESS; //查找不成功(H.elem[p].key == NULLKEY),
Insert(&root, item);
else
break;
}
}
printf("\n\n创建完成...\n");
Inorder(root);
printf("\n\n");
/*二叉排序树的查找测试*/
do
{
printf("\n请输入查找数据:");
scanf("%d", &item);
getchar();
}
}
二叉排序树
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define INFMT "%d"
#define OUTFMT "%d "
/* #define NULL 0L */
#define BOOL int
#define TRUE 1
char choice;
BSTree root = NULL, ret; /*必须赋予NULL值,否则出错*/
BOOL finish = FALSE;
do
{
printf("请输入数据(-10000结束):\n");
while (1)
{来自百度文库
scanf(INFMT, &item);
if (-10000 != item)
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。
哈希表
Status SearchHash(HashTable H, HKeyType K, int &p, int &c) {
//算法9.17
void Cleanup(BSTree tree)
{
BSTree cursor = tree, temp = NULL;
if (cursor)
{
Cleanup(cursor->lchild);
Cleanup(cursor->rchild);
free(cursor);
}
}
void main()
{
ElemType item;
对于查找的树有找到和未找到两种结果。顺序查找为查找已有数组中的元素。折半查找手动输入数组,后进行查找,数组一定要有序(升序);哈希表显示了数据放入哈希表的过程,H函数为模7除法。
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若a[mid]<num,则num一定在a[mid+1]和a[top]范围之内
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}
if(loc==-1)
{
printf("%d这个数在表列中没有找到。\n",num);
while (cursor)
{
if (item == cursor->data)
return cursor;
else if ( item < cursor->data)
cursor = cursor->lchild;
else
cursor = cursor->rchild;
}
return NULL;
}
int top,bottom,mid;
int flag=1; //如果在表列中找到数字,则值为1,否则为0
int loc=-1;//要查找的数在表列中的位置,如果loca=-1表示表列中没有这个数;如果有这个数,则它的值为所在的位置
printf("你想在多少个数中进行折半查找,请输入(1--20):");
学号:E30814013专业:网络工程姓名:张芸
实验日期:2010-6-12教师签字:成绩
实验报告
实验目的:实现顺序查找,折半查找,二叉排序树,哈希表实验原理:
顺序查找
int Search_Seq(SSTable ST, KeyType key) { //算法9.1
//在顺序表ST中顺序查找其关键字等于key的数据元素。
scanf("%d",&n);
while(n<1 || n>20)
{
printf("你输入的数不正确,请重新输入。\n");
printf("你想在多少个数中进行折半查找,请输入(1--20):");
scanf("%d",&n);
}
printf("请你输入一个整数a[1]:");
scanf("%d",&a[1]);
for(i=0;i<5;i++)
{
scanf("%d",&b);
c=b%7;
A:if(a[c]==0)a[c]=b;
else {c=(c+1)%7;j++;goto A;}
printf("%d在哈希表的第%d位,第%d次放入哈希表\n",b,c,j);
j=1;}
}
实验小结:本程序通过相关算法实现二叉树的排列和查找,用中序遍历输出二叉树
//在开放定址哈希表H中查找关键码为K的元素,
//若查找成功,以p指示待查数据元素在表中位置,并返回SUCCESS;
//否则,以p指示插入位置,并返回UNSUCCESS,
// c用以计冲突次数,其初值置零,供建表插入时参考
p = Hash(K); //求得哈希地址
while ((H.elem[p].key != NULLKEY) && //该位置中填有记录
{
printf("top=%d, bottom=%d, mid=%d, a[%d]=%d\n",top,bottom,mid,mid,a[mid]);
if( (num>a[top]) || (num<a[bottom]) ) //输入的数num>a[top]或者num<a[bottom],肯定num不在这个表列中
}
else
{
if (NULL == cursor->rchild)
{
cursor->rchild = node;
break;
}
cursor = cursor->rchild;
}
}
}
return;
}
/*查找指定值*/
BSTree Search(BSTree tree, ElemType item)
{
BSTree cursor = tree;
#define FALSE 0
#define LEN 10000
typedef int ElemType;
typedef struct BSTNode
{
ElemType data;
struct BSTNode *lchild, *rchild;
} BSTNode, *BSTree;
/*插入新节点*/
*tree = node;
else
{
BSTree cursor = *tree;
while (1)
{
if (item < cursor->data)
{
if (NULL == cursor->lchild)
{
cursor->lchild = node;
break;
}
cursor = cursor->lchild;
void Insert(BSTree *tree, ElemType item)
{
BSTree node = (BSTree)malloc(sizeof(BSTNode));
node->data = item;
node->lchild = node->rchild = NULL;
if (!*tree)
//若找到,则函数值为该元素在表中的位置,否则为0。
int i=0;
ST.elem[0].key=key; // "哨兵"
for (i=ST.length; ST.elem[i].key!=key; --i); //从后往前找
return i; //找不到时,i为0
} // Search_Seq
二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:
/*中缀遍历*/
void Inorder(BSTree tree)
{
BSTree cursor = tree;
if (cursor)
{
Inorder(cursor->lchild);
printf(OUTFMT, cursor->data);
Inorder(cursor->rchild);
}
}
/*回收资源*/
{
if(x==a[i])
{
y=1;
printf("你要查找的数%d在第个%d位置\n",x,i+1);
break;
}
}
if(y==0)printf("无法找到你要查找的数\n");
}
折半查找
#include <stdio.h>
#define N 21
void main(void)
{
int a[N];
{
loc=-1;
flag=0;
}
else if(a[mid]==num) //如果num等于找到的数
{
loc=mid;
printf("找到数%6d的位置%2d\n",num,loc);
break;
}
else if(a[mid]>num) //若a[mid]>num,则num一定在a[bottom]和a[mid-1]范围之内
// p返回的是插入位置
} // SearchHash
顺序查找
#include<stdio.h>
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i,x,y;
printf("输入你要查找的数:\n");
scanf("%d",&x);
y=0;
for(i=0;i<10;i++)
for(i=1; i<=n; i++)
{
printf("%6d",a[i]);
}
printf("\n");
printf("请你输入要查找的数:");
scanf("%d",&num);
flag=1; //假设输入的数在表列中
top=n;
bottom=1;
mid=(top+bottom)/2;
while(flag)
} while (choice=='y'||choice=='Y');
Cleanup(root);
}
哈希表
#include<stdio.h>
void main()
{
int a[10];
int b,i,j,c;
j=1;
for(i=0;i<9;i++)
a[i]=0;
printf("请输入5个数(非零)\n");
i=2;
while(i<=n) //输入从小到大的表列
{
printf("请你输入一个整数a[%d]:",i);
scanf("%d",&a[i]);
if(a[i] > a[i-1])
i++;
else
printf("你输入的数不满足要求,请重新输入。\n");
}
//输出表列
printf("\n输出表列\n");
printf("Searching...\n");
ret = Search(root, item);
if (NULL == ret)
printf("查找失败!");
else
printf("查找成功!");
printf("\n继续测试按y,退出按其它键。\n");
choice = getchar();
!equal(K, (H.elem[p].key))) //并且关键字不相等
collision(p, ++c); //求得下一探查地址p
if (equal(K, (H.elem[p].key)))
return SUCCESS; //查找成功,p返回待查数据元素位置
else return UNSUCCESS; //查找不成功(H.elem[p].key == NULLKEY),
Insert(&root, item);
else
break;
}
}
printf("\n\n创建完成...\n");
Inorder(root);
printf("\n\n");
/*二叉排序树的查找测试*/
do
{
printf("\n请输入查找数据:");
scanf("%d", &item);
getchar();
}
}
二叉排序树
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define INFMT "%d"
#define OUTFMT "%d "
/* #define NULL 0L */
#define BOOL int
#define TRUE 1
char choice;
BSTree root = NULL, ret; /*必须赋予NULL值,否则出错*/
BOOL finish = FALSE;
do
{
printf("请输入数据(-10000结束):\n");
while (1)
{来自百度文库
scanf(INFMT, &item);
if (-10000 != item)
①若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
②若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
③左、右子树本身又各是一棵二叉排序树。
哈希表
Status SearchHash(HashTable H, HKeyType K, int &p, int &c) {
//算法9.17
void Cleanup(BSTree tree)
{
BSTree cursor = tree, temp = NULL;
if (cursor)
{
Cleanup(cursor->lchild);
Cleanup(cursor->rchild);
free(cursor);
}
}
void main()
{
ElemType item;
对于查找的树有找到和未找到两种结果。顺序查找为查找已有数组中的元素。折半查找手动输入数组,后进行查找,数组一定要有序(升序);哈希表显示了数据放入哈希表的过程,H函数为模7除法。
{
top=mid-1;
mid=(top+bottom)/2;
}
else if(a[mid]<num) //若a[mid]<num,则num一定在a[mid+1]和a[top]范围之内
{
bottom=mid+1;
mid=(top+bottom)/2;
}
}
if(loc==-1)
{
printf("%d这个数在表列中没有找到。\n",num);
while (cursor)
{
if (item == cursor->data)
return cursor;
else if ( item < cursor->data)
cursor = cursor->lchild;
else
cursor = cursor->rchild;
}
return NULL;
}