错误的程序出现再第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. css元素隐藏(display:none和visibility:hidden)

    在css中, display:none和visibility:hidden都能够使元素隐藏.但是两者所带来的效果完全不同. css  display:none 当使用该样式的时候,HTML元素的宽高等 ...

  2. Leetcode 104 Maximum Depth of Binary Tree python

    题目: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...

  3. class Core<T> where T : class, new() 求解

    where T:泛型约束,约束类型T必须具有无参的构造函数表示T必须是class类型或它的派生类.new()构造函数约束允许开发人员实例化一个泛型类型的对象. 一般情况下,无法创建一个泛型类型参数的实 ...

  4. STM32工程中出现 error: A1163E: Unknown opcode R0, , expecting opcode or Macro错误分析及处理

    最近测试以前的一个程序,一般都是打开以前写的程序修改参数直接测试 但是发现以前的编译后出现错误. 奇怪了,以前的出现都是调试好了的啊,一般都是没有错误的,迅速找问题 跳转到错误代码行 代码区域 Hea ...

  5. 如何不保存Word即可用Word打开想显示的内容!

    今天遇到客户需要将数据用Word预览,原来做的时候是保存到本地然后打开,客户说这样不好,因为不一定预览了一定要保存,于是我翻箱倒柜的发现真没资料啊!!幸好经过我的大量实验(好吧,我是挨个方法试的!), ...

  6. cf479C Exams

    C. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  7. Word Break I II

    Word Break Given a string s and a dictionary of words dict, determine if s can be segmented into a s ...

  8. UGUI Toggle控件

    今天我们来看看Toogle控件, 它由Toogle + 背景 + 打勾图片 + 标签组成的. 它主要用于单选和多选 属性讲解: Is On: 代表是否选中. Toogle Transition: 在状 ...

  9. Eddy's picture(prime+克鲁斯卡尔)

    Eddy's picture Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  10. js 写日期

    <SCRIPT language="JavaScript" type="text/JavaScript">   today = new Date() ...