数据结构与算法分析-开放定址散列表的实现

简介: #include #include"fatal.h" typedef char* ElementType; typedef unsigned int Index; typedef Index Position; struct HashTbl; typedef struct Has...
#include<stdio.h>
#include"fatal.h"
typedef char* ElementType;

typedef unsigned int Index;
typedef Index Position;
struct HashTbl;
typedef struct HashTbl *HashTable;

HashTable InitializeTable(int TableSize);
void DestroyTable(HashTable H);
Position Find(ElementType key,HashTable H);
void Insert(ElementType key,HashTable H);
ElementType Retrieve(Position P,HashTable H);
HashTable Rehash(HashTable H);

enum KindOfEntry {Legitimate,Empty,Deleted};

struct HashEntry
{
    ElementType Element;
    enum KindOfEntry Info;
};

typedef struct HashEntry Cell;

struct HashTbl
{
    int TableSize;
    Cell *TheCells;
};

int MinTableSize=23;

HashTable InitializeTable(int TableSize)
{
    HashTable H;
    int i;
    if(TableSize<MinTableSize)
    {
        Error("Table size too small!");
        return NULL;
    }
    H=malloc(sizeof(struct HashTbl));
    if(H==NULL)
        FatalError("Out of space !!!");
    H->TableSize=TableSize;
    H->TheCells=malloc(sizeof(Cell)*H->TableSize);
    if(H->TheCells==NULL)
        FatalError("Out of space !!");
    for(i=0;i<H->TableSize;i++)
        H->TheCells[i].Info=Empty;
    return H;
}

int Hash(ElementType key,int TableSize)
{
    unsigned int HashVal=0;
    while(*key!='\0')
    {
        HashVal=(HashVal<<5)+*key++;
    }
    HashVal=HashVal%TableSize;
    return HashVal;
}

Position Find(ElementType key,HashTable H)
{
    Position CurrentPos;
    int CollisionNum;
    CollisionNum=0;
    CurrentPos=Hash(key,H->TableSize);
    while(H->TheCells[CurrentPos].Info!=Empty&&H->TheCells[CurrentPos].Element!=key)
    {
        CurrentPos+=2*++CollisionNum-1;
        if(CurrentPos>=H->TableSize)
            CurrentPos-=H->TableSize;
    }
    return CurrentPos;
}

void Insert(ElementType key,HashTable H)
{
    Position Pos;
    Pos=Find(key,H);
    if(H->TheCells[Pos].Info!=Legitimate)
    {
        H->TheCells[Pos].Info=Legitimate;
        H->TheCells[Pos].Element=key;
    }
}

ElementType Retrieve(Position P,HashTable H)
{
    if(H->TheCells[P].Info!=Empty)
        return H->TheCells[P].Element;
    else
        return NULL;
}

HashTable rehash(HashTable H)
{
    int i,OldSize;
    Cell* OldCells;
    OldCells=H->TheCells;
    OldSize=H->TableSize;

    H=InitializeTable(2*OldSize);
    for(i=0;i<OldSize;i++)
        if(OldCells[i].Info==Legitimate)
            Insert(OldCells[i].Element,H);
    free(OldCells);
    return H;
}

 

相关文章
|
存储 缓存 数据库
Python高级数据结构——散列表(Hash Table)
Python高级数据结构——散列表(Hash Table)
128 1
Python高级数据结构——散列表(Hash Table)
|
1月前
|
存储 算法 Java
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
39 1
散列表的数据结构以及对象在JVM堆中的存储过程
|
6月前
|
算法 Java Serverless
数据结构===散列表
数据结构===散列表
|
6月前
|
算法 调度 Python
【调度算法】开放车间调度问题遗传算法
【调度算法】开放车间调度问题遗传算法
64 1
|
6月前
|
存储 算法 NoSQL
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
226 1
|
6月前
|
存储 算法
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)
135 0
|
7月前
|
存储 缓存 索引
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)
105 0
|
7月前
|
自然语言处理 数据安全/隐私保护
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
【数据结构入门精讲 | 第十五篇】散列表知识点及考研408、企业面试练习(2)
56 0
|
7月前
|
存储 算法 索引
Python 数据结构和算法:什么是散列表(Hash Table)?在 Python 中如何实现?
Python 数据结构和算法:什么是散列表(Hash Table)?在 Python 中如何实现?
78 0
|
7月前
|
人工智能 算法 C语言
【408数据结构与算法】—线性表的定义和分析(二)
【408数据结构与算法】—线性表的定义和分析(二)
下一篇
DataWorks