错误的程序出现再第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. 正则表达式及re模块

    正则表达式使用的特殊符号与字符 元字符 描述 \ 将下一个字符标记符.或一个向后引用.或一个八进制转义符.例如,“\\n”匹配\n.“\n”匹配换行符.序列“\\”匹配“\”而“\(”则匹配“(”.即 ...

  2. 前端上将字符串用语音读出来只能在IE上运行 其他不行 代码极少

    先保存保存自己的笔记 有高手看到求指点 <script type="text/javascript"> var VoiceObj; try { VoiceObj = n ...

  3. information_schema.profiling学习

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

  4. 编译安装httpd

    一.安装前的说明: httpd依赖于apr和apr-util所以在安装httpd之前要把这些东西都安装上去. 事先安装的依赖: yum -y install gcc gcc-c++ pcre-deve ...

  5. SIM卡尺寸及剪卡教程

    手机SIM卡有全尺寸SIM卡.Mini-SIM卡.Micro-SIM卡.Nano-SIM卡.Embedded-SIM卡等类型,目前主流手机基本都是趋向使用Micro-SIM卡和Nano-SM卡. 一. ...

  6. XML文档形式&JAVA抽象类和接口的区别&拦截器过滤器区别

    XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? a: 两种形式 dtd schemab: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发 ...

  7. mongodb数据库备份恢复

    MongoDB数据文件备份与恢复   备份与恢复数据对于管理任何数据存储系统来说都是非常重要的.   1.冷备份与恢复——创建数据文件的副本(前提是要停止MongoDB服务器),也就是直接copy  ...

  8. android 更改USB显示名称

    能力 kernel\drivers\usb\gadget\Android.c 在这个例子中,下列的变化 #define PRODUCT_STRING "Sergeycao" 版权声 ...

  9. Ubuntu 系统搭建php服务器 用ssh 远程操作

    一:在桌面下载xshell客户端连接 ,vmavar 上的 Ubuntu系统,遇到的问题跟大家分享一下,希望大家少走弯路 Ubuntu系统默认没有ssh server 要安装 apt-get inst ...

  10. CATransform3D参数的意义

    经常忘记CATransform3D各参数的意思,记下来好好理解下   struct CATransform3D { CGFloat m11(x缩放),m12(y切变),m13(旋转),m14(); C ...