不知道大家在刚开始看《数据结构与算法分析——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