新手写链表 不知道错在什么地方 求高手指教```

时间:2023-01-09 16:14:41
#include <stdio.h>
#include <stdlib.h>
struct slist{
int data;
struct slist *next;
}
struct slist *create_slist()
{
int c;
struct slist *s,*h,*r;
h=(struct slist)malloc(sizeof(struct slist));
r=h;
scanf("%d",&c);
while(c!=-1)
{
s=(struct slist)malloc(sizeof(struct slist));
s->data=c;r->next=s;r=s;
scanf("%d",&c);
}
r->next ='\0';
return h;
}

main()
{
struct slist *head;
head=create_slist();

}





--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(7) : error C2236: unexpected 'struct' 'slist'
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(11) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
        No constructor could take the source type, or constructor overload resolution was ambiguous
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(16) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
        No constructor could take the source type, or constructor overload resolution was ambiguous
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(29) : warning C4508: 'main' : function should return a value; 'void' return type assumed
执行 cl.exe 时出错.

Cpp1.obj - 1 error(s), 0 warning(s)

22 个解决方案

#1


struct slist{
int data;
struct slist *next;
}; //要加分号
h=(struct slist *)malloc(sizeof(struct slist)); //是指针
r->next ='\0'; //r->next = NULL;
就看出来这些,帮顶下

#2


1L说得对!
1.strust slist类型定义要以‘;’号结束。
2.h=(struct slist *)malloc(sizeof(struct slist)); 向头指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换
3.同上:s=(struct slist *)malloc(sizeof(struct slist)); 向s指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换

#3


#include <stdio.h>
#include <stdlib.h>
struct slist{
int data;
struct slist *next;
};

struct slist *create_slist()
{
int c;
struct slist *s,*h,*r;
h=(struct slist*)malloc(sizeof(struct slist));
r=h;
r->next=NULL;
scanf("%d",&c);
while(c!=-1)
{
s=(struct slist*)malloc(sizeof(struct slist));
s->data=c;
s->next=r->next;
r->next=s;
scanf("%d",&c);
}

return h;
}

main()
{
struct slist *head;
head=create_slist();

}

应该是对的

#4


没有加分号。

#5


3条error信息如1楼所说。
1条warning信息是因为main没返回值。
'\0'是专门判断字符串结尾的符号,不能用于其它场合。

#6


r->next ='\0';
指针判空是用null的

#7



#include <stdio.h>
#include <stdlib.h>
struct slist{
int data;
struct slist *next;
};     //这里要加分号
struct slist *create_slist()
{
  int c;
  struct slist *s,*h,*r;
  h=(struct slist*)malloc(sizeof(struct slist));//转换为指针struct slist*,注意*号
  r=h;
  scanf("%d",&c);
  while(c!=-1)
  {
    s=(struct slist)malloc(sizeof(struct slist));));//转换为指针struct slist*,注意*号
    s->data=c;r->next=s;r=s;
    scanf("%d",&c);
  }
  r->next ='\0';
  return h;
}

int main()  //返回值写int,这样习惯比较好
{
  struct slist *head;
  head=create_slist();
  return 0;  //返回0
}


#8


引用 1 楼  的回复:
struct slist{
int data;
struct slist *next;
}; //要加分号
h=(struct slist *)malloc(sizeof(struct slist)); //是指针
r->next ='\0'; //r->next = NULL;
就看出来这些,帮顶下


要加分号

#9


h=(struct slist)malloc(sizeof(struct slist));
s=(struct slist)malloc(sizeof(struct slist));

#10


按ASCII码的表述'\0'就是NULL就等于0x00…只是它是字符…用个强制转换就可以了…也不是不可以用…

#11


楼上说完了

#12


struct slist{
int data;
struct slist *next;
}没带分号

#13


楼上  都说了  顺便提一下  NULL一定要大写 小写会报错

#14


再教你一个   发代码的时候在编辑框上有一个文件上面带个#  点一下
code=C/C++]  
把代码写在中间好看
[/code    

#include<stdio.>
int main()
{
    return 0;
}
别人看着容易  代码加点注释    有满意答案要知道结贴  在标题的左上方  就这些了

#15


编译没有错误 连接的时候出现这个问题怎么回事???

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Linking...
Cpp1.obj : error LNK2001: unresolved external symbol "void * __cdecl malloc(unsigned int)" (?malloc@@YAPAXI@Z)
Debug/Cpp1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

Cpp1.exe - 1 error(s), 0 warning(s)

#16


试着加注释
错误就好找多了

#17


两个错误,一个建议
1.定义结构体的时候 结尾 没有分号。即:
struct slist{
int data;
struct slist *next;
};  //这里

2.创建新节点分配内存空间的时候,类型应该为指向结构体的指针类型。验证了报错:
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(16) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
h=(struct slist *)malloc(sizeof(struct slist));

3.建议,用 typedef  定义下结构体,可以省事多了。
typedef struct slist
{
  ......
}NEW_NODE;
后面都用 NEW_NODE ~

#18


两个错误,一个建议
1.定义结构体的时候 结尾 没有分号。即:
struct slist{
int data;
struct slist *next;
};  //这里

2.创建新节点分配内存空间的时候,类型应该为指向结构体的指针类型。验证了报错:
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(16) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
h=(struct slist *)malloc(sizeof(struct slist));

3.建议,用 typedef  定义下结构体,可以省事多了。
typedef struct slist
{
  ......
}NEW_NODE;
后面都用 NEW_NODE ~

#19


还有一点:

 r->next ='\0';

\0  是判断字符串指针的时候用。链表用 NULL 。

#20


都是一些基本的错误,细心一点就好了。

#21


struct slist{
int data;
struct slist *next;
}  后面要加上;号

#22


关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源 http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

内存地址→指针→链表
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!

#1


struct slist{
int data;
struct slist *next;
}; //要加分号
h=(struct slist *)malloc(sizeof(struct slist)); //是指针
r->next ='\0'; //r->next = NULL;
就看出来这些,帮顶下

#2


1L说得对!
1.strust slist类型定义要以‘;’号结束。
2.h=(struct slist *)malloc(sizeof(struct slist)); 向头指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换
3.同上:s=(struct slist *)malloc(sizeof(struct slist)); 向s指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换

#3


#include <stdio.h>
#include <stdlib.h>
struct slist{
int data;
struct slist *next;
};

struct slist *create_slist()
{
int c;
struct slist *s,*h,*r;
h=(struct slist*)malloc(sizeof(struct slist));
r=h;
r->next=NULL;
scanf("%d",&c);
while(c!=-1)
{
s=(struct slist*)malloc(sizeof(struct slist));
s->data=c;
s->next=r->next;
r->next=s;
scanf("%d",&c);
}

return h;
}

main()
{
struct slist *head;
head=create_slist();

}

应该是对的

#4


没有加分号。

#5


3条error信息如1楼所说。
1条warning信息是因为main没返回值。
'\0'是专门判断字符串结尾的符号,不能用于其它场合。

#6


r->next ='\0';
指针判空是用null的

#7



#include <stdio.h>
#include <stdlib.h>
struct slist{
int data;
struct slist *next;
};     //这里要加分号
struct slist *create_slist()
{
  int c;
  struct slist *s,*h,*r;
  h=(struct slist*)malloc(sizeof(struct slist));//转换为指针struct slist*,注意*号
  r=h;
  scanf("%d",&c);
  while(c!=-1)
  {
    s=(struct slist)malloc(sizeof(struct slist));));//转换为指针struct slist*,注意*号
    s->data=c;r->next=s;r=s;
    scanf("%d",&c);
  }
  r->next ='\0';
  return h;
}

int main()  //返回值写int,这样习惯比较好
{
  struct slist *head;
  head=create_slist();
  return 0;  //返回0
}


#8


引用 1 楼  的回复:
struct slist{
int data;
struct slist *next;
}; //要加分号
h=(struct slist *)malloc(sizeof(struct slist)); //是指针
r->next ='\0'; //r->next = NULL;
就看出来这些,帮顶下


要加分号

#9


h=(struct slist)malloc(sizeof(struct slist));
s=(struct slist)malloc(sizeof(struct slist));

#10


按ASCII码的表述'\0'就是NULL就等于0x00…只是它是字符…用个强制转换就可以了…也不是不可以用…

#11


楼上说完了

#12


struct slist{
int data;
struct slist *next;
}没带分号

#13


楼上  都说了  顺便提一下  NULL一定要大写 小写会报错

#14


再教你一个   发代码的时候在编辑框上有一个文件上面带个#  点一下
code=C/C++]  
把代码写在中间好看
[/code    

#include<stdio.>
int main()
{
    return 0;
}
别人看着容易  代码加点注释    有满意答案要知道结贴  在标题的左上方  就这些了

#15


编译没有错误 连接的时候出现这个问题怎么回事???

--------------------Configuration: Cpp1 - Win32 Debug--------------------
Linking...
Cpp1.obj : error LNK2001: unresolved external symbol "void * __cdecl malloc(unsigned int)" (?malloc@@YAPAXI@Z)
Debug/Cpp1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

Cpp1.exe - 1 error(s), 0 warning(s)

#16


试着加注释
错误就好找多了

#17


两个错误,一个建议
1.定义结构体的时候 结尾 没有分号。即:
struct slist{
int data;
struct slist *next;
};  //这里

2.创建新节点分配内存空间的时候,类型应该为指向结构体的指针类型。验证了报错:
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(16) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
h=(struct slist *)malloc(sizeof(struct slist));

3.建议,用 typedef  定义下结构体,可以省事多了。
typedef struct slist
{
  ......
}NEW_NODE;
后面都用 NEW_NODE ~

#18


两个错误,一个建议
1.定义结构体的时候 结尾 没有分号。即:
struct slist{
int data;
struct slist *next;
};  //这里

2.创建新节点分配内存空间的时候,类型应该为指向结构体的指针类型。验证了报错:
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(16) : error C2440: 'type cast' : cannot convert from 'void *' to 'struct slist'
h=(struct slist *)malloc(sizeof(struct slist));

3.建议,用 typedef  定义下结构体,可以省事多了。
typedef struct slist
{
  ......
}NEW_NODE;
后面都用 NEW_NODE ~

#19


还有一点:

 r->next ='\0';

\0  是判断字符串指针的时候用。链表用 NULL 。

#20


都是一些基本的错误,细心一点就好了。

#21


struct slist{
int data;
struct slist *next;
}  后面要加上;号

#22


关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源 http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

内存地址→指针→链表
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

不要写连自己也预测不了结果的代码!