关于链表的一个问题,请求各位大神解答

鱼酥不是叔 2019-02-17 12:34:02
#include<stdio.h>
#include<stdlib.h>
typedef struct nodelist
{
int data;
struct nodelist* next;
}node;
node* list(int n);
int main
{
int n,i;
node *list1;
scanf("%d",&n);
list1=list(n);
for(i=0;i<n;i++)
{
printf("%d\n",list1->data);
}
return 0;
}
node* list(int n)
{
node *head;
node *p,*tem;
int i,k;
head=(node *)malloc(sizeof(node));
head->next=NULL;
tem=head;
for(i=0;i<n;i++)
{
p=(node *)malloc(sizeof(node));
p->data=scanf("%d",&k);
tem->next=p;
tem=p;
}
p->next=NULL;
return head;
}
上面是本人编的链表代码,编译后无错误,也可以正常输入,但是最后输出的数据为下面图例显示


求大神解答啊啊,谢谢!!!
...全文
987 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
scanf函数返回成功读入的数据项数,给p->data=k;应该就没问题了
Madison Lau 2019-02-19
  • 打赏
  • 举报
回复
我以前学C语言的时候也是 都照书抄代码,编译的时候报错就懵逼了,真的要好好弄懂原理才行
  • 打赏
  • 举报
回复
tem->next=p;
tem=p;
的意思是把链表指向下一个节点,为存下一组数据做好准备,若还有数据,则将数据存进去,若数据已经存完了,则为链表的最后一个节点的->next写上NULL, 表示此链表已经结束!
cslpct 2019-02-18
  • 打赏
  • 举报
回复
循环打印时 指针没有移动当然.打印的值一样了.
名字在哪啊 2019-02-18
  • 打赏
  • 举报
回复
放进去就是这样
node *list(int n)
{
node *head;
node *p,*tem;
int i,k;
head=(node *)malloc(sizeof(node));
head->next=NULL;
tem=head;
int j=0;
for(i=0; i<n; i++)
{
scanf("%d",&k);
if(j==0)
{
head->data=k;
j=1;
}
else
{
p=(node *)malloc(sizeof(node));
p->data=k;
tem->next=p;
tem=p;
}
}
p->next=NULL;
return head;
}
至于
tem->next=p;
tem=p;
tem一开始指向链表头,将值赋给p之后,让tem的next指针指向p也就是下一个链节
tem再指向下一个链节

循环......
我其实也不知道该怎么解释
鱼酥不是叔 2019-02-18
  • 打赏
  • 举报
回复
引用 12 楼 赵4老师 的回复:
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
好的,老师。正在学习您的代码
鱼酥不是叔 2019-02-18
  • 打赏
  • 举报
回复
引用 13 楼 或✘许✔吧 的回复:
首先不是这样遍历的(你这个少了指向下一个链节的操作)
for(i=0; i<n; i++)
{
printf("%d\n",list1->data);
}
应该是
for(i=0; i<n; i++)
{
printf("%d\n",list1->data);
list1=list1->next;
}
或者
while(list1!=NULL)
{
printf("%d\n",list1->data);
list1=list1->next;
}
其次
你的链表头没有给入值

还有就是p->data=scanf("%d",&k);最好别这样用

有时候会出错

后面循环这里改成
scanf("%d",&k);
p->data=k;

就是这三处错误了

好的,非常感谢!请问要是想把给链表头赋值这部操作放进循环该怎么改进,还有
tem->next=p;
tem=p;
这两步操作该怎么理解。请求解答
名字在哪啊 2019-02-18
  • 打赏
  • 举报
回复
首先不是这样遍历的(你这个少了指向下一个链节的操作)
for(i=0; i<n; i++)
{
printf("%d\n",list1->data);
}
应该是
for(i=0; i<n; i++)
{
printf("%d\n",list1->data);
list1=list1->next;
}
或者
while(list1!=NULL)
{
printf("%d\n",list1->data);
list1=list1->next;
}
其次
你的链表头没有给入值

还有就是p->data=scanf("%d",&k);最好别这样用

有时候会出错

后面循环这里改成
scanf("%d",&k);
p->data=k;

