鱼C论坛

 找回密码
 立即注册
查看: 5148|回复: 12

单链表初始化的描述有关指针的内容该怎么理解

[复制链接]
发表于 2013-8-20 16:35:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 南风烟雨五庄观 于 2013-8-20 17:38 编辑

首先,定义了结点的结构
typedef struct Node
{
    ElemType data; //数据域
    /* 指针域。存放指向下一节点的指针,指针类型是Node(结点) */
    struct Node* Next;
} Node;
/* 给Node* 取别名叫LinkList */
typedef struct Node* LinkList;


现在有一个单链表L 要初始化,初始化函数为InitList(),该函数应该带初始化目标为参数,即
I = InitList(*L) // 注意,L作为链表名字就是头指针,*L就是头指针指向的头结点。
初始化链表,除了头指针以外,为了规范,应该创建头结点。并且让头指针指向头结点。
创建头结点也就是申请一块大小为Sizeof(Node)的内存的过程。表示为:
*L = (LinkList) malloc(sizeof(Node))
这个表达式我凌乱了,怎么也看不出来
函数malloc()返回的是一个不指向任何数据类型的指针,也就是所申请分配内存块的起始地址。然后用强制转换符去转换这个Void型指针为指向
LinkList的指针。(在前面定义中,用typedef给struct Node* 取的别名就是LinkList)
也就是说,表达式右边还是一个指针,可左边的*L是头结点啊。这个类型格式也不匹配啊??

我的问题就是为什么不是

L = (LinkList) malloc(sizeof(Node)) ?????
而是
*L = (LinkList) malloc(sizeof(Node))

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-21 09:51:32 | 显示全部楼层
能把初始化函数InitList()写全了么,你这么写就是void InitList(void),看不成参数类型和返回值类型,没办法回答你的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 10:16:13 | 显示全部楼层
好好看看指针啊  少年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-21 22:13:14 | 显示全部楼层

你认为哪里没有写全?
开始我就用红字特意标出来了
typedef struct Node
{
    ElemType data; //数据域
    /* 指针域。存放指向下一节点的指针,指针类型是Node(结点) */
    struct Node* Next;
} Node;
/* 给Node* 取别名叫LinkList */
typedef struct Node* LinkList;

下面是
*L = (LinkList) malloc(sizeof(Node))
相当于
*L = (struct Node*)malloc(sizeof(Node))

请问还有什么不清楚的??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-21 22:14:53 | 显示全部楼层
ascxyh009 发表于 2013-8-21 10:16
好好看看指针啊  少年

不要来灌水好吗?
如果你觉得哪里错了,烦请指出。
这个问题我问了一个程序员朋友,他也认可我的看法。
我怀疑你连我的问题都没有看清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 23:46:56 | 显示全部楼层
南风烟雨五庄观 发表于 2013-8-21 22:14
不要来灌水好吗?
如果你觉得哪里错了,烦请指出。
这个问题我问了一个程序员朋友,他也认可我的看法。 ...

好吧  不收你学费了   既然你认定了*L是结构体   那请问结构体怎么赋值
既然你发现了问题干嘛不自己去调试呢   纸上得来终觉浅的道理不用我说了吧
ps: 楼主爱学习的精神还是值得称赞的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-22 01:10:08 | 显示全部楼层
等着看解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-22 08:28:40 | 显示全部楼层
南风烟雨五庄观 发表于 2013-8-21 22:13
你认为哪里没有写全?
开始我就用红字特意标出来了
typedef struct Node

我的问题是InitList的参数类型和返回值类型是什么?
你说明白了么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-23 10:08:20 | 显示全部楼层
要使得*L = (LinkList) malloc(sizeof(Node))成立
那你*L就得是LinkList*型
即L必须是LinkList**型,即struct Node**型。
2楼没说错,要看是L还是*L,就要看你L定义的是什么类型的变量了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-21 21:03:13 | 显示全部楼层
*L = (LinkList) malloc(sizeof(Node))是将molloc()返回的值转换为LinkList,如果转换成的类型是LinkList * 就应该用 L = (LinkList *) malloc(sizeof(Node)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-24 19:52:25 | 显示全部楼层
我也碰到这问题了,现在明白了点。

1.初始化函数 void InitList(LinkList *L);  注意参数,  LinkList已经是指向结构体的指针了,这是指针的指针,也就是说,这个要改变这个指针,而不是指针所指向的东西,对指针做改变,也就是指针的指针那块。


2.void  InitList(LinkLIst *L);  函数内部接到了L指针的地址, 要对其采取措施
   当然得是 *L了。     



void  InitList(&L);  这个初始化函数,, L是指向结构体的指针,初始化是更改L的内容,所以要把L的地址传过去? 也就是传值!

      


你的这块疑问:
------------
L = (LinkList) malloc(sizeof(Node)) ?????
而是
*L = (LinkList) malloc(sizeof(Node))
------------
着重看下 这个InitList 函数的 参数部分!  传过去的是 L的地址, 所以要改变L ,就得是*L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-30 21:14:37 | 显示全部楼层
你确认你看清楚了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-31 10:27:26 From FishC Mobile | 显示全部楼层
han1597 发表于 2013-10-24 19:52
我也碰到这问题了,现在明白了点。

1.初始化函数 void InitList(LinkList *L);  注意参数,  LinkList已经 ...

有点不明白为什么要用双重指针,我觉得用一重指针也可以实现功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 23:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表