数据结构之哈希表 1.哈希算法将数据通过哈希算法映射成一个键值存取都在同一位置实现数据的高效存储和查找目标将时间复杂度尽可能降低至O(1)2.哈希碰撞多个数据通过哈希算法得到的键值相同数据存储时会存储在相同的地址称为哈希碰撞3.哈希表的相关操作3.1定义数据类型typedef struct infor { char name[32]; char tel[16]; }DataType_t;3.2定义结点类型typedef struct node { DataType_t data; struct node* pnext; }HSNode_t;3.3定义哈希算法int hash_function(char key) { if(keyakeyz) { return key-a; } else if(keyAkeyZ) { return key-A; } else { return HASH_MAX_SIZE-1; } }3.4向哈希表中插入数据int insert_hash_table(HSNode_t **hash_table,DataType_t data) { HSNode_t* pnodemalloc(sizeof(HSNode_t)); if(NULL pnode) { printf(malloc error\n); return -1; } pnode-datadata; pnode-pnextNULL; int addrhash_function(data.name[0]); pnode-pnexthash_table[addr]; hash_table[addr]pnode; return 0; }3.5遍历哈希表int show_hash_table(HSNode_t **hash_table) { HSNode_t* ptmpNULL; int i0; for(i0;iHASH_MAX_SIZE;i) { printf(%d:,i); ptmphash_table[i]; while(ptmp!NULL) { printf(%s %s ,ptmp-data.name,ptmp-data.tel); ptmpptmp-pnext; } printf(\n); } return 0; }3.6查找哈希表中某个元素HSNode_t *find_hash_table(HSNode_t **hash_table,char* name) { int addrhash_function(name[0]); HSNode_t* ptmphash_table[addr]; while(ptmp!NULL) { if(0 strcmp(ptmp-data.name,name)) { return ptmp; } ptmpptmp-pnext; } return NULL; }3.7销毁哈希表void destroy_hash_table(HSNode_t **hash_table) { for(int i0;iHASH_MAX_SIZE;i) { HSNode_t* ptmphash_table[i]; while(hash_table[i]!NULL) { hash_table[i]ptmp-pnext; free(ptmp); ptmphash_table[i]; } } }4.工程管理工具Makefile4.1MakefileMakefile用来管理代码的编译Makefile可以根据文件中的规则来选择符合条件的代码完成编译用于指导make工具编译和链接程序Makefile能够根据依赖关系和文件修改的时间戳来判断哪些代码需要编译哪些代码可以复用之前的编译结果提高编译效率避免重复编译4.2使用步骤4.2.1基本结构生成的文件:依赖的所有文件 生成命令方式a.out:main.c gcc​​生成的文件​​通常生成为 a.out​​依赖的所有文件生成目标所需要的文件通常是源代码文件以及其它目标文件生成命令方式​​上一步完成回车后使用Tab键开头编写命令用来生成目标4.2.2使用原理make​​工具会读取 Makefile从默认的第一个目标生成可执行程序开始对于每个目标make 会检查依赖文件是否存在以及依赖文件是否比目标文件修改时间更晚依赖存在或时间戳比目标文件新执行命令时间戳没有变化目标文件被认为是最新的不会再次编译4.2.3使用规则在工程目录下新建名为Makefile或makefile的文件Linux区分大小写在Makefile文件中根据基本结构定义生成目标文件及链接在终端使用make命令构建项目