就是这三处错误了
赵4老师 2019-02-18
  • 打赏
  • 举报
回复
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
鱼酥不是叔 2019-02-17
  • 打赏
  • 举报
回复
2l是图片~~
鱼酥不是叔 2019-02-17
  • 打赏
  • 举报
回复
名字在哪啊 2019-02-17
  • 打赏
  • 举报
回复
名字在哪啊 2019-02-17
  • 打赏
  • 举报
回复
解决了,自己对比一下吧.....
名字在哪啊 2019-02-17
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
typedef struct nodelist
{
int data;
struct nodelist* next;
} node;
node *list(int n);
int main()
{
int n,i;
node *list1;
scanf("%d",&n);
list1=list(n);
/*for(i=0; i<n; i++)
{
printf("%d\n",list1->data);
list1=list1->next;
}*/
while(list1!=NULL)
{
printf("%d\n",list1->data);
list1=list1->next;
}
return 0;
}
node *list(int n)
{
node *head;
node *p,*tem;
int i,k;
head=(node *)malloc(sizeof(node));
head->next=NULL;
scanf("%d",&k);
head->data=k;
tem=head;
for(i=0; i<n-1; i++)
{
p=(node *)malloc(sizeof(node));
scanf("%d",&k);
p->data=k;
tem->next=p;
tem=p;
}
p->next=NULL;
return head;
}
鱼酥不是叔 2019-02-17
  • 打赏
  • 举报
回复
引用 7 楼 qq_43293301 的回复:
根据我以前惨痛的教训,个人感觉最好不要抄代码,先了解工作原理,有毛病了自己先试着调试,这样才能进步。现在很多c语言的书都有很大的应试成分,看了帮助不大,最好选择一些能够帮你学习原理和思路的书。加油↖(^ω^)↗

好吧 ,谢谢啦
(@_@) ? 2019-02-17
  • 打赏
  • 举报
回复
能不能把你真正的代码截屏发过来,你的运算结果唯一合理的解释就是问题一和问题三,而这些是建立在问题二不成立的情况上的,因为如果你的代码真的如你发的那样的话,data得到的值就是scanf成功读取的个数(可以百度scanf返回值),那输出data的时候就不会输出一个这样的垃圾值(因为data=后是scanf的返回值),这只是我的推理,可能有不妥之处。但希望能帮到你。
(@_@) ? 2019-02-17
  • 打赏
  • 举报
回复
sorry,手抖了。在循环里使用printf的时候,打印3次明明都是同一个值啊,看代码就知道了。这个只能改算法。第二处,在list函数里使用scanf赋值是怎么回事?你可以上百度查一下就会发现,scanf的返回值不是你想的那样。第三处,使用scanf为三个变量读取错误,在第一次输入n后缓冲区会留下一个\n字符,第二次读取真正的数据时会优先读取换行符,而scanf读取整数时会把这个字符读取。这就导致读取错误,因此第一个数据得到的就是一个垃圾值(任意值),而你连续三次打印的就是第一个值,所以输出了三个没有意义的值
(@_@) ? 2019-02-17
  • 打赏
  • 举报
回复
代码有至少3处错误。第一处:main函数里,在一个for循环里用
(@_@) ? 2019-02-17
  • 打赏
  • 举报
回复
根据我以前惨痛的教训,个人感觉最好不要抄代码,先了解工作原理,有毛病了自己先试着调试,这样才能进步。现在很多c语言的书都有很大的应试成分,看了帮助不大,最好选择一些能够帮你学习原理和思路的书。加油↖(^ω^)↗
鱼酥不是叔 2019-02-17
  • 打赏
  • 举报
回复
引用 5 楼 qq_43293301 的回复:
能不能把你真正的代码截屏发过来,你的运算结果唯一合理的解释就是问题一和问题三,而这些是建立在问题二不成立的情况上的,因为如果你的代码真的如你发的那样的话,data得到的值就是scanf成功读取的个数(可以百度scanf返回值),那输出data的时候就不会输出一个这样的垃圾值(因为data=后是scanf的返回值),这只是我的推理,可能有不妥之处。但希望能帮到你。

额,我的代码截屏:
我是百度了一些链表的创建例子,然后自己码上去。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