首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

新手写链表 不知道错在什么地方 `

2012-08-13 
新手写链表不知道错在什么地方求高手指教```#include stdio.h#include stdlib.hstruct slist{int data

新手写链表 不知道错在什么地方 求高手指教```
#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)

[解决办法]
struct slist{
int data;
struct slist *next;
}; //要加分号
h=(struct slist *)malloc(sizeof(struct slist)); //是指针
r->next ='\0'; //r->next = NULL;
就看出来这些,帮顶下
[解决办法]
1L说得对!
1.strust slist类型定义要以‘;’号结束。
2.h=(struct slist *)malloc(sizeof(struct slist)); 向头指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换
3.同上:s=(struct slist *)malloc(sizeof(struct slist)); 向s指针赋值的应该是指向结构的指针,要对malloc函数的返回值进行强制类型转换

[解决办法]
#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();

}

应该是对的
[解决办法]
3条error信息如1楼所说。
1条warning信息是因为main没返回值。
'\0'是专门判断字符串结尾的符号,不能用于其它场合。
[解决办法]
r->next ='\0';
指针判空是用null的
[解决办法]

C/C++ code
#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}

[解决办法]
按ASCII码的表述'\0'就是NULL就等于0x00…只是它是字符…用个强制转换就可以了…也不是不可以用…
[解决办法]
struct slist{
int data;
struct slist *next;
}没带分号
[解决办法]
两个错误,一个建议
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 ~
[解决办法]
两个错误,一个建议
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 ~
[解决办法]
还有一点:

 r->next ='\0';

\0 是判断字符串指针的时候用。链表用 NULL 。
[解决办法]
struct slist{
int data;
struct slist *next;
} 后面要加上;号
[解决办法]
关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约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、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

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

热点排行