zoukankan      html  css  js  c++  java
  • 散列查找(分离链接法)

    将相应位置上冲突的所有关键词存放在同一链表中

     1 #define KEYLENGTH 15
     2 typedef char ElementType[KEYLENGTH+1];
     3 typedef int Index;
     4 typedef struct LNode *ptrToLNode;
     5 struct LNode
     6 { 
     7     ElementType Data;
     8     ptrToLNode Next;
     9 };
    10 typedef ptrToLNode Position;
    11 typedef ptrToLNode list;
    12 typedef struct Hashnode *HashTable;
    13 
    14 struct  Hashnode{
    15     int TableSize;
    16     list Heads;
    17 };
    18 HashTable CreateHash(int TableSize){
    19     int i;
    20     HashTable h;
    21     h=(HashTable)malloc(sizeof(struct Hashnode));//申请哈希表空间
    22     h->TableSize=TableSize;//哈希表空间大小
    23     h->Heads=(list)malloc(TableSize* sizeof(struct LNode));//哈希表数组
    24     for(i=0;i<TableSize;i++)//哈希表数组初始化
    25     {
    26         h->Heads[i].Data[0]='';   
    27         h->Heads[i].Next=NULL;
    28     }
    29     return h;
    30 }
    31 Position Find(HashTable h,ElementType key)
    32 {
    33     Position p;
    34     Index Pos;//哈希表数组下标
    35     //Pos=Hash_char(key ,h->TableSize);//哈希函数
    36     Pos=3;
    37     p=h->Heads[Pos].Next;//从链表的第一个节点开始
    38     while( p && strcmp(p->Data,key))//如果p不是空且key与data不相等
    39         p=p->Next;//接着寻找下一个节点
    40     return p;//没找到,最后返回空节点。找到了返回P
    41 }
    42 bool Insert(HashTable h ,ElementType key )
    43 {
    44     Position p,newcell;
    45     Index Pos;//数组下标
    46 
    47     p=Find(h,key);//利用find函数看看key是否存在于原来的散列表中
    48     if(!p){//如果P是空,表明key 不在散列表中,所以可以插入
    49         newcell=(Position)malloc(sizeof(Position));//申请空间
    50         strcpy(newcell->Data,key );//讲key拷贝到临时链表里
    51         //Pos=Hash_char(key,h->TableSize);//算出数组下标
    52         Pos=3;
    53         newcell->Next=h->Heads[Pos].Next;//将newcell插入到链表的头部
    54         h->Heads[Pos].Next=newcell;
    55         return true;
    56     }
    57     else{
    58         printf("error");
    59         return false;
    60     }
    61 
    62 }
    63 void Destory(HashTable h )
    64 {
    65     int i;
    66     Position p,temp;
    67     for (i = 0; i < h->TableSize; i++)
    68     {
    69         p=h->Heads[i].Next;//p指向数组所对应的链表
    70             while(p){             //p不是空就循环
    71             temp=p->Next;       //
    72             free(p);//从头部开始一个个free
    73             p=temp;
    74         }
    75     }
    76     free(h->Heads);
    77     free(h);
    78 
    79 }
    80 Index Hash_char(const char *key ,int TableSize)
    81 {
    82   unsigned int h =0;
    83   while(*key !='')
    84       h=(h<<5)+*key++;
    85   return h%TableSize;
    86 }

    超级错误!!!!!!!!newcell=(Position)malloc(sizeof(Position));//申请空间

    正确 newcell=(Position)malloc(sizeof(struct LNode));//申请空间

  • 相关阅读:
    作用域和内存问题
    Javascript事件
    JavaScript学习总结(三)
    Javascript学习总结(二)
    JavaScript学习总结(一)
    vue开发搭建 1、 npm安装+vue脚手架安装 2、cnpm安装
    20181008
    RabbitMQ在.NetCore中的基础应用
    微软CRM 基于 ADFS自定义多重身份验证
    如何在ASP.NET Core中上传超大文件
  • 原文地址:https://www.cnblogs.com/zle1992/p/5882280.html
Copyright © 2011-2022 走看看