数据结构学习——散列表ADT(程序化)

不知道大家在刚开始看《数据结构与算法分析——C语言描述》散列一章的时候,能不能理解书上的内容,小ZZ看的时候就没怎么看明白。于是就去问度娘,度娘给了我这样一篇文章。里面介绍了散列的基本定义以及常用的实现方法,比较通俗易懂(可能是智商有点拙计)。

http://blog.csdn.net/u010275850/article/details/44963701

先看完了这篇博文,然后再看书上的结论,顿时恍然大悟有木有啊。

参考了书上的程序思路,下面将散列表的常用操作程序化如下:

/*分离链接法构造散列*/
#include<stdio.h>
#include<stdlib.h>

#define TbSize 10

typedef struct ListNode
{
    int data;
    struct ListNode *next;
}List,*list;

typedef struct HashNode
{
    int TableSize;
    list *TheLists;
}Hash,*HT;

HT InitHT(int tablesize);//初始化例程
list find(int data,HT H);//查找操作
int hash(int data,int tablesize);//哈希函数
void insert(int data,HT H);//插入操作
void Delete(int data,HT H);//删除操作
void PrintHt(HT H);//打印整个哈希表
void PrintList(list L);//打印链表

int main()
{
    int Data[10]={0,1,4,9,16,25,36,49,64,81};
    int i=0;
    HT h;
    h=InitHT(10);
    if(h==NULL)
        printf("Out of space!\n");
    for(i=0;i<10;i++)
    {
        insert(Data[i],h);
    }
    PrintHt(h);

    insert(7,h);
    insert(59,h);
    printf("after insert 7 and 59:\n");
    PrintHt(h);
    Delete(36,h);
    printf("after delete 36:\n");
    PrintHt(h);

    find(7,h);
    find(49,h);
    find(36,h);
    return 0;
}

HT InitHT(int tablesize)
{
    HT H;
    int i;
    H=malloc(sizeof(struct HashNode));
    if(H==NULL)
        printf("Out of space!\n");

    H->TableSize=TbSize;
    H->TheLists=malloc(sizeof(list)*H->TableSize);
    if(H->TheLists==NULL)
        printf("Out of space!\n");
    for(i=0;i<H->TableSize;i++)
    {
        H->TheLists[i]=malloc(sizeof(List));
        if(H->TheLists[i]==NULL)
             printf("Out of space!\n");
        else H->TheLists[i]->next=NULL;
    }
    return H;
}

list find(int data,HT H)
{
    list tmp;
    tmp=H->TheLists[hash(data,H->TableSize)];//得到的只是一个表头指针
    tmp=tmp->next;
    while( (tmp!=NULL) && (data!=tmp->data) )
        tmp=tmp->next;
    if(tmp==NULL)
        printf("%d has not find!\n",data);
    else  printf("%d has find!\n",data);
    return tmp;
}

int hash(int data,int tablesize)
{
    return data%tablesize;
}

void insert(int data,HT H)
{
    list p,newcell,L;
    p=find(data,H);
    if(p==NULL)//说明原表中没有
    {
        newcell=malloc(sizeof(List));
        if(newcell==NULL)
            printf("Out of space!\n");
        else
        {
            L=H->TheLists[hash(data,H->TableSize)];
            newcell->data=data;
            newcell->next=L->next;
            L->next=newcell;//每次插入到最前端
        }
    }
}

void Delete(int data,HT H)
{
    list pre=NULL,cur;//前驱元 当前元

    cur=H->TheLists[hash(data,H->TableSize)];
    pre=cur;
    cur=cur->next;
    while((cur!=NULL)&&(cur->data!=data))
    {
       pre=cur;
       cur=cur->next;
    }
    if(cur==NULL)
        printf("%d hasn't find\n",data);
    else
    {
       if(pre!=NULL)
       {
           pre->next=cur->next;
           free(cur);
       }
    }
}

void PrintHt(HT H)
{
    int i=0;
    for(i=0;i<H->TableSize;i++)
    {
        PrintList(H->TheLists[i]);
        printf("\n");
    }
}

void PrintList(list L)
{
    if(L==NULL)
        printf("list is empty!");
    while(L)
    {
        printf("%d\t",L->data);
        L=L->next;
    }
}
时间: 2024-10-14 00:38:06

