519608127@qq.co 发表于 2022-9-15 23:40:56

单链表头插法建立链表,参数无法传递

我看到教材上的写法,把它写下来准备执行,但是报错“存在正文时不允许存在未命名的原型参数”
typedef struct LNode {      
    int data;            
    struct LNode *next;      
}LNode, *LinkList;

void List_HeadInsert(LinkList &L) {
    L = (LinkList)malloc(sizeof(LNode));   
    L->data = 1;
    L->next = NULL;   
}

这里参数提示存在正文时不允许存在未命名的原型参数,无法执行,求助大神,这个是什么原因?

jackz007 发表于 2022-9-16 00:03:57

      我用 tdm-gcc 5.1.0 可以成功编译,但是,用 VC6 无法编译,估计是编译器版本问题(不支持参数引用)。

howzyao 发表于 2022-9-16 08:14:37

LinkList &L

struct LNode

L的成员不知道是什么,和LNode不是同一类型,函数无法工作

howzyao 发表于 2022-9-16 08:16:27

L = (LinkList)malloc(sizeof(LNode));
另外,这个返回的,只能是void*类型的地址,但这个地址无法被转换成类型,只能转换成(Linklist*) 如果你有LinkList struct的话,才行.

howzyao 发表于 2022-9-16 08:36:25

L = (LinkList)malloc(sizeof(LNode));
我看掉了,你有 LinkList* 的类型,但是,即使是这样,它定义出来的会是 一个 指针的 指针:
LinkList p; p指向LinkList这个指针类型,而不是LNode结构,而此时的LNode结构中的成员都是未初始化的,一访问,就会"内存泄露",报错退出.

519608127@qq.co 发表于 2022-9-16 10:40:04

