这个函数调用没有用到参数,那还传参数干什么?

mcmay 2014-04-16 03:50:50
各位大侠, 下面这个函数中都没有用到参数,那还设置参数干什么?代码分为三个部分,一个.h文件,两个.c文件。

Listing 17.3. The list.h Interface Header File
/* list.h -- header file for a simple list type */
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h> /* C99 feature */

/* program-specific declarations */
#define TSIZE 45 /* size of array to hold title */

struct film
{
char title[TSIZE];
int rating;
};

/* general type definitions */

typedef struct film Item;
typedef struct node
{
Item item;
struct node * next;
} Node;
typedef Node * List;

/* function prototypes */

/* operation: initialize a list */
/* preconditions: plist points to a list */
/* postconditions: the list is initialized to empty */
void InitializeList(List * plist);

/* operation: determine if list is empty */
/* plist points to an initialized list */
/* postconditions: function returns True if list is empty */
/* and returns False otherwise */
bool ListIsEmpty(const List *plist);

/* operation: determine if list is full */
/* plist points to an initialized list */
/* postconditions: function returns True if list is full */
/* and returns False otherwise */
bool ListIsFull(const List *plist);

/* operation: determine number of items in list */
/* plist points to an initialized list */
/* postconditions: function returns number of items in list */
unsigned int ListItemCount(const List *plist);

/* operation: add item to end of list */
/* preconditions: item is an item to be added to list */
/* plist points to an initialized list */
/* postconditions: if possible, function adds item to end */
/* of list and returns True; otherwise the */
/* function returns False */
bool AddItem(Item item, List * plist);

/* operation: apply a function to each item in list */
/* plist points to an initialized list */
/* pfun points to a function that takes an */
/* Item argument and has no return value */
/* postcondition: the function pointed to by pfun is */
/* executed once for each item in the list */
void Traverse (const List *plist, void (* pfun)(Item item) );

/* operation: free allocated memory, if any */
/* plist points to an initialized list */
/* postconditions: any memory allocated for the list is freed */
/* and the list is set to empty */
void EmptyTheList(List * plist);

#endif


Listing 17.4. The films3.c Program

/* films3.c -- using an ADT-style linked list */

/* compile with list.c */
#include <stdio.h>
#include <stdlib.h> /* prototype for exit() */
#include "list.h" /* defines List, Item */

void showmovies(Item item);

int main(void)
{
List movies;
Item temp;

/* initialize */
InitializeList(&movies);
if (ListIsFull(&movies))
{
fprintf(stderr,"No memory available! Bye!\n");
exit(1);
}

/* gather and store */
puts("Enter first movie title:");
while (gets(temp.title) != NULL && temp.title[0] != '\0')
{
puts("Enter your rating <0-10>:");
scanf("%d", &temp.rating);
while(getchar() != '\n')
continue;
if (AddItem(temp, &movies)==false)
{
fprintf(stderr,"Problem allocating memory\n");
break;
}
if (ListIsFull(&movies))
{
puts("The list is now full.");
break;
}
puts("Enter next movie title (empty line to stop):");
}

/* display */
if (ListIsEmpty(&movies))
printf("No data entered. ");
else
{
printf ("Here is the movie list:\n");
Traverse(&movies, showmovies);
}
printf("You entered %d movies.\n", ListItemCount(&movies));

/* clean up */
EmptyTheList(&movies);
printf("Bye!\n");

return 0;
}

void showmovies(Item item)
{
printf("Movie: %s Rating: %d\n", item.title, item.rating);
}


Listing 17.5. The list.c Implementation File
/* list.c -- functions supporting list operations */

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

/* local function prototype */
static void CopyToNode(Item item, Node * pnode);

/* interface functions */
/* set the list to empty */

void InitializeList(List * plist)
{
* plist = NULL;
}

/* returns true if list is empty */
bool ListIsEmpty(const List * plist)
{
if (*plist == NULL)
return true;
else
return false;
}

/* returns true if list is full */
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;
}

/* returns number of nodes */
unsigned int ListItemCount(const List * plist)
{
unsigned int count = 0;
Node * pnode = *plist; /* set to start of list */

while (pnode != NULL)
{
++count;
pnode = pnode->next; /* set to next node */
}

return count;
}

/* creates node to hold item and adds it to the end of */
/* the list pointed to by plist (slow implementation) */
bool AddItem(Item item, List * plist)
{
Node * pnew;
Node * scan = *plist;

pnew = (Node *) malloc(sizeof(Node));
if (pnew == NULL)
return false; /* quit function on failure */

CopyToNode(item, pnew);
pnew->next = NULL;
if(scan == NULL) /* empty list, so place */
*plist = pnew; /* pnew at head of list */
else
{
while (scan->next != NULL)
scan = scan->next; /* find end of list */
scan->next = pnew; /* add pnew to end */
}

return true;
}

/* visit each node and execute function pointed to by pfun */
void Traverse (const List * plist, void (* pfun)(Item item) )
{
Node * pnode = *plist; /* set to start of list */

while (pnode != NULL)
{
(*pfun)(pnode->item); /* apply function to item */
pnode = pnode->next; /* advance to next item */
}
}

/* free memory allocated by malloc() */
/* set list pointer to NULL */
void EmptyTheList(List * plist)
{
Node * psave;

while (*plist != NULL)
{
psave = (*plist)->next; /* save address of next node */
free(*plist); /* free current node */
*plist = psave; /* advance to next node */
}
}

/* local function definition */
/* copies an item into a node */
static void CopyToNode(Item item, Node * pnode)
{
pnode->item = item; /* structure copy */
}

谢谢指教!
...全文
236 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
一根烂笔头 2014-04-18
  • 打赏
  • 举报
回复
写代码的人初衷和结果不一致的表现!或者写成带参数接口,在不使用全局变量的情况下也能用一用
mcmay 2014-04-16
  • 打赏
  • 举报
回复
谢谢楼上各位大侠的提点,看来学一门语言还会牵涉到语言之外的很多其他知识。学习的过程也就是个不断扩展的过程。
lm_whales 2014-04-16
  • 打赏
  • 举报
回复
引用 4 楼 supermegaboy 的回复:
[quote=引用 3 楼 lm_whales 的回复:] [quote=引用 2 楼 supermegaboy 的回复:] bool ListIsFull(const List * plist) 应该是设计之初的想法,后来实现的时候没有使用,却忘了删掉。但这段代码废话很多,不够简洁,例如这个LitisFull,这样写就行了:

bool ListIsFull(const List * plist) 
{
    Node * pt = ( Node * )malloc( sizeof( Node ) );
    free( pt );
    return !pt;
}
++ LitisFull就是检查一下,还有没有内存可以分配,有的话就永远不会满,内存用完了就满了。 这个情况,几乎不会遇到满的情况,满了以后,估计程序啥也干不了了。 满了以后,任何其他分配内存的操作,都几乎不能执行,这样这个程序基本上也就跑不下去了。 对于链表,一般不用判满,除非限制节点数量。 [/quote] 这个ListisFull提不提供均可以,提供的话,遇到无内存可分配时,可通过自定义资源管理模块(C)或new_handler(C++)释放内存。[/quote] 哦,原来还可以这样处理,谢谢
飞天御剑流 2014-04-16
  • 打赏
  • 举报
回复
引用 3 楼 lm_whales 的回复:
[quote=引用 2 楼 supermegaboy 的回复:] bool ListIsFull(const List * plist) 应该是设计之初的想法,后来实现的时候没有使用,却忘了删掉。但这段代码废话很多,不够简洁,例如这个LitisFull,这样写就行了:

bool ListIsFull(const List * plist) 
{
    Node * pt = ( Node * )malloc( sizeof( Node ) );
    free( pt );
    return !pt;
}
++ LitisFull就是检查一下,还有没有内存可以分配,有的话就永远不会满,内存用完了就满了。 这个情况,几乎不会遇到满的情况,满了以后,估计程序啥也干不了了。 满了以后,任何其他分配内存的操作,都几乎不能执行,这样这个程序基本上也就跑不下去了。 对于链表,一般不用判满,除非限制节点数量。 [/quote] 这个ListisFull提不提供均可以,提供的话,遇到无内存可分配时,可通过自定义资源管理模块(C)或new_handler(C++)释放内存。
lm_whales 2014-04-16
  • 打赏
  • 举报
回复
引用 2 楼 supermegaboy 的回复:
bool ListIsFull(const List * plist) 应该是设计之初的想法,后来实现的时候没有使用,却忘了删掉。但这段代码废话很多,不够简洁,例如这个LitisFull,这样写就行了:

bool ListIsFull(const List * plist) 
{
    Node * pt = ( Node * )malloc( sizeof( Node ) );
    free( pt );
    return !pt;
}
++ LitisFull就是检查一下,还有没有内存可以分配,有的话就永远不会满,内存用完了就满了。 这个情况,几乎不会遇到满的情况,满了以后,估计程序啥也干不了了。 满了以后,任何其他分配内存的操作,都几乎不能执行,这样这个程序基本上也就跑不下去了。 对于链表,一般不用判满,除非限制节点数量。
飞天御剑流 2014-04-16
  • 打赏
  • 举报
回复
bool ListIsFull(const List * plist) 应该是设计之初的想法,后来实现的时候没有使用,却忘了删掉。但这段代码废话很多,不够简洁,例如这个LitisFull,这样写就行了:

bool ListIsFull(const List * plist) 
{
    Node * pt = ( Node * )malloc( sizeof( Node ) );
    free( pt );
    return !pt;
}
赵4老师 2014-04-16
  • 打赏
  • 举报