数据结构学习——散列表ADT(程序化)的相关文章

数据结构之散列表查找

数据结构之--散列表查找 定义:通过某个函数f,使得 ?    ?    ?存储位置=f(关键字) ?    ?    ?这样我们可以通过查找关键字不需要比较久可以获得需要记录的存储位置.这就是一种新的存储技术--散列技术. ?    ?    ?散列技术在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上. ?    ? 

数据结构之散列表总结

散列表的概念 注意:    ①由同一个散列函数.不同的解决冲突方法构造的散列表,其平均查找长度是不相同的.     ②散列表的平均查找长度不是结点个数n的函数,而是装填因子α(填入表中的记录个数/散列表的槽数    n/m).因此在设计散列表时可选择α以控制散列表的平均查找长度.(平均查找长度=总查找(插入)/记录个数)          通过链接法解决冲突:成功查找的期望查找长度O(1+a), 不成功查找的平均查找长度也为O(1+a).         开放寻址解决冲突:引入探查序列,对于a<

数据结构_散列表

散列表的查找技术 我们学过的查找技术都是通过一系列的给定值与关键码的比較,查找效率依赖于查找过程中进行的给定值与关键码的比較次数. 而散列表的查找不用比較.通过关键码直接确定存储位置. 在存储位置和关键码之间建立一个确定的相应关系. 散列表的基本思想:在记录的存储地址和他的关键码之间建立一个确定的相应关系. 这样.不经过比較,一次读取就能得到所查元素的查找方法. 散列表:採用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表. 散列函数:将关键码映射为散列表中适当存储位置的函

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h

散列ADT

分离链表法解决冲突的散列表ADT实现 数据结构定义如下: 1 struct ListNode; 2 typedef struct ListNode *Position; 3 struct HashTbl; 4 typedef struct HashTbl *HashTable; 5 6 HashTable InitializeTable(int TableSize); 7 void DestroyTable(HashTable H); 8 Position Find(ElementType Ke

《算法导论》— Chapter 11 散列表

1 序 在很多应用中,都要用到一种动态集合结构,它仅支持INSERT.SEARCH以及DELETE三种字典操作.例如计算机程序设计语言的编译程序需要维护一个符号表,其中元素的关键字为任意字符串,与语言中的标识符相对应.实现字典的一种有效数据结构为散列表. 散列表是普通数组的推广,因为可以对数组进行直接寻址,故可以在O(1)的时间内访问数组的任意元素.对于散列表,最坏情况下查找一个元素的时间与在链表中查找的时间相同,为O(n),但是在实践中,散列表的效率通常是很高的,在一些合理的假设下,散列表中查

散列表(数据结构学习笔记)

散列 散列表的一般实现叫散列.是一种以常数平均时间执行插入.删除.查找的技术.理想的散列表结构是一个包含关键字具有固定大小的数组.典型情况是,一个关键字就是一个带有相关值的字符串.把表大小记MaxSize,通常使表在0-MaxSize之间变化.每个关键字都被映射到0-MaxSize之间的某个单元中.这个映射关系就是散列函数.理想情况函数保证任何关键字都映射到不同单元里,实践是不可能的.因数组有限大小,而关键字可无限多.因此要找德散列函数尽可能的使关键字均匀的分布在单元中.如图 git在0号单元,

Python数据结构——散列表

散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的推广.如果空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,就可以运用直接寻址技术. 当实际存储的关键字比可能的关键字总数较小时,采用散列表就比较直接寻址更为有效.在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标,这种 关键字与下标之间的映射就叫做散列函数. 1.散列函数

JavaScript数据结构——实现简单的散列表

散列算法的作用是尽可能快地在数据结构中找到一个值.如果数据很大,但是有需要遍历整个数据结构来查找到该值,花费的时间就太多了.所以散列表在查找方面中比较优势:使用散列函数,就知道具体位置,能够快速检索.散列函数的作用:给定一个key值,返回key值在表中的地址. 1 function HashTable(){ 2 //初始化散列表 3 var table=[]; 4 //散列函数(私有方法) 5 var loseloseHashCode = function(key){ 6 var hash=0;