时荒小先生 发表于 2020-7-15 14:45:23

关于链表的结构指针描述的一点疑问

请问一下这个链表是咋定义的,那个LinkList是头指针还是指向链表的指针呢

本来我以为是指向链表的指针,但是后边的函数GetElem()和ListInsert()传递的参数分别是LinkList L和LinkList * L一下又给我整懵了{:10_266:}

赚小钱 发表于 2020-7-15 14:45:24

时荒小先生 发表于 2020-7-15 15:53
啊?我主要是不懂这个
这句话不是说LinkList类型是是指向结构体Node的指针吗
那L 的声明也就表明L1是一 ...

你的代码不完整,我只能给出不失一般性地回答。


函数的参数使用 struct,还是指针,就是看,在函数内部是否需要修改传入的参数。
如果需要修改传入参数,就使用指针类型。

这是最基本的原则。

虽然 LinkList 本身是一个指针,但是,这个指针只能起到修改 Node 的作用,

如果希望一个函数可以修改 LinkList,则需要传入 LinkList* 。


PS: 有一种情况,不用显示传入指针也能修改变量

struct int_wrapper {
    int* value
};

在使用上面这个结构体类型的变量时

void foo(struct int_wrapper input);

虽然这个函数的输入类型不是指针,但因为数据结构中,有一个指针整型域,因此,在实际效果等同于

void foo(int* input)


时荒小先生 发表于 2020-7-15 14:46:34

这个是《大话数据结构》里边的内容

赚小钱 发表于 2020-7-15 15:07:49

GetElem
语义表述为读取,不需要修改链表本身,因此,既可以接收指针类型,也可以接收非指针类型

ListInsert
语义表述为插入,属于写入操作,需要修改链表本身,因此需要指针类型。

当然,如果不需要修改头结点,即 i = 0 的情况,不给指针也行。

时荒小先生 发表于 2020-7-15 15:53:17

赚小钱 发表于 2020-7-15 15:07
语义表述为读取,不需要修改链表本身,因此,既可以接收指针类型,也可以接收非指针类型




啊?我主要是不懂这个typedef struct Node * LinkList;
这句话不是说LinkList类型是是指向结构体Node的指针吗
那L 的声明LinkList L1;也就表明L1是一个LinkList类型的变量,即指向结点的指针。
然后又来了一个LinkList* L2;这个L2是不是指向LinkList类型的指针,也就是说这个L2是一个指向一个指向结点的指针的指针
emmmmmm。。。。再然后我就晕了{:10_266:}这咋全是指针呀。。。。。
按前面说的,LinkList L1;
LinkList * L2;L1是指针,L2也是指针,如果不用修改链表的话传递L1, 需要修改链表的话传递L2, 难道L1表示的是链表,而L2表示的是指向链表的指针吗??
这么说我可以把链表看成是一个每个元素都是指针类型LinkList的数组, 而LinkList * 表示这个数组的。。。。
编不下去了{:10_327:}

时荒小先生 发表于 2020-7-15 19:19:45

赚小钱 发表于 2020-7-15 16:19
你的代码不完整,我只能给出不失一般性地回答。




这下懂了,谢谢大哥{:5_109:}
下次我会尽量描述的清楚一点的。
页: [1]
查看完整版本: 关于链表的结构指针描述的一点疑问