数据结构实验报告五 查找

一、实验目的

1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。
2、掌握线性表中顺序查找和折半查找的方法。
3、学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。

二、实验内容和要求

1.静态查找表技术

依据顺序查找算法和折半查找算法的特点,对下面的两个查找表选择一个合适的算法,设计出完整的C源程序。并完成问题:
查找表1 : { 8 ,15 ,19 ,26 ,33 ,41 ,47 ,52 ,64 ,90 } ,查找key = 41
查找表2 : {12 ,76 ,29 ,15 ,62 ,35 ,33 ,89 ,48 ,20 } ,查找key =35
查找key=41的算法:折半查找算法 比较次数:3
查找key=35的算法:顺序查找算法 比较次数:5

顺序查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;

typedef struct
{
    KeyType key;
}ElemType;
typedef struct
{
    ElemType elem[MAX_NUM];
    int length;
}SSTable;
int seq_search(SSTable ST,KeyType key)
{
    int i;
    ST.elem[0].key=key;
    for(i=ST.length;ST.elem[i].key!=key;i--);
    return i;
}
int main()
{
    SSTable ST;
    KeyType tkey;
    int n,i;
    ST.length=0;
    printf("请输入查找表元素个数:");
    scanf("%d",&n);
    printf("\n查找表输入:\n");
    while(n--)
        scanf("%d",&ST.elem[ST.length++].key);
    printf("\n输入查找元素:");
    scanf("%d",&tkey);
    i=seq_search(ST,tkey);
    if(i==0)
        printf("\n未找到此元素\n");
    else
        printf("\n在查找表中下标为%d",ST.length+1-i);
    return 0;
}
折半查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;

typedef struct
{
    KeyType key;
}ElemType;
typedef struct
{
    ElemType elem[MAX_NUM];
    int length;
}SSTable;
int bin_search(SSTable ST,int key)
{
    int low,high,mid;
    low=0;
    high=ST.length;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(key==ST.elem[mid].key)
            return mid;
        else
        if(key<ST.elem[mid].key)
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;
}

int main()
{
    SSTable ST;
    KeyType tkey;
    int n,i;
    ST.length=0;
    printf("请输入查找表元素个数:");
    scanf("%d",&n);
    printf("\n查找表输入:\n");
    while(n--)
        scanf("%d",&ST.elem[ST.length++].key);
    printf("\n输入查找元素:");
    scanf("%d",&tkey);
    i=bin_search(ST,tkey);
    if(i==-1)
        printf("\n未找到此元素\n");
    else
        printf("\n在查找表中下标为%d",i+1);
    return 0;

}

2、哈希表的构造与查找

/* 采用开放地址法构造哈希表*/
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define P 13
#define OK 1
#define ERROR 0
#define DUPLICATE -1
#define TRUE 1
#define FALSE 0
typedef struct{  /*哈希表元素结构*/
    int key;  /*关键字值*/
    int flag; /*是否存放元素*/
}ElemType;

typedef struct {
    ElemType data[MAXSIZE];
    int count;      /*元素个数*/
    int sizeindex;  /*当前哈希表容量*/
}HashTable;

int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/
int d2[15]={0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/
void dataset(int ds[],int *len);
int InsertHash(HashTable *H,int e,int d[]);
int CreateHash(HashTable *H,int ds[],int len,int d[]);
int SearchHash(HashTable *H, int e,int d[]);
void menu();
/*输入查找表*/
void dataset(int ds[],int *len){
    int n,m;
    n=0;
    printf("\n查找表输入:");
    while(scanf("%d",&m)==1){  /*以输入一个非整数作为结束*/
        ds[n]=m;
        n++;
    }
    *len=n;
}
/*计算哈希地址,插入哈希表*/
int InsertHash(HashTable *H,int e,int d[]){
    int k,i=1;
    k=e%P;
    while(H->data[k].flag==TRUE||k<0){
        k=(e%P+d[i])%MAXSIZE;i++;
        if(i>=15)
            return ERROR;
    }
    H->data[k].key=e;
    H->data[k].flag=TRUE;
    H->count++;
    return OK;
}
/*构造哈希表*/
int CreateHash(HashTable *H,int ds[],int len,int d[]){
    int i;
    for(i=0;i<len;i++){
        if(SearchHash(H,ds[i],d)!=-1)
            return DUPLICATE;
        InsertHash(H,ds[i],d);
        if(H->count>=MAXSIZE)
            return ERROR;
    }
    return OK;
}
/*初始化哈希表*/
void InitHash(HashTable *H){
    int i;
    for(i=0;i<MAXSIZE;i++){
        H->data[i].key=0;
        H->data[i].flag=FALSE;
    }
}
/*在哈希表中查找*/
int SearchHash(HashTable *H, int e,int d[]){
    int k,i=1;
    k=e%P;
    while(H->data[k].key!=e){
        k=(e%P+d[i])%MAXSIZE;i++;
        if(i>=15)
            return -1;
    }
    return k;
}
/*演示菜单*/
void menu(){
    int choice;int *p;
    HashTable h;
    h.count=0;h.sizeindex=MAXSIZE;
    int a[MAXSIZE]={0};
    int i,n,e;
    dataset(a,&n);  /*建立查找表*/
    getchar();
    printf("\n");
    do{
        printf("\n----哈希查找演示----\n");
        printf("\n1.线性探测构造哈希表\n");
        printf("\n2.二分探测构造哈希表\n");
        printf("\n3.退出\n");
        printf("\n输入选择:");
        scanf("%d",&choice);
        if(choice==1)
            p=d1;
        else if(choice==2)
            p=d2;
        else
            return;
        InitHash(&h);   /*初始化哈希表*/
        if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/
            printf("\n哈希表构造失败!\n");
        else if(i==DUPLICATE)
            printf("\n哈希表具有重复关键字!\n");
        else{
            printf("\n哈希表:\n");
            for(i=0;i<h.sizeindex;i++)
                printf("%3d",h.data[i].key);
            printf("\n\n哈希查找\n输入要查找的key值:");
            getchar();
            scanf("%d",&e);
            if((i=SearchHash(&h,e,p))==-1)
                printf("\n%d未找到\n",e);
            else
                printf("\n%d在哈希表中下标为%d\n",e,i);
        }
        getchar();
    }while(1);
}

int main(){
    menu();
    return 0;
}

输入查找表为:19 14 23 1 68 20 84 27 55 11 10 79(注意以输入一个非整数结束)。
运行结果:
1)线性探测散列:
int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
哈希表形态:
实验五(1)

84在哈希表中的位置:8
2)二次探测散列:
int d2[15]={0,1,-1,22,-22,33,-33,44,-44,55,-55,66,-66,77,-77};
哈希表形态:
实验五(2)
84在哈希表中的位置:5

  • 11
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值