鱼C论坛

 找回密码
 立即注册
查看: 2129|回复: 17

[已解决]数据结构建立空链表问题

[复制链接]
发表于 2017-6-5 16:35:09 | 显示全部楼层 |阅读模式

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

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

x
如图,按照课件教学,建立空链表代码报错,但是从网上网友写的代码拿去编译却能通过,所以到底哪个是对的,没搞懂加*和不加*到底具体区别在哪
最佳答案
2017-6-7 16:49:26
本帖最后由 超凡天赐 于 2017-6-7 16:52 编辑
Jugeun_So 发表于 2017-6-7 14:43
朋友很感谢你能帮忙,但是,我对你改的代码有疑问

你这样传指针L进去,方法结束不是依旧没有建立 ...


我民白你的意思了
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.     int elem;
  6.     struct Node *next;
  7. }Node,*LinkList;

  8. void InitList(LinkList *L)
  9. {
  10.     *L = (LinkList)malloc(sizeof(Node));
  11.     (*L)->next = NULL;
  12. }

  13. int main()
  14. {
  15.     LinkList L = NULL;
  16.     InitList(&L);
  17.     return 0;
  18. }
复制代码

改好了,改好了。

这是课件学习的代码,编译报错

这是课件学习的代码,编译报错

这是网上网友写的文章,这个编译通过

这是网上网友写的文章,这个编译通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-5 17:31:36 | 显示全部楼层
你那个Linklist 本来就是一个指针了,在Linklist函数中传递参数仍然用L->next,明显错了,L->next相当于二级指针了,这时必须还是用(*L) 来才可以,不然传参数的时候就用L,就不要用*L。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-5 18:56:25 | 显示全部楼层
贴代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-5 20:43:49 | 显示全部楼层

代码都在图里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 20:45:50 | 显示全部楼层

问问题是一定要注意,没有人给你一个一个输
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-5 20:46:08 | 显示全部楼层
SmallDream 发表于 2017-6-5 17:31
你那个Linklist 本来就是一个指针了,在Linklist函数中传递参数仍然用L->next,明显错了,L->next相当于二 ...

如果参数是L,那不就是值传递吗,值传递方法结束后没有用啊,要引用传递必须得*L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-5 20:55:21 | 显示全部楼层
超凡天赐 发表于 2017-6-5 20:45
问问题是一定要注意,没有人给你一个一个输

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int elem;
    struct Node *next;

}Node, *LinkList;

void InitList(LinkList *L)
{
  L = (LinkList)malloc(sizeof(Node));
  L->next = NULL;
}

void main()
{
    LinkList L = NULL;
    InitList(&L);
}


谢谢提醒,代码复制下来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 22:28:18 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct
  4. {
  5.     int elem;
  6.     struct Node *next;
  7.    
  8. }Node;
  9. void InitList(Node *L)
  10. {
  11.     L = (Node *)malloc(sizeof(Node));
  12.     L->next = NULL;
  13. }

  14. int main()
  15. {
  16.     Node *L = NULL;
  17.     InitList(L);
  18.     return 0;
  19. }
复制代码

加*就是指针,不加就不是指针。有什么不会的再问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-6 13:01:35 | 显示全部楼层
超凡天赐 发表于 2017-6-5 22:28
加*就是指针,不加就不是指针。有什么不会的再问。

你这不是值传递吗,建立空链表不是要引用传递才行?不然方法结束没有效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-6 16:58:22 From FishC Mobile | 显示全部楼层
本帖最后由 超凡天赐 于 2017-6-6 22:36 编辑
Jugeun_So 发表于 2017-6-6 13:01
你这不是值传递吗,建立空链表不是要引用传递才行?不然方法结束没有效果


亲,你写的代码有一些语法错误。我不知道你说的什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-6-6 18:35:06 | 显示全部楼层
本帖最后由 Jugeun_So 于 2017-6-6 18:36 编辑
超凡天赐 发表于 2017-6-6 16:58
你写的代码这么多语法错误。我知道你干什么的?


我只是没搞懂为什么我那个代码的方法体里的L要加*变成*L,其他哪有语法错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-6 22:22:10 | 显示全部楼层
Jugeun_So 发表于 2017-6-6 18:35
我只是没搞懂为什么我那个代码的方法体里的L要加*变成*L,其他哪有语法错误

