对The C programming language一书第6.6节代码的理解
代码如下(基本与书中一致)
1 #include <stdio.h>
2 #include <string.h>
3 #include <ctype.h>
4 #include <stdlib.h>
5
6 #define HASHSIZE 101
7
8 struct nlist{
9 struct nlist *next;
10 char *name;
11 char *defn;
12 };
13
14 static struct nlist *hashtab[HASHSIZE];
15 struct nlist *lookup(char *s);
16 struct nlist *install(char *name,char *defn);
17
18 int main(int argc, const char * argv[]) {
19 struct nlist list[] = {
20 {NULL,"abc","123"},
21 {NULL,"bcd","234"},
22 {NULL,"cde","345"},
23 {NULL,"def","567"},
24 };
25 int count = sizeof(list)/sizeof(struct nlist);
26 for (int i = 0; i< count; i++) {
27 struct nlist * p = install(list[i].name, list[i].defn);
28 if (p) {
29 printf("将%s添加到了哈希表里,值为%s\n",p->name,p->defn);
30 }
31 }
32 struct nlist *p = lookup("bcd");
33 if (p) {
34 printf("找到key为bcd时对应的值,值为%s\n",p->defn);
35 }else{
36 printf("没有找到key为bcd时对应的值\n");
37 }
38 return 0;
39 }
40
41 unsigned hash(char *s)
42 {
43 unsigned hashval;
44 for (hashval = 0; *s!='\0'; s++) {
45 hashval = *s+31*hashval;
46 }
47 return hashval%HASHSIZE;
48 }
49
50 struct nlist *lookup(char *s)
51 {
52 struct nlist *np;
53 for (np = hashtab[hash(s)]; np!=NULL; np = np->next) {
54 if (strcmp(s, np->name) == 0) {
55 return np;
56 }
57 }
58 return NULL;
59 }
60
61 char *strsave(char *s)
62 {
63 char *p;
64 p = (char*)malloc(strlen(s)+1);
65 if (p!=NULL) {
66 strcpy(p, s);
67 }
68 return p;
69 }
70
71 struct nlist *install(char *name,char *defn)
72 {
73 struct nlist *np;
74 unsigned hashval;
75 if ((np=lookup(name))==NULL) {
76 np = (struct nlist*)malloc(sizeof(struct nlist));
77 if (np == NULL||(np->name = strsave(name))==NULL) {
78 return NULL;
79 }
80 hashval = hash(name);
81 np->next = hashtab[hashval];
82 hashtab[hashval] = np;
83 }else{
84 free((void*)np->defn);
85 }
86 if ((np->defn = strsave(defn))==NULL) {
87 return NULL;
88 }
89 return np;
90 }
先看下输出:
这一节就是讲了表查找,别的没啥想说的,主要看的时候卡在了install方法的这两句代码:
np->next = hashtab[hashval];
hashtab[hashval] = np;
其实这么做的原因是链表是从后向前添加的,当第一次执行install方法时,hashtab[hashval]这个值是NULL,也就是将np->next的值设为了NULL,然后hashtab[hashval] = np 这样,
当第二次执行到np->next = hashtab[hashval]时就是将第一次执行的那个节点添加到了这个节点的next上,换句话说,第一次执行install方法添加的节点是链表的最后一个节点,然后依次向前添加。
对The C programming language一书第6.6节代码的理解的更多相关文章
- The Swift Programming Language 中文翻译版(个人翻新随时跟新)
The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...
- [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01
注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...
- the C programming language 阅读笔记1
读了一遍著名的<the C programming language>,果然如听说的一样,讲解基础透彻,案例简单典型,确实自己C语言还有很多细节点不是很清楚. 总结一下阅读的收获(部分原书 ...
- 不忘初心 --- 重读<<The C Programming Language>>
这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...
- The D Programming Language 书评
此书的作者 Andrei Alexandrescu 作为前 C++ 社区的一朵奇葩,因为实在是不满 C++ 标准委员会的官僚作风,跳槽到了 D 社区,成为了 D 发明人 Walt Brightman ...
- 《The C Programming Language》读书笔记(一)
1. 对这本书的印象 2011年进入大学本科,C语言入门书籍如果我没记错的话应该是谭浩强的<C程序设计>,而用现在的眼光来看,这本书只能算是一本可用的教材,并不能说是一本好书.在自学操作系 ...
- 转:从《The C Programming Language》中学到的那些编程风格和设计思想
这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html 读书不是目的,关键在于思考. 很早就在水木上看到有人推荐& ...
- iOS Swift-元组tuples(The Swift Programming Language)
iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...
- iOS Swift-控制流(The Swift Programming Language)
iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...
随机推荐
- STM32初学Keil4编译时出现 Error:Failed to execute 'BIN40/Armcc'
一种是在系统开始--运行里输入cmd,查看armcc状态.详情见推文: http://blog.csdn.net/hicui/article/details/7350805(笔记记录,请勿见怪) 都没 ...
- Tornado-StaticFileHandler参考
StaticFileHandler ====== tornado.web.StaticFileHandler 源代码中的解释 class StaticFileHandler(RequestHandle ...
- MySql学习笔记(四)
MYSQL如何查看系统帮助: 1.查看官方API文档: http://dev.mysql.com/doc/ 2.通过Mysql中的help命令 比如:help create database MYSQ ...
- WebApi Ajax 跨域请求解决方法(CORS实现)
概述 ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别 ...
- 今天聊一聊nuxt.js(上)
背景 近期在做内部系统的重构,从一线业务彻底的重构,经过充分的考虑我们准备把这个项目打造成前台业务的试验站,比如ssr和一些其他的前沿技术的探索,积累充分的经验后待合适的契机应用到C端的项目中. 既然 ...
- 三菱Q系列PLC基本指令讲解
1.数据传送指令MOV和MOVP,格式为 MOV SRC1 DES1 表示条件接通,将SRC1的值传送到DES1寄存器中,带P的表示只在条件接通的上升沿指令执行一个扫描周期,不带P ...
- pip&easy_install使用
pip install ... easy_install ... ******************************************************************* ...
- Alpha版与Beta版
简单说说这两个词的意思,以后会稍加更多的补充. Alpha版意在对少数主要客户和市场进行数量有限的分发,用于演示目的的早期构造.其无意在实际环境中使用.使用Alpha版的所有人员必须了解确切内容和质量 ...
- 位图索引(Bitmap Index)的故事
您如果熟悉Oracle数据库,我想您对Thomas Kyte的大名一定不会陌生.Tomas主持的asktom.oracle.com网站享誉Oracle界数十年,绝非幸致.最近在图书馆借到这位Oracl ...
- 三种Join方法
NESTED LOOP JOIN (NLJOIN) 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个 ...