数据结构之哈希表

来源:互联网 发布:软件类企业安全教育 编辑:程序博客网 时间:2024/06/18 07:00
#include <stdio.h>#include <stdlib.h>#include <memory.h>#define N 10   //hash表内存大小#define FALSE   0#define TRUE    1typedef struct _Node{int nData ; struct _Node * next ;}Node ;typedef struct _Hash_Table{Node * value[N] ;   //指针数组}Hash_table;//创建hash表Hash_table *create_hash_table(){    Hash_table * pHash = (Hash_table*)malloc(sizeof(Hash_table)) ;memset(pHash,0,sizeof(Hash_table)) ;return pHash ;} //在Hash表中寻找数据Node* find_data(Hash_table* pHash ,int nData){Node* pNode ;if(NULL == pHash)   //若哈希表为空{return NULL ;}if(NULL == (pNode = pHash->value[nData%N]))   //若哈希表中数组没有该成员,进入if条件句{return NULL ;}while(pNode)  //当该结构体指针不为空时{if(nData == pNode->nData ){return pNode ;   //返回找到数据的结构体的指针}pNode = pNode->next ;}return NULL ;}//在Hash表中添加数据bool insert_data(Hash_table * pHash ,int nData){    Node * pNode ;if(NULL == pHash)   //判断传入指针是否有效 {return FALSE ;}if(NULL ==pHash->value[nData%N])  //判断指针数组中有没有该成员,若没有则进入if条件句中{pNode = (Node*)malloc(sizeof(Node)) ;memset(pNode,0,sizeof(Node)) ;     //清空pNode指向的结构体pNode->nData = nData ;pHash->value[nData%N] = pNode ;return TRUE;}if(NULL != find_data(pHash,nData))  //查找到该数据{return FALSE ;}pNode = pHash->value[nData%N] ;   //指向该元素所在的链表while(NULL != pNode->next){pNode = pNode->next ;}pNode->next = (Node*)malloc(sizeof(Node)) ;memset(pNode->next,0,sizeof(Node)) ;pNode->next->nData = nData ;return TRUE ;} //在Hash表中删除数据bool delete_data(Hash_table* pHash , int nData){Node* pHead ;Node* pNode ;if(NULL == pHash || NULL == pHash->value[nData%N]){return FALSE ;}if(NULL == (pNode = find_data(pHash,nData)))   //并未找到该数据{return FALSE ;}if(pNode == pHash->value[nData%N])  //若找到该数据结点并且是数组成员首个结构体{pHash->value[nData%N] = pNode->next ;free(pNode) ;return TRUE ;}pHead = pHash->value[nData%N] ;while(pNode != pHead->next)    // 遍历找出所要删除的数据位置{pHead = pHead->next ;}pHead->next = pNode->next ;free(pNode) ;return TRUE ;}//打印哈希表void show_hash_table(Hash_table* pHash)  {      Node* pNode = NULL;      for(int i = 0; i<N; i++)     // 从第一个哈希表元素开始打印,直到最后一个元素      {            printf("value[%d]:",i) ;        for(pNode=pHash->value[i] ; NULL != pNode; pNode=pNode->next)   // 打印下标为i的哈希表元素及该位置所链接的节点          {              printf("%d    ",pNode->nData) ;        }    printf("\n") ;  }}  int main(){Hash_table* my_Hash_table ;my_Hash_table = create_hash_table() ;    //创建哈希表char a[N] ={23,12,67,42,78,91,56,8,32,28}; //添加数据bool blTemp ;for(int i = 0;i<N;i++){blTemp = insert_data(my_Hash_table,a[i]) ;if(blTemp == FALSE){printf("对不起 %d 添加失败\n",a[i]) ;}}//打印哈希表show_hash_table(my_Hash_table) ;printf("\n") ; ////查找数据//Node* pNode ;//pNode = find_data(my_Hash_table,81) ;//if(pNode == NULL)//{//printf("未找到该数据!\n");//}//else//{//printf("成功找到:%d\n",pNode->nData) ;//}//删除数据blTemp = delete_data(my_Hash_table,12);if(blTemp == FALSE){printf("对不起 删除失败!\n") ;}else{printf("成功删除!\n") ;} //打印哈希表show_hash_table(my_Hash_table) ;return 0 ;}

原创粉丝点击