我回答下你把 你的LinkList本身已经是指针类型了,但是这里函数定义是LinkList *L 指向指针的指针,为了获取原先指针的值就必须使用*解释指向指针的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-6 22:22:49 | 显示全部楼层
超凡天赐 发表于 2017-6-6 16:58
你写的代码这么多语法错误。我知道你干什么的?

哥们淡定点.新人难免有错误,谁都是这样过来的,有语法错误很正常,即使写代码多年也难免的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
超凡天赐 + 5 + 5 + 3 我知道了,以后要注意言辞

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-6 22:35:32 | 显示全部楼层
lumber2388779 发表于 2017-6-6 22:22
哥们淡定点.新人难免有错误,谁都是这样过来的,有语法错误很正常,即使写代码多年也难免的

好,我改一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-6 23:00:02 | 显示全部楼层

亲,刚刚言重了,sorry。我来说你第一处错误
  1. typedef struct Node
  2. {
  3.     int elem;
  4.     struct Node *next;
  5. }Node, *LinkList;
复制代码

这些你用了typedef进行替换,这里你写的Linklist其实是用来定义了一个结构体二维指针。所以你下面的代码
  1. L = (LinkList)malloc(sizeof(Node));
复制代码

malloc函数返回的只不过是一个一维指针,所以这里错了。
如果我们把Linklist前面的*去了。还是错,为什么?
  1. L = (LinkList)malloc(sizeof(Node))
复制代码

malloc返回了一个指针,我们要把它强制转化为Linklist指针类型,而不是Linklist类型。所以我们将它改为
  1. L = (LinkList *)malloc(sizeof(Node));
复制代码

但还是有错误,比如
  1. LinkList L = NULL;
复制代码

L是LinkList类型,怎么能赋值为NULL呢?所以我将你的改为
  1.     LinkList *L = NULL;
  2.     InitList(L);
复制代码

下面的取址符也给你去掉了。
还有你这段代码有个多余的Node,看下面你的代码,尽管你这些对,但不好:
  1. typedef struct Node
  2. {
  3.     int elem;
  4.     struct Node *next;
  5. }Node,LinkList;
复制代码

所以我讲你错的多,你不要生气。你就写了这几行代码,结果我都给你改完了。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.     int elem;
  6.     struct Node *next;
  7. }Node,LinkList;

  8. void InitList(LinkList *L)
  9. {
  10.     L = (LinkList *)malloc(sizeof(Node));
  11.     L->next = NULL;
  12. }

  13. int main()
  14. {
  15.     LinkList *L = NULL;
  16.     InitList(L);
  17.     return 0;
  18. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-7 14:38:10 | 显示全部楼层
很简单的一个事情。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-7 14:43:56 | 显示全部楼层
本帖最后由 Jugeun_So 于 2017-6-7 15:07 编辑
超凡天赐 发表于 2017-6-6 23:00
亲,刚刚言重了,sorry。我来说你第一处错误

这些你用了typedef进行替换,这里你写的Linklist其实是用 ...



朋友很感谢你能帮忙,但是,我对你改的代码有疑问

你这样传指针L进去,方法结束不是依旧没有建立到空链表吗?

你这样写相当于是值传递,方法结束后没有效果,要引用传递才行,意思就需要指针的指针。

不知道我这么说对不对

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

使用道具 举报

发表于 2017-6-7 16:49:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 超凡天赐 于 2017-6-7 16:52 编辑
Jugeun_So 发表于 2017-6-7 14:43
朋友很感谢你能帮忙,但是,我对你改的代码有疑问

你这样传指针L进去,方法结束不是依旧没有建立 ...


我民白你的意思了
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.     int elem;
  6.     struct Node *next;
  7. }Node,*LinkList;

  8. void InitList(LinkList *L)
  9. {
  10.     *L = (LinkList)malloc(sizeof(Node));
  11.     (*L)->next = NULL;
  12. }

  13. int main()
  14. {
  15.     LinkList L = NULL;
  16.     InitList(&L);
  17.     return 0;
  18. }
复制代码

改好了,改好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 00:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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