| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1607 人关注过本帖
标题:[求助]学生成绩链表建立~
只看楼主 加入收藏
gioxiao
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-10-14
收藏
 问题点数:0 回复次数:12 
[求助]学生成绩链表建立~
#include "stdio.h"
#include "malloc.h"
typedef struct student
{
int num;
char name[9];
float score[3];
struct student *next;
}Lnode;
#define LEN sizeof(struct student)
typedef Lnode *Llist;
Lnode *jianli(void)
{
int i;
Lnode *head=(Lnode *)malloc(LEN);
Llist p,r;
r=head;
do
{
p=(Lnode *)malloc(LEN);
printf("请输入学号: ");
scanf("%d",&p->num);
if(p->num==0)
break;
printf("请输入姓名: ");
scanf("%s",p->name);
printf("请输入3门成绩\n");
for(i=0;i<3;i++)
{
printf("成绩: ");
scanf("%f",&p->score[i]);
}
r->next=p;
r=p;
printf("\n\n");
}while(p->num!=0);
r->next=NULL;
return head;
}
请问我这个链表输入三门成绩的写法有什么错误.....
为什么一到输入成绩的时候就弹出错误信息..
我换成了不用循环读入三门成绩,,也出了错..
但是
当我写成这样的时候:
printf("成绩1");
scanf("%f",&(p->score[0]));
就不出错了,但是我就写这一句,下面有句并没有把p->score[]用()框起来...
迷惑了....请大家指点指点..
搜索更多相关主题的帖子: 链表 学生 
2006-11-08 20:25
Music
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-11-9
收藏
得分:0 
看过就回你。。但是我不懂

﹥ 癫⒊倒⒋啲生萿﹎還會不會_洅í繼х續﹎﹖
2006-11-09 12:51
半滴风雨
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-10-6
收藏
得分:0 
scanf("%f',&(p->score[i]))
这样就可以了
p->score[i]相当于一个变量,这是一个整体得用括号括起
2006-11-09 13:08
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

首先纠正你一个致命问题:你 Lnode *head=(Lnode *)malloc(LEN);开辟第一个空间给head,但你没对它写入数据(num name score[0] score[1] score[2]);然后就是把score[3]类型改为int就可以,我也不知道float为什么不行,可能是编译器的原因,我把你的程序改了一下,可以运行,你对比你的看看

#include "stdio.h"
#include "malloc.h"
typedef struct student
{
int num;
char name[9];
int score[3];
struct student *next;
}Lnode;
#define LEN sizeof(struct student)
typedef Lnode *Llist;
Lnode *jianli(void)
{
int i;
Llist head=NULL;
Llist p,r;

do
{
p=(Lnode *)malloc(LEN);
printf("num: ");
scanf("%d",&p->num);

if(p->num==0)
break;
printf("name: ");
scanf("%s",p->name);
printf("3 scores:\n");
for(i=0;i<3;i++)
{
printf("score: ");
scanf("%d",&p->score[i]);
}
if(!head)
{head=p;r=head;}
else r->next=p;
r=p;
printf("\n\n");
}while(p->num!=0);
r->next=NULL;
return head;
}
main()
{
Llist head,p;
head=jianli();
p=head;
printf("\noutput data:\n");
while(p->num)
{
printf("%d %s %d %d %d\n",p->num,p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}
getch();
}


新王登基,血流成河!
2006-11-09 13:18
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
因为你jianli()返回的是head,所以要对它写入数据,不然你输入的是两组数据的话,它就会输出三组数据,第一
组数据是head的数据乱七八糟

新王登基,血流成河!
2006-11-09 13:24
gioxiao
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-10-14
收藏
得分:0 
先谢谢楼上的朋友..
HEAD=(Lnode *)malloc(LEN);
是开辟一个头结点.不是开辟第一个结点,
所以不用对他进行输入植.它只是储存第一结点的地址.
我现在疑惑的是&(p->score[i])...
2006-11-10 02:03
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
可你不对head输入值你干嘛返回head,难道你输出的时候不输出head的值?!那不是浪费空间吗
&(p->score[i])这个有什么问题吗?&p->score[i]也可以的啊

新王登基,血流成河!
2006-11-10 11:36
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
r=head;
......
r=p;

你先把head赋给r,在do的第一次循环里你又把p赋给r,所以真正的头结点应该是r了,head里没有你输入的数据,那何必开空间给它呢?

所以不用对他进行输入植.它只是储存第一结点的地址
它是存储链表第一个结点的地址,可是do第一次循环里你没有把值赋予第一个结点,因为
r->next=p;
r=p;
你这里只是把开辟的第二个结点的地址赋予r->next(即head->next),然后再把r对准p(第2结点),所以你并没有对第一结点赋予数据值,但是你又返回了head

新王登基,血流成河!
2006-11-10 11:49
gioxiao
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2006-10-14
收藏
得分:0 

我建立的这个链表完全没问题..只是在对成绩进行输入的时候产生错误.
并且现在已经没问题了..
至于头结点,当然不用输入植,我觉得它的用处就是让所有结点的处理变的一致..
比较方便...我先让R指针指向HEAD.当建立一个新的结点.就让R指针指向新结点.然后再建立下一个结点~
返回HEAD..是因为HEAD是头指针..我建立一个连表...不返回头指针怎么建立的了?

[此贴子已经被作者于2006-11-10 13:31:55编辑过]

2006-11-10 13:29
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
以下是引用gioxiao在2006-11-10 13:29:49的发言:

我建立的这个链表完全没问题..只是在对成绩进行输入的时候产生错误.
并且现在已经没问题了..
至于头结点,当然不用输入植,我觉得它的用处就是让所有结点的处理变的一致..
比较方便...我先让R指针指向HEAD.当建立一个新的结点.就让R指针指向新结点.然后再建立下一个结点~
返回HEAD..是因为HEAD是头指针..我建立一个连表...不返回头指针怎么建立的了?



我先让R指针指向HEAD.当建立一个新的结点.就让R指针指向新结点.

可是你的head就不指向你建立的新结点了啊,而是(head->next)指向你新开的这个结点


新王登基,血流成河!
2006-11-10 13:38
快速回复:[求助]学生成绩链表建立~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037985 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved