|
10鱼币
在看 C Primer Plus(第五版)第十七章高级数据表示,采用ADT(抽象数据类型)方式定义链表,按书上例子:
数据的构造代码如下:
- struct film
- {
- char title[TSIZE];
- int rating;
- };
- typedef struct film Item;
- typedef struct node
- {
- Item item;
- struct node *next;
- }Node;
- typedef Node *List;
-
复制代码
对于上面的数据构造类型,设计一个功能函数如下:
- /*函数原型 */
- /*操作:初始化一个列表 */
- /*操作前:plist指向一个列表 */
- /*操作后:该列表被初始化为空列表 */
- void InitializeList(List *plist)
- {
- *plist=NULL;
- }
复制代码
我尝试梳理:首先Item是纯粹表示数据的结构类型;通过加上指针成员构成单链表的Node结构类型;并设置List为指向该Node类型的指针类型。
问题是,为何上述函数中,参数要用一个指向List的指针类型数据来表示?如果直接用List类型的数据不行么?List本身也是指针,传递的也就是地址,像如下表示有啥问题没:
- void InitializeList(List plist)
- {
- plist=NULL;
- }
复制代码
再比如同样对于前面的数据类型,另一个功能函数按书上的原型实现代码如下(注释为我的疑问):
- /*操作:确定列表中项目数量 */
- /*操作前:plist指向一个已初始化的列表 */
- /*操作后:返回项目数量 */
- unsigned int ListItemCount(const List *plist) //为何不直接const List plist?
- {
- Node *pnew; //为何不直接List 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;
- }
复制代码
针对上述代码及我注释里的疑问,我的函数原型实现代码如下:
- /*操作:确定列表中项目数量 */
- /*操作前:plist指向一个已初始化的列表 */
- /*操作后:返回项目数量 */
- unsigned int ListItemCount(const List plist)
- {
- List pnew;
- List 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 f( int d );
int main () {
int c = 5;
f(c);
}
不给你看函数f 的定义,你也应该知道,调用完f(c)后,c的值没有变。这是函数值传递决定的,传进函数f,给f操作的只是c的副本,这个副本仅仅在初始的时候和c的值一样,以后和c没有任何关系。所以f不可能改变c的值。用生活中的例子说明,你把你的照片(你的副本)送给一个坏蛋,你不会担心因为他撕毁照片而对你本人照成伤害。
但是 ...
|