Jugeun_So 发表于 2017-6-5 16:35:09

数据结构建立空链表问题

如图,按照课件教学,建立空链表代码报错,但是从网上网友写的代码拿去编译却能通过,所以到底哪个是对的,没搞懂加*和不加*到底具体区别在哪

SmallDream 发表于 2017-6-5 17:31:36

你那个Linklist 本来就是一个指针了,在Linklist函数中传递参数仍然用L->next,明显错了,L->next相当于二级指针了,这时必须还是用(*L) 来才可以,不然传参数的时候就用L,就不要用*L。

超凡天赐 发表于 2017-6-5 18:56:25

贴代码

Jugeun_So 发表于 2017-6-5 20:43:49

超凡天赐 发表于 2017-6-5 18:56
贴代码

代码都在图里

超凡天赐 发表于 2017-6-5 20:45:50

Jugeun_So 发表于 2017-6-5 20:43
代码都在图里

问问题是一定要注意,没有人给你一个一个输

Jugeun_So 发表于 2017-6-5 20:46:08

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

如果参数是L,那不就是值传递吗,值传递方法结束后没有用啊,要引用传递必须得*L

Jugeun_So 发表于 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);
}


谢谢提醒,代码复制下来了

超凡天赐 发表于 2017-6-5 22:28:18

Jugeun_So 发表于 2017-6-5 20:55
#include
#include



#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    int elem;
    struct Node *next;
   
}Node;
void InitList(Node *L)
{
    L = (Node *)malloc(sizeof(Node));
    L->next = NULL;
}

int main()
{
    Node *L = NULL;
    InitList(L);
    return 0;
}
加*就是指针,不加就不是指针。有什么不会的再问。

Jugeun_So 发表于 2017-6-6 13:01:35

超凡天赐 发表于 2017-6-5 22:28
加*就是指针,不加就不是指针。有什么不会的再问。

你这不是值传递吗,建立空链表不是要引用传递才行?不然方法结束没有效果

超凡天赐 发表于 2017-6-6 16:58:22

本帖最后由 超凡天赐 于 2017-6-6 22:36 编辑

Jugeun_So 发表于 2017-6-6 13:01
你这不是值传递吗,建立空链表不是要引用传递才行?不然方法结束没有效果

亲,你写的代码有一些语法错误。我不知道你说的什么意思?

Jugeun_So 发表于 2017-6-6 18:35:06

本帖最后由 Jugeun_So 于 2017-6-6 18:36 编辑

超凡天赐 发表于 2017-6-6 16:58
你写的代码这么多语法错误。我知道你干什么的?

我只是没搞懂为什么我那个代码的方法体里的L要加*变成*L,其他哪有语法错误

lumber2388779 发表于 2017-6-6 22:22:10

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

我回答下你把 你的LinkList本身已经是指针类型了,但是这里函数定义是LinkList *L 指向指针的指针,为了获取原先指针的值就必须使用*解释指向指针的指针

lumber2388779 发表于 2017-6-6 22:22:49

超凡天赐 发表于 2017-6-6 16:58
你写的代码这么多语法错误。我知道你干什么的?

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

超凡天赐 发表于 2017-6-6 22:35:32

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

好,我改一下

超凡天赐 发表于 2017-6-6 23:00:02

Jugeun_So 发表于 2017-6-5 20:55
#include
#include



亲,刚刚言重了,sorry。我来说你第一处错误
typedef struct Node
{
    int elem;
    struct Node *next;
}Node, *LinkList;
这些你用了typedef进行替换,这里你写的Linklist其实是用来定义了一个结构体二维指针。所以你下面的代码
L = (LinkList)malloc(sizeof(Node));
malloc函数返回的只不过是一个一维指针,所以这里错了。
如果我们把Linklist前面的*去了。还是错,为什么?
L = (LinkList)malloc(sizeof(Node))
malloc返回了一个指针,我们要把它强制转化为Linklist指针类型,而不是Linklist类型。所以我们将它改为
L = (LinkList *)malloc(sizeof(Node));
但还是有错误,比如
LinkList L = NULL;
L是LinkList类型,怎么能赋值为NULL呢?所以我将你的改为
    LinkList *L = NULL;
    InitList(L);
下面的取址符也给你去掉了。
还有你这段代码有个多余的Node,看下面你的代码,尽管你这些对,但不好:
typedef struct Node
{
    int elem;
    struct Node *next;
}Node,LinkList;
所以我讲你错的多,你不要生气。你就写了这几行代码,结果我都给你改完了。
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int elem;
    struct Node *next;
}Node,LinkList;

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

int main()
{
    LinkList *L = NULL;
    InitList(L);
    return 0;
}


SmallDream 发表于 2017-6-7 14:38:10

很简单的一个事情。

Jugeun_So 发表于 2017-6-7 14:43:56

本帖最后由 Jugeun_So 于 2017-6-7 15:07 编辑

超凡天赐 发表于 2017-6-6 23:00
亲,刚刚言重了,sorry。我来说你第一处错误

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


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

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

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

不知道我这么说对不对

超凡天赐 发表于 2017-6-7 16:49:26

本帖最后由 超凡天赐 于 2017-6-7 16:52 编辑

Jugeun_So 发表于 2017-6-7 14:43
朋友很感谢你能帮忙,但是,我对你改的代码有疑问

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

我民白你的意思了{:10_266:}
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int elem;
    struct Node *next;
}Node,*LinkList;

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

int main()
{
    LinkList L = NULL;
    InitList(&L);
    return 0;
}
改好了,改好了。{:10_298:}
页: [1]
查看完整版本: 数据结构建立空链表问题