错误的程序出现再第17章的499页ListItemCount()和500页的Traverse()两个函数上。

原著包含所有函数定义的list.c如下:

 #include<stdio.h>
#include<stdlib.h>
#include "list.h" static void CopyToNode(Item item,Node * pnode); void InitializeList(List * plist)
{
*plist = NULL;//movie = NULL
} bool ListIsEmpty(const List * plist)
{
if(*plist==NULL)
return true;
else
return false;
} bool ListIsFull(const List * plist)
{
Node * pt;
bool full;
pt = (Node *)malloc(sizeof(Node));
if(pt==NULL)
full = true;
else
full = false;
free(pt);
return full;
} unsigned int ListItemCount(const List * plist)
{
unsigned int count = ;
Node * pnode = *plist; while(pnode!=NULL)
{
++count;
pnode = pnode->next;
}
return count;
} bool AddItem(Item item,List *plist)
{
Node * pnew;
Node * scan = *plist; pnew = (Node *)malloc(sizeof(Node));
if(pnew == NULL)
return false; CopyToNode(item,pnew);
pnew->next = NULL;
if(scan==NULL)
*plist = pnew;
else
{
while(scan->next!=NULL)
scan = scan->next;
scan->next = pnew;
}
return true;
} void Traverse(const List * plist,void(*pfun)(Item item))
{
Node * pnode = *plist;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode = pnode->next;
}
} void EmptyTheList(List * plist)
{
Node * psave;
while(*plist!=NULL)
{
psave = (*plist)->next;
free(*plist);
*plist = psave;
}
} static void CopyToNode(Item item,Node * pnode)//静态函数限制该函数只能在本文件内使用
{
pnode->item = item;
}

但是在film3.c中调用的形式分别如下:

 Traverse(movies,showmovies);                                                //传递的是movies指针的拷贝

 printf("You entered %d movies.\n",ListItemCount(movies));     //传递的也是movies指针的拷贝

也就是说,函数调用的时候已经传递的是指针了,但函数体内调用时却又把它当成指针的地址,及指向指针的指针,从而发生错误

解决的方法有两个,一是更改函数调用如下:

 Traverse(&movies,showmovies);                                 //传递的是movies指针的地址

 printf("You entered %d movies.\n",ListItemCount(&movies));//传递的也是movies指针的地址

二是更改这两个函数的函数体:

 unsigned int ListItemCount(const List * plist)
{
unsigned int count = ;
Node * pnode = plist; while(pnode!=NULL)
{
++count;
pnode = pnode->next;
}
return count;
} void Traverse(const List * plist,void(*pfun)(Item item))
{
Node * pnode = plist;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode = pnode->next;
}
}

总之两个方法都可以,不知道是原著的错误,还是出版社校准的错误,希望大家能看出来。

发现中文版《C Primer Plus第五版》示例程序的一个错误的更多相关文章

  1. 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】

      老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf  下载地址:http://pan.bai ...

  2. C Primer Plus(第五版)1

    这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...

  3. Primer C++第五版 读书笔记(一)

    Primer C++第五版 读书笔记(一) (如有侵权请通知本人,将第一时间删文) 1.1-2.2 章节 关于C++变量初始化: 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义 ...

  4. 《C++Primer》第五版习题详细答案--目录

    作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式

  5. 《C++Primer》第五版习题答案--第三章【学习笔记】

    [C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...

  6. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  7. 《C++Primer》第五版习题答案--第五章【学习笔记】

    <C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...

  8. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

  9. C++primer(第五版)Sales_item.h头文件

    C++primer(第五版)1.51练习章节需要有一个Sales_item类,但是给的网站找不到,直接复制下面就好咯: #ifndef SALESITEM_H #define SALESITEM_H ...

随机推荐

  1. java使用dom4j和XPath解析XML与.net 操作XML小结

    最近研究java的dom4j包,使用 dom4j包来操作了xml 文件 包括三个文件:studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), ...

  2. Ecstore中如何调用发起Ajax请求

    Ecstore的JS框架使用了mootools,所以ajax调用也使用mootools中的Request组件. 语法: var myRequest = new Request([options]); ...

  3. 浅谈window.attachEvent

    以前写 JavaScript 脚本时,事件都是采用object.event = handler;的方式初始化.这种方式对于 Internet Explorer.Mozilla/Firefox 和 Op ...

  4. set(二叉搜索树)

    找球号(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏.游戏规则为:在一堆球中,每个球上都有一个整数编号i(0<=i<= ...

  5. GitLab CI

    GitLab CI持续集成配置方案   目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 Git ...

  6. information_schema.profiling学习

    information_schema.profiling可以用来分析每一条SQL在它执行的各个阶段的用时,注意这个表是session 级的,也就是说如果session1 开启了它:session2没有 ...

  7. typecho路由机制详解

    本文介绍的是typecho的路由机制,引自 不烦恼路由机制是typecho的核心,有很多功能都是基于路由功能设计的,理解并熟悉TE的路由机制将非常有助于插件的开发. 完整的路由表如下: array ( ...

  8. ListView与CheckBox组合实现单选

    main.xml配置文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns ...

  9. PV与并发之间换算的算法 换算公式

  10. 数字图像处理之sobel边缘检测

    在前两部文章介绍了几种边缘检测算法,和位图的内存结构.如果对前两篇文章已经理解透彻 了,那么本文将带你进入数字图像处理的世界. 本文通过C代码实现基本的sobel边缘检测,包括8个方向和垂直方向: 代 ...