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

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

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值