南风烟雨五庄观 发表于 2013-8-20 16:35:21

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

本帖最后由 南风烟雨五庄观 于 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))

liufei_vip 发表于 2013-8-21 09:51:32

能把初始化函数InitList()写全了么,你这么写就是void InitList(void),看不成参数类型和返回值类型,没办法回答你的问题。

ascxyh009 发表于 2013-8-21 10:16:13

好好看看指针啊少年

南风烟雨五庄观 发表于 2013-8-21 22:13:14

liufei_vip 发表于 2013-8-21 09:51 static/image/common/back.gif
能把初始化函数InitList()写全了么,你这么写就是void InitList(void),看不成参数类型和返回值类型,没办法 ...

你认为哪里没有写全?
开始我就用红字特意标出来了
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))

请问还有什么不清楚的??

南风烟雨五庄观 发表于 2013-8-21 22:14:53

ascxyh009 发表于 2013-8-21 10:16 static/image/common/back.gif
好好看看指针啊少年

不要来灌水好吗?
如果你觉得哪里错了,烦请指出。
这个问题我问了一个程序员朋友,他也认可我的看法。
我怀疑你连我的问题都没有看清楚。

ascxyh009 发表于 2013-8-21 23:46:56

南风烟雨五庄观 发表于 2013-8-21 22:14 static/image/common/back.gif
不要来灌水好吗?
如果你觉得哪里错了,烦请指出。
这个问题我问了一个程序员朋友,他也认可我的看法。 ...

好吧不收你学费了   既然你认定了*L是结构体   那请问结构体怎么赋值
既然你发现了问题干嘛不自己去调试呢   纸上得来终觉浅的道理不用我说了吧
ps: 楼主爱学习的精神还是值得称赞的

zZ_小春 发表于 2013-8-22 01:10:08

等着看解释

liufei_vip 发表于 2013-8-22 08:28:40

南风烟雨五庄观 发表于 2013-8-21 22:13 static/image/common/back.gif
你认为哪里没有写全?
开始我就用红字特意标出来了
typedef struct Node


我的问题是InitList的参数类型和返回值类型是什么?
你说明白了么?

tsembrace 发表于 2013-8-23 10:08:20

要使得*L = (LinkList) malloc(sizeof(Node))成立
那你*L就得是LinkList*型
即L必须是LinkList**型,即struct Node**型。
2楼没说错,要看是L还是*L,就要看你L定义的是什么类型的变量了。

血色熊猫 发表于 2013-9-21 21:03:13

*L = (LinkList) malloc(sizeof(Node))是将molloc()返回的值转换为LinkList,如果转换成的类型是LinkList * 就应该用 L = (LinkList *) malloc(sizeof(Node)。

han1597 发表于 2013-10-24 19:52:25

我也碰到这问题了,现在明白了点。

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


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



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

      


你的这块疑问:
------------
L = (LinkList) malloc(sizeof(Node)) ?????
而是
*L = (LinkList) malloc(sizeof(Node))
------------
着重看下 这个InitList 函数的 参数部分!传过去的是 L的地址, 所以要改变L ,就得是*L

猪猪BBUn咕咕 发表于 2013-10-30 21:14:37

你确认你看清楚了?

xjtumj 发表于 2013-10-31 10:27:26

han1597 发表于 2013-10-24 19:52
我也碰到这问题了,现在明白了点。

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

有点不明白为什么要用双重指针,我觉得用一重指针也可以实现功能
页: [1]
查看完整版本: 单链表初始化的描述有关指针的内容该怎么理解