错误的程序出现再第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;
}
}

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

最新文章

  1. drawable animation
  2. codeforces A. IQ Test 解题报告
  3. 使用NBU进行oracle异机恢复
  4. 64位python安装MySQL-python 1.2.5
  5. php学习日志(3)-echo&amp;print
  6. String功能测试
  7. 设置Ubuntu 10.10版本的软件源
  8. HIVE安装配置
  9. 面向对象编程 —— java实现函数求导
  10. [DeeplearningAI笔记]改善深层神经网络1.1_1.3深度学习使用层面_偏差/方差/欠拟合/过拟合/训练集/验证集/测试集
  11. 微信小程序 开发文档
  12. PHP7运行环境搭建(Windows7)
  13. 移除input在type=&quot;number&quot;时的上下箭头
  14. k8s 调度器
  15. Java时代即将来临
  16. JDK7与JDK8中HashMap的实现
  17. 第一章--Go与web应用
  18. IIS 7.0 的 ASP.NET 应用程序生命周期概述
  19. Python3.0版本 从听说python可以做爬虫到自己第一成功做出爬虫的经历
  20. Eclipse项目中乱码问题的解决办法

热门文章

  1. js 对日期加减
  2. Hdu1001(1到100的和)
  3. ASP.NET MVC5 生成验证码
  4. Ubuntu中找到并杀死僵尸进程
  5. Azure上A/D系列虚拟机到DS系列迁移(1)
  6. 段和RSEG用法
  7. Oracle 10g体系机构及安全管理《思维导图》
  8. 《编程珠玑》第二章 aha算法
  9. PHP 文件打开/读取
  10. 清除mac上安装软件的用户信息