【小镇的技术天梯】从头开始写算法,C语言hash表

来源:互联网 发布:阿里云服务器如何备案 编辑:程序博客网 时间:2024/05/18 00:37

【有时候数据结构和算法这种东西就是在时间和空间之间权衡,比如说当你想要维护一个自平衡的二叉树的时候就需要一个额外的指针,当你想要排序的时候,需要一个或者多个额外的空间来存储临时产生的数据一样。】

hash表,有时候也被称为散列表,可以理解成数据和hash表中整理的数据的多对一的关系,散列的规则可以自己随意定制,但是最佳的散列规则应该保证每个散列出来的数据组中的个数都应该存有差不多数量的数据。比如说1到100的数据中,我们可以按照%10的规则来散列,这样就可以保持每个散列组都有差不多8-9个的数据。

这个相对来说还是挺好理解的,hash表也用在了很多的地方,配合别的数据结构可以很好很高效地控制数据。

【下面提供个代码,看看就好,难度很简单】编译命令  gcc -o xxx zhash.c

/* 散列表实例 *//* * author:镇天宇 * 规则:%10散列 */#include <stdio.h>#include <stdlib.h>#include <memory.h>typedef struct Z_HASH_NODE{intdata;struct Z_HASH_NODE* next;}hash_node;typedef struct Z_HASH_TABLE{hash_node* value[10];}hash_table;hash_table* create_hash_table(){hash_table* chashtbl = (hash_table *) malloc( sizeof(hash_table) );memset( chashtbl, 0, sizeof(hash_table) );return(chashtbl);}hash_node* find_data_in_hash_table( hash_table* chashtbl, int data ){hash_node* cnode;if ( chashtbl == NULL )return(NULL);if ( (cnode = chashtbl->value[data % 10]) == NULL )return(NULL);while ( cnode ){if ( data == cnode->data )return(cnode);cnode = cnode->next;}return(NULL);}int insert_data_into_hash( hash_table* chashtbl, int data ){hash_node* cnode;if ( chashtbl == NULL )return(0);if ( (cnode = chashtbl->value[data % 10]) == NULL ){cnode = (hash_node *) malloc( sizeof(hash_node) );memset( cnode, 0, sizeof(cnode) );cnode->data= data;chashtbl->value[data % 10]= cnode;return(1);}while ( cnode->next != NULL )cnode = cnode->next;cnode->next = (hash_node *) malloc( sizeof(hash_node) );memset( cnode->next, 0, sizeof(hash_node) );cnode->next->data = data;return(1);}int delete_data_from_hash(hash_table* chashtbl,int data){hash_node* cnode;hash_node* chead;if(chashtbl==NULL||chashtbl->value[data%10]==NULL)return 0;if((cnode=find_data_in_hash_table(chashtbl,data))==NULL)return 0;if(cnode==chashtbl->value[data%10]){chashtbl->value[data%10]=cnode->next;goto final;}chead=chashtbl->value[data%10];while(cnode!=chead->next)chead=chead->next;chead->next=cnode->next;final:free(cnode);return 1;}/* 打印hash */void print_hash_data( hash_table* chashtbl ){int i; hash_node* cnode;for ( i = 0; i < 10; i++ ){if ( (cnode = chashtbl->value[i]) == NULL )continue;while ( cnode->next != NULL ){printf( "%d ", cnode->data );cnode = cnode->next;}printf("\n");}}int main(){hash_table* htbl = create_hash_table();inti;for ( i = 0; i < 56; i++ ){insert_data_into_hash( htbl, i );}print_hash_data(htbl);}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 语言课申请不到怎么办 墨尔本大学均分不够怎么办 去澳洲旅游签证怎么办 换新护照澳大利亚签证怎么办 大学错过交学费日期怎么办 留学加拿大申请工签被拒怎么办 英国大学挂科怎么办 小孩子学不进去怎么办 大学生学不进去怎么办 高考没考上本科怎么办 想读书家里没钱怎么办 考上大学没钱上怎么办 儿子没考上大学怎么办 后悔没上大学怎么办 把学费花了怎么办 临床预科挂科怎么办 补录了预科怎么办 美国预科没过怎么办 出国留学报到证怎么办 本科绩点2.93怎么办 在美国被抢劫怎么办 去美国留学费用怎么办 被美国大学停学怎么办 雅思作文字数不够怎么办 英国选修课挂科怎么办 英国双申保证金怎么办 研究生挂科了怎么办 大一绩点没过2.0怎么办 美国留学生打工超时怎么办 ucl挂科了怎么办 硕士不会发论文怎么办 中兴今年招聘硕士生怎么办 rmit 语言班不过怎么办 非深圳户口怎么办护照 学位网学历认证怎么办 中国高中gpa低怎么办 函数毕业证丢了怎么办 加拿大大签过期怎么办 学位证封皮丢了怎么办 澳洲留学签证拒签怎么办 法国留学托业没过怎么办