哈希表链地址法c语言程序,哈希表链地址法示意与实现

哈希表链地址法表示与实现

以下是经过DEV-C++调试过的代码 还有框图:

110805373.png

头文件hashlist.h

#ifndef _H_HASHLIST_

#define _H_HASHLIST_

#define HASH_NUM_MAX 100

#define u32 unsigned int

//typedef struct _Node * pNode;

//typedef struct _Hash_Header * pHash_Header;

typedef struct _Node

{

u32 id;

u32 data;

struct _Node *next;

}Node,*pNode;

typedef struct _Hash_Header

{

struct _Node *next;

}Hash_Header,*pHash_Header;

typedef struct _Hash_List

{

struct _Hash_Header* list[100];

}Hash_List,*pHash_List;

pHash_List init_hash_list(void);

//pHash_Header init_hash_header(void);

//pNode init_node_header(void);

//void init_all_node_header(void);

pNode insert_node_to_hash(pHash_List plist,u32 id,u32 data);

int delete_node_to_hash(pHash_List plist,u32 id);

void print_hash(pHash_List plist);

int free_all_hash(pHash_List plist);

#endif

存放数据结构的文件hashlist.h

/********************************************

编写时间:2014.12.10

作者:XIAO_PING_PING

内容:哈希表(拉链式)

功能:学习写数据结构

********************************************/

#include

#include

#include

#include "hashlist.h"

//pHash_Header hash_list[HASH_NUM_MAX];

/*初始化一个哈希表*/

pHash_List init_hash_list(void)

{

u32 i;

pHash_List plist;

//pHash_Header phead;

plist = (Hash_List *)malloc(sizeof(Hash_List));

for( i = 0;i < 100;i++ )

{

plist->list[i] = (Hash_Header *)malloc(sizeof(Hash_Header));

plist->list[i]->next = NULL;

}

return plist;

}

#if 0

/*初始化一个哈希链表头*/

pHash_Header init_hash_header(void)

{

Hash_Header *phead;

phead = (Hash_Header *)malloc(sizeof(Hash_Header));

phead->next = NULL;

return phead;

}

/*初始化一个链表节点头*/

pNode init_node_header(void)

{

Node *phead;

phead = (Node *)malloc(sizeof(Node));

phead->next = NULL;

return phead;

}

/*初始化所有节点链表头*/

void init_all_node_header(void)

{

u32 i;

Hash_Header *plist;

for( i = 0;i < HASH_NUM_MAX;i++)

{

hash_list[i] = init_hash_header();

}

}

#endif

/*根据id插入一个节点数据*/

pNode insert_node_to_hash(pHash_List plist,u32 id,u32 data)

{

Node *ptail,*pre,*p;

u32 temp = id % 100;

ptail = (Node *)malloc(sizeof(Node));

ptail->next = NULL;

ptail->data = data;

ptail->id = id;

if( NULL == plist->list[temp]->next )

{

plist->list[temp]->next = ptail;

printf("链表插入点id=%d\n",ptail->id);

return ptail;

}

pre = plist->list[temp]->next;

while( pre )

{

p = pre;

pre = pre->next;

}

p->next = ptail;

printf("链表插入点id=%d\n",ptail->id);

return ptail;

}

/*根据id删除一个节点数据*/

int delete_node_to_hash(pHash_List plist,u32 id)

{

u32 temp = id % 100;

Node *psea;

psea = plist->list[temp]->next;

if( NULL == psea )

{

printf("搜索的链表内容为空\n");

return -1;

}

#if 1

if(id == psea->id )

{

plist->list[temp]->next = psea->next;

free(psea);

//printf("该链表唯一元素被删除\n");

printf("正确删除数据\n");

return 0;

}

#endif

if( NULL == psea->next )

{

printf("搜索的id不存在\n");

return -2;

}

while( id != psea->next->id )

{

psea = psea->next;

if( NULL == psea->next )

{

printf("搜索的id不存在\n");

return -2;

}

}

psea->next = psea->next->next;

free(psea->next);

printf("正确删除数据\n");

return 0;

}

/*遍历打印哈希表信息*/

void print_hash(pHash_List plist)

{

u32 i;

pNode p;

printf("打印整个哈希表信息:\n");

for( i = 0;i < 100;i++)

{

p = plist->list[i]->next;

if(NULL != p)

{

printf("第%d排: \n",i);

}

while( NULL != p )

{

printf("节点id=%d,节点信息data=%d\n",p->id,p->data);

p = p->next;

}

}

}

/*释放整个哈希表数据*/

int free_all_hash(pHash_List plist)

{

u32 i;

pNode p,pn;

printf("\n释放哈希表内存空间:\n");

for( i = 0;i < 100;i++)

{

p = plist->list[i]->next;;

pn = p;

if(NULL == p)

{

continue;

}

printf("释放第%d排: \n",i);

while( NULL != pn )

{

p = pn;

pn = p->next;

printf("节点id=%d,节点信息data=%d\n",p->id,p->data);

free(p);

//p = p->next;

}

free(plist->list[i]);

}

}

以及测试文件main.c/********************************************/

#include

#include

#include

#include

#include "hashlist.h"

int main()

{

pNode p;

pHash_List plist;

plist = init_hash_list();

insert_node_to_hash(plist,301,138);

insert_node_to_hash(plist,32,1334);

insert_node_to_hash(plist,201,137);

print_hash(plist);

delete_node_to_hash(plist,32);

//delete_node_to_hash(plist,201);

//delete_node_to_hash(plist,301);

print_hash(plist);

free_all_hash(plist);

getch();

}

最后得出测试结果

110805374.png


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部