代码如下(基本与书中一致)

 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节代码的理解的更多相关文章

  1. The Swift Programming Language 中文翻译版(个人翻新随时跟新)

    The Swift Programming Language --lkvt 本人在2014年6月3日(北京时间)凌晨起来通过网络观看2014年WWDC 苹果公司的发布会有iOS8以及OS X 10.1 ...

  2. [iOS翻译]《The Swift Programming Language》系列:Welcome to Swift-01

    注:CocoaChina翻译小组已着手此书及相关资料的翻译,楼主也加入了,多人协作后的完整译本将很快让大家看到. 翻译群:291864979,想加入的同学请进此群哦.(本系列不再更新,但协作翻译的进度 ...

  3. the C programming language 阅读笔记1

    读了一遍著名的<the C programming language>,果然如听说的一样,讲解基础透彻,案例简单典型,确实自己C语言还有很多细节点不是很清楚. 总结一下阅读的收获(部分原书 ...

  4. 不忘初心 --- 重读<<The C Programming Language>>

    这篇文章应该发布在好几年前,2011年计算机界大师Dennis Ritchie仙逝,那时对大师的映象还停留在大一刚学编程时:Unix的合作开发者,C语言的发明人.通过网上的纪念文章<<Un ...

  5. The D Programming Language 书评

    此书的作者 Andrei Alexandrescu 作为前 C++ 社区的一朵奇葩,因为实在是不满 C++ 标准委员会的官僚作风,跳槽到了 D 社区,成为了 D 发明人 Walt Brightman ...

  6. 《The C Programming Language》读书笔记(一)

    1. 对这本书的印象 2011年进入大学本科,C语言入门书籍如果我没记错的话应该是谭浩强的<C程序设计>,而用现在的眼光来看,这本书只能算是一本可用的教材,并不能说是一本好书.在自学操作系 ...

  7. 转:从《The C Programming Language》中学到的那些编程风格和设计思想

    这儿有一篇写的很好的读后感:http://www.cnblogs.com/xkfz007/articles/2566424.html   读书不是目的,关键在于思考.   很早就在水木上看到有人推荐& ...

  8. iOS Swift-元组tuples(The Swift Programming Language)

    iOS Swift-元组tuples(The Swift Programming Language) 什么是元组? 元组(tuples)是把多个值组合成一个复合值,元组内的值可以使任意类型,并不要求是 ...

  9. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

随机推荐

  1. 【jquery】ajax请求

    1. defferred对象 实现链式回调函数编程. http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_d ...

  2. 【PHP】 安装参数

    1. 配置参数 './configure' '--prefix=/usr/local/php5.2' '--with-apxs2=/usr/sbin/apxs' '--with-mysql=/usr/ ...

  3. post提交数据长度限制问题

    最近做手机拍照照片上传时,由于图片较大,base64后字符串长度太长,所以提交失败. 修改Tomcat服务器的maxPostSize=0,解决完成! <Connector connectionT ...

  4. Linux 下 安装jdk 1.7

    Linux 下 安装jdk 1.7 参考百度经验 http://jingyan.baidu.com/album/ce09321b7c111f2bff858fea.html?picindex=6 第一步 ...

  5. Java基础之String类

    String类 字符串是不可变的,对其做的任何改变,会生成一个对象,不会改变有原有对象. ==和equals() String s1 = "good"; String s2 = & ...

  6. Vue模板内容

    前面的话 如果只使用Vue最基础的声明式渲染的功能,则完全可以把Vue当做一个模板引擎来使用.本文将详细介绍Vue模板内容 概述 Vue.js使用了基于HTML的模板语法,允许声明式地将DOM绑定至底 ...

  7. 关于appcompat_v7兼容包的详细说明

    1.appcompat_v7包的由来? appcompat_v7是Google提供的向下兼容包,是针对API level 7(Android2.1)及以上版本所开发的,其作用是为了让兼容低版本API( ...

  8. JVM学习笔记五:虚拟机类加载机制

    类加载生命周期 类加载生命周期:加载.验证.准备.解析.初始化.使用.卸载 类加载或初始化过程什么时候开始? 遇到new.getstatic.putstatic或invokestatic这4条字节码指 ...

  9. 【新发现】不用苹果开发账号就能申请ios证书真机调试

    虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号. 想安装到自己非越狱手机测试是无能为力了. 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请 ...

  10. 14. Longest Common Prefix【leetcode】

    14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...