user-0 提问: 关于链表的一个问题，请求各位大神解答

回复:
user: user-1
content: scanf函数返回成功读入的数据项数，给p->data=k;应该就没问题了

user: user-2
content: 我以前学C语言的时候也是 都照书抄代码，编译的时候报错就懵逼了，真的要好好弄懂原理才行

user: user-3
content: tem->next=p; tem=p; 的意思是把链表指向下一个节点，为存下一组数据做好准备，若还有数据，则将数据存进去，若数据已经存完了，则为链表的最后一个节点的->next写上NULL, 表示此链表已经结束！

user: user-4
content: 循环打印时 指针没有移动当然.打印的值一样了.

user: user-5
content: 放进去就是这样 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再指向下一个链节  循环...... 我其实也不知道该怎么解释

user: user-0
content: 引用 12 楼 赵4老师 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633好的，老师。正在学习您的代码

user: user-0
content: 引用 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; 这两步操作该怎么理解。请求解答

user: user-5
content: 首先不是这样遍历的（你这个少了指向下一个链节的操作） 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;  就是这三处错误了

user: user-6
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 2l是图片~~

user: user-0

user: user-5

user: user-5
content: 解决了，自己对比一下吧.....

user: user-5
content: #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; }

user: user-0
content: 引用 7 楼 qq_43293301 的回复:根据我以前惨痛的教训，个人感觉最好不要抄代码，先了解工作原理，有毛病了自己先试着调试，这样才能进步。现在很多c语言的书都有很大的应试成分，看了帮助不大，最好选择一些能够帮你学习原理和思路的书。加油↖(^ω^)↗ 好吧 ，谢谢啦

user: user-7
content: 能不能把你真正的代码截屏发过来，你的运算结果唯一合理的解释就是问题一和问题三，而这些是建立在问题二不成立的情况上的，因为如果你的代码真的如你发的那样的话，data得到的值就是scanf成功读取的个数(可以百度scanf返回值)，那输出data的时候就不会输出一个这样的垃圾值(因为data=后是scanf的返回值)，这只是我的推理，可能有不妥之处。但希望能帮到你。

user: user-7
content: sorry,手抖了。在循环里使用printf的时候，打印3次明明都是同一个值啊，看代码就知道了。这个只能改算法。第二处，在list函数里使用scanf赋值是怎么回事？你可以上百度查一下就会发现，scanf的返回值不是你想的那样。第三处，使用scanf为三个变量读取错误，在第一次输入n后缓冲区会留下一个\n字符，第二次读取真正的数据时会优先读取换行符，而scanf读取整数时会把这个字符读取。这就导致读取错误，因此第一个数据得到的就是一个垃圾值(任意值)，而你连续三次打印的就是第一个值，所以输出了三个没有意义的值

user: user-7
content: 代码有至少3处错误。第一处:main函数里，在一个for循环里用

user: user-7
content: 根据我以前惨痛的教训，个人感觉最好不要抄代码，先了解工作原理，有毛病了自己先试着调试，这样才能进步。现在很多c语言的书都有很大的应试成分，看了帮助不大，最好选择一些能够帮你学习原理和思路的书。加油↖(^ω^)↗

user: user-0
content: 引用 5 楼 qq_43293301 的回复:能不能把你真正的代码截屏发过来，你的运算结果唯一合理的解释就是问题一和问题三，而这些是建立在问题二不成立的情况上的，因为如果你的代码真的如你发的那样的话，data得到的值就是scanf成功读取的个数(可以百度scanf返回值)，那输出data的时候就不会输出一个这样的垃圾值(因为data=后是scanf的返回值)，这只是我的推理，可能有不妥之处。但希望能帮到你。 额，我的代码截屏： 我是百度了一些链表的创建例子，然后自己码上去。