jackz007 发表于 2022-9-16 00:03
我用 tdm-gcc 5.1.0 可以成功编译,但是,用 VC6 无法编译,估计是编译器版本问题(不支持参数引用 ...

谢谢

519608127@qq.co 发表于 2022-9-16 10:44:14

howzyao 发表于 2022-9-16 08:36
L = (LinkList)malloc(sizeof(LNode));
我看掉了,你有 LinkList* 的类型,但是,即使是这样,它定义出来的会 ...

对,LinkList*应该是个指向结构体的指针,我想给他初始化一个头节点出来。

我想在main函数中声明
LinkList p;

然后这样调用
List_HeadInsert(&p);

但是执行不了
教材里只写了这个初始化List_HeadInsert方法,不知道他怎么调用的,感觉他这个很别扭,执行不了就很难理解。

LinkList List_HeadInsert(LinkList &L) {
    LNode *s; int x;
    L = (LinkList)malloc(sizeof(LNode));   // 创建头结点
    L->next = NULL;                              // 初始空链表
    scanf("%d", &x);
    while(x != 9999) {
      s = (LNode*)malloc(sizeof(LNode));
      s->data = x;
      s->next = L->next;                  // 将新结点指针指向之前的首个结点
      L->next = s;                     // 将新结点插入表中,L为头指针
      scanf("%d", &x);
    }
    return L;
}

howzyao 发表于 2022-9-16 10:48:24

这是经典链表的"入队"算法。
可以不用抄书。
你这个,去掉指针类定义,只用结构类定义即可。
因为有了结构,就能直接定义出结构的指针,或者指针数组,还方便些。

howzyao 发表于 2022-9-16 10:51:06

再配合这个算法,就能实现入队。记得还有一个"出队"的方法,也是和这个差不多。总之,这一对"出入队"方法,无论怎么做,是需要时刻调整"尾部"的指向的。
这个算法适应,仅仅对应 先进先出 的情况。

howzyao 发表于 2022-9-16 10:53:33

最后忘了说一下,你怎么不用写这个结构的
默认的构造函数
和析构函数?
只有定义了默认的构造函数,才能实现所有成员的初始化,进而才可以声明指针数组。这也是我刚刚学到的

人造人 发表于 2022-9-16 12:52:47

请先搞清楚你学的是C语言还是C++

howzyao 发表于 2022-9-16 14:41:49

搞清楚你学的是C语言还是C++

这个区别,能学到吗?

我想我要是真学到了,不就知道了吗?
实话实说,到现在,我也不知道如何理解,讲,说出,它们的区别.只有一个感觉,它们差不多,都能写:int a=1; int b={1,2};等等一样的格式.
你大致说一下它们的区别,让我学习一下.谢谢.

dolly_yos2 发表于 2022-9-16 16:45:37

howzyao 发表于 2022-9-16 14:41
这个区别,能学到吗?

我想我要是真学到了,不就知道了吗?


参考标准 一节,这里给出了很多 C++ 与 ISO C 的区别。举其中被认为很常用(普遍)的几个为例:

[*]C++ 添加了大量的新关键字
[*]C++ 的类型相容性规则比 C 更严格,很多在 C 中被认为相容的类型在 C++ 中不再相容
[*]C++ 禁止函数的隐式声明
[*]register 在 C++ 中不再作为存储类别
[*]C++ 禁止隐式声明为 int 类型
[*]C++ 中,函数声明中的空形参列表表示函数不接收参数,而不是 C 中的接收未指定个数的参数
[*]C++ 的枚举类型只能被赋值为同一枚举类型中的值,而 C 中则可以被赋值为任意整数类型

以上只是所有区别的九牛一毛,更多的区别和区别的详细信息都可以在标准中查找。

howzyao 发表于 2022-9-16 18:40:22

嗯,好,谢谢普法教育,学习了!

519608127@qq.co 发表于 2022-9-16 21:54:56

howzyao 发表于 2022-9-16 10:53
最后忘了说一下,你怎么不用写这个结构的
默认的构造函数
和析构函数?


多谢了!我也觉得不用抄书,我感觉结构那不用定义指针,直接用LNode去初始化更好
但是又想知道书上这个为什么要这样写,感觉有点让人更难理解。

519608127@qq.co 发表于 2022-9-16 21:56:41

人造人 发表于 2022-9-16 12:52
请先搞清楚你学的是C语言还是C++

C,意思是这个例子用的C++的语法吗

人造人 发表于 2022-9-16 22:03:04

519608127@qq.co 发表于 2022-9-16 21:56
C,意思是这个例子用的C++的语法吗

是的

519608127@qq.co 发表于 2022-9-16 22:03:40

知道了,这个好像是C++的语法,谢谢各位!

typedef struct LNode{        //定义单链表结点类型
        ElemType data;                //每个结点存放一个数据元素
        struct LNode *next; //指针指向下一个结点
}LNode,*LinkList;
//LNode *和LinkList的意思是一样的,前者侧重结点,后者侧重链表

//初始化一个单链表
bool InitList(LinkList &L){        //&表示间接访问,和c语言使用二级指针同理
        L=(LNode *)malloc(sizeof(LNode);        //分配一个头结点
        if(L==NULL)        return false;                        //内存不足,分配失败
        L->next=NULL;                        //头结点之后暂时还没有节点,赋值为NULL是好习惯
        return true;
}

dolly_yos2 发表于 2022-9-17 09:39:01

howzyao 发表于 2022-9-16 18:40
嗯,好,谢谢普法教育,学习了!

我自作多情的以为一下这是在回复我之前的回复。
普法教育,哈哈,我还蛮喜欢这个名字的。可能有些人会觉得这种东西是远离现实没有什么意义的,但在细节上,在面对某种方式究竟是否可行或可靠或者某个术语的准确含义一类的问题时,又必须诉诸标准。感谢您捧场。
(如果您没在回复我先前的回复,非常抱歉打扰到您了;如果确实是回复的话,给您一个小小的建议:通过对应回复下方的“回复”按钮进行回复才能给您回复的人通知/提示)

howzyao 发表于 2022-9-17 11:35:17

通过对应回复下方的“回复”按钮进行回复才能给您回复的人通知/提示

感谢啊.之前还真不知道,总是直接看完后,到最下面,输入,点的"发表回复".很高兴认识你.
页: [1] 2
查看完整版本: 单链表头插法建立链表,参数无法传递