回复
写代码的人不知道怎么传参,我猜。
本课程是PowerBI系列课程之DAX函专题讲解,包含以下内容 1.  DAX函基础知识什么是DAX函学函:ABS、DIVIDE、MOD、RAND、ROUND、FIXED等日期和时间函: CALENDAR、CALENDARAUTO、MONTH、YEAR、DATE、DT等信息函:USERNAME、USERPRINCIPALNAME、HASONEFILTER、HASONEVALUE、ISFILTERED、ISCROSSFILTERED、ISINSCOPE、ISBLANK、SELECTEDMEASURE、SELECTEDMEASURENAME等逻辑函:AND、OR、IF、IFERROR、SWITCH、TRUE、FALSE、COALESCE(官方文档含糊不清-结合实例)等关系函:CROSSFILTER、RELATED、RELATEDTABLE等筛选器函:FILTER、CALCULATE、ALL、ALLEXCEPT、ALLSELECTED、EARLIER、KEEPFILTERS、REMOVEFILTERS、SELECTEDVALUE、LOOKUPVALUE等父子函:PATH、PATHCONTAINS、PATHITEM、PATHLENGTH等统计函:AVERAGE、COUNT、MAX、MIN、SUM等迭代统计函:AVERAGEX、COUNTX、MAXX、MINX、SUMX、RANKX等表函: FILTERS 、ADDCOLUMNS、 SELECTCOLUMNS、 CROSSJOIN、 EXCEPT、 GENERATE、 GROUPBY、 SUMMARIZE、 SUMMARIZECOLUMNS、 TOPN、 TREATAS、 UNION、 VALUES、DISTINCT、DATATABLE、NATUALINNERJOIN、NATRUALLEFTOUTERJOIN等文本函: EXACT、MID、 FIND、 LEN、 REPT、 LOWER、 UPPER、 UNICHAR等时间智能函:DATEADD、DATESMTD、FIRSTDATE、LASTDATE、SAMEPERIODLASTYEAR等财务函:2020.7之后发布的,和Excel中财务函相似,网页和demo pbix简单介绍其他函:BLANK、ERROR、IFERROR等 DAX函初体验:Max、Sum、Divide、if、Values等值函表函以及表和列的概念DAX函术语、语法、运算符DAX运算符和引擎中字母大小写问题DAX编程注释和快捷键DAX与Excel函的共同点和区别(PPT)DAX、xmSQL与SQL表达式的区别(PPT)DAX函的自学途径 2.  PowerBI中据建模知识维度建模关系传递和交叉筛选器方向-理解表关系(1v1, 1vM, Mv1,MvM)两个方向上应用安全筛选器关闭关系自动检测新建计算列新建度量值新建计算表:辅助表(五种方式)、日历表据类型讲解据格式控制:%、$、千位分隔符、小位、日期格式Format函自定义据格式Convert函据类型转换解决中文字单位 万 的显示问题Date和DT函定义固定日期值显示和隐藏列DAX代码分析器阅读DAX表达式方法:从上至下、由内到外(注意Calculate的计算顺序)调试DAX表达式方法:分布输出或VAR输出3.  DAX函原理 Vertipaq列式据库原理理解度量值和计算列理解行上下文和筛选上下文:Calculate示意图行上下文中使用VAR替代EARLIERVAR变量在定义时的上下文中计算VAR变量是采用惰性计算(使用时计算)理解扩展表和RELATED函理解据沿袭Lineage 4.  开始感知DAX函的强大DAX函实现特殊符号的使用DAX函实现切片器默认当前月或天DAX函使切片器默认代表无任何选择DAX函使切片器仅显示有据的选项DAX函使切片器反向筛选和计算DAX函使切片器之间取并集DAX函使关系中多端的切片器筛选一端的切片器 DAX函实现年月共同决定据排序DAX函实现动态图表标题DAX函实现动态图表配色和图标DAX函实现动态纵坐标DAX函实现动态横坐标5.  理解重点DAX函重中之重FILTER 和 CALCULATE和CALCULATETABLE详解调节器REMOVEFILTERS和ALL、ALLEXCEPT函调节器ALL、ALLSELECTED和ISINSCOPE占比分析调节器AllSELECTED和KEEPFILTERS的比较调节器USERELATIONSHIP激活关系调节器TREATAS动态建立关系调节器CROSSFILTER改变筛选器方向重点之ISFILTERED和ISCROSSFILTERED重点之HASONEVALUE和ISINSCOPE的区别重点之表函SELECTEDCOLUMNS和ADDCOLUMNS重点之表函NATUALINNERJOIN和NATRUALLEFTOUTERJOIN重点之表函FILTERS和VALUES比较重点之VALUES和DISTINCT的区别重点之分组函SUMMARIZECOLUMNS详解重点之函LOOKUPVALUE vs RELATED vs VLOOKUP 重点之集合函UNION、INTERSECT、EXCEPT重点之集合函CROSSJOIN和GENERATE 笛卡尔积重点之值合并、列合并、表合并CONCATENATEX重点之BLANK行产生的原因和BLANK相关函重点之COALESCE函处理空重点之FIRSTNOBLANK和FIRSTNOBLANKVALUE函重点之使用VAR变量表中的列重点之Error和IfError函6.  实际案例-日期时间和时间智能相关关键点-日期表和事实表关联问题时间智能-同比环比分析时间智能-累计聚合、滚动聚合、移动平均时间智能-期初期末库存分析日期分析-计算任意所选月份的环比日期分析-周的同比环比和周聚合日期分析-指定月份的同比环比和季度环比日期分析-计算季末或季末月份的据日期分析-趋势图中根据最近月份取TopN日期分析-动态指定某个日期区间分析日期分析-动态任意区间段做据对比日期分析-实现两个日期列的范围筛选日期分析-按工作日计算日期差日期分析-计算最近两次购买日期差日期分析-根据历史据做销售预测日期时间函和时间智能函使用总结7.  实际案例-DAX函进阶进阶-解决列排序对计算的影响进阶-实现切片器筛选之间的OR逻辑进阶-矩阵Matrix中高亮显示最大值最小值进阶-DAX列转行 vs 矩阵列转行和逆透视进阶-非日期类型的累计聚合进阶-排名逻辑的4种实现-RANKX详解进阶-分组内排名的实现和理解迭代函进阶-TopN/BottomN和Others的实现进阶-TopN中实现动态指标进阶-TopN中实现N的动态进阶-分组内动态TopN和Others 进阶-商品折上折-迭代函SUMX详解 进阶-分析客户购买行为进阶-找出无购买行为的客户进阶-客户购买商品关联度分析 进阶-新客户分析进阶-流失客户分析进阶-回流客户分析进阶-客户购买频次和区间分析进阶-RFM客户价值分析进阶-帕累托分析进阶-盈亏平衡分析报表性能优化思路(PPT)  

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