C语言,链表,用typedef定义的指针问题

HappyCanaan 2009-11-01 11:24:10
typedef struct film
{
char title[45];
struct film * next;
}Node;

typedef Node * List;

书上的例子,一句说:List movies;movies是一个适合指向链表的指针。这句倒是好理解。

下面又说,“重要的一点是要考虑清楚如下声明,List movies;是在建立一个列表,而不是在建立一个指向节点的指针或是建立一个结构。”
(C Primer Plus中的)

不明白啊,那不就是建立的是一个指针吗???????

...全文
996 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2009-11-04
  • 打赏
  • 举报
回复
语法上的确是个指针,但是作者强调的逻辑上的抽象层次。
cuiy0002 2009-11-04
  • 打赏
  • 举报
回复
你可以在本站下载一个英文chm
HappyCanaan 2009-11-04
  • 打赏
  • 举报
回复
哦?不能再追加分了吗····
HappyCanaan 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 cuiy0001 的回复:]
没有啊
[/Quote]

哎无语了···我买的中文第五版的,那上面&movies和movies都有啊,还有pdf也有我就···

敢情是印错了啊。

怎么可以这样,我对那本书是相当信任的。

那问题就解决了,谢谢。
序员 2009-11-04
  • 打赏
  • 举报
回复
没有啊
序员 2009-11-04
  • 打赏
  • 举报
回复

#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");


system("pause");
return 0;

}



void showmovies(Item item)

{

printf("Movie: %s Rating: %d\n", item.title,

item.rating);

}
序员 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 happycanaan 的回复:]
我先说说我对相关的几个概念的目前的理解,你给看看哪儿有毛病哈。
1、无论const List * plist还是List * plist,他们接受的类型都是 指向List指针的指针。所以我感觉实际参数就不能是movies啊?!!
2、加const是保护数据的,这样指针不能对所指向数据进行改动(也就用于不用改动数据的函数了)。但也不至于加了const就可以给它传递movies了吧?!!
******************************************************



[/Quote]
list已经是一种数据类型,List* pList 接受指向List的指针,即&movie了

你的直觉一直都是对的啊。。。
序员 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 happycanaan 的回复:]


不理解为什么const List * plist就对应movies了

[/Quote]

看了下list.h和list.c,没有看到你说的movie,都是&movie
user0418 2009-11-03
  • 打赏
  • 举报
回复
是对的
怎么理解都对的
呵呵
HappyCanaan 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 happycanaan 的回复:]
引用 31 楼 cuiy0001 的回复:
引用 30 楼 happycanaan 的回复:


不理解为什么const List * plist就对应movies了


看了下list.h和list.c,没有看到你说的movie,都是&movie



list.h和list.c中当然不会有了。对函数的调用是在film.c中啊,调用时传递的实际参数,有movies和
&movies啊。
[/Quote]

哦确切说是films3.c中
HappyCanaan 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 cuiy0001 的回复:]
引用 30 楼 happycanaan 的回复:


不理解为什么const List * plist就对应movies了



看了下list.h和list.c,没有看到你说的movie,都是&movie

[/Quote]

list.h和list.c中当然不会有了。对函数的调用是在film.c中啊,调用时传递的实际参数,有movies和
&movies啊。
HappyCanaan 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 tracn 的回复:]
编程要站在一个高度的抽象层次上,你这样的话只能永远做coder,而不会是programmer
[/Quote]

老大啊,呵呵一下给我扣个帽子,我从学C开始到现在俩月啊,自认资质一般,不过我自学的也不容易啊。

我在学嘛,刚理解,呵呵
zuoyanduxiaobo 2009-11-03
  • 打赏
  • 举报
回复
~~~``
Chong 2009-11-03
  • 打赏
  • 举报
回复
编程要站在一个高度的抽象层次上,你这样的话只能永远做coder,而不会是programmer
HappyCanaan 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 cuiy0002 的回复:]
C/C++ codestruct film aFilm;// An object is createdstruct film* pFilm;//Just a pointer to struct film, nothing special//now pFilm is a dangling pointer, we must dynamically allocate a region of memory¡­
[/Quote]

这段嘛,不才还是能看懂的,不知道你想说?
张尔谢尔 2009-11-02
  • 打赏
  • 举报
回复
C语言的数据结构经常用到指针的指针,因为需要改变链表头的地址,(不是很好说清楚,自己写个简单的链表就知道了,很多时候都要这样做)。。。
至于那个movie,本身是一个指针...

ps:用两个typedef我觉得好纠结
HappyCanaan 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 smallbear_2008 的回复:]
有的参数是需要 指向指针的指针吧?仔细确认一下
[/Quote]

你说的是&movies和movies做参数吧,好,我把有关的两个函数的情况写出来,你给看下啊

函数原型:void InitializeList (List * plist) //用来初始化一个列表
bool ListIsFull (const List * plist)//检查一个列表是否已满,是返回true,否false

函数调用: InitializeList (&movies);
ListIsFull (movies);

函数定义:void InitializeList (List * plist)
{
* plist=NULL; //下边的那个好说,就是这个,理解不好 }

bool ListIsFull (const List * plist)
{
node * pt;
bool full;

pt=(Node *)malloc(sizeof(Node));
if(pt==NULL)
full=true;
else
full=false;
free(pt);
rerutn full;
}
晨星 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 happycanaan 的回复:]
可能也有翻译的问题吧,到时候看了原版再说是作者不到位还是译者不到位吧···
哎钻牛角尖···我的思维可能就是太苛求细节了。偶文科生···
[/Quote]
呵呵,可能偶说的有点急了。不是故意的。:P
求细节也没啥不好的,没关系,有问题就到这里大家一起讨论。:)
smallbear_2008 2009-11-02
  • 打赏
  • 举报
回复
有的参数是需要 指向指针的指针吧?仔细确认一下
HappyCanaan 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 steedhorse 的回复:]
何苦因为他表达得不怎么到位,你的心便要跟着他如此纠结……
[/Quote]

可能也有翻译的问题吧,到时候看了原版再说是作者不到位还是译者不到位吧···
哎钻牛角尖···我的思维可能就是太苛求细节了。偶文科生···
加载更多回复(24)

69,371

社区成员

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

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