#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define N 10 //hash表内存大小
#define FALSE 0
#define TRUE 1
typedef 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 ;
}
07-18
07-18
07-18
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交