c语言链表输入问题

我想输入3个学生数据到student中,包括学号,姓名,3门成绩,但是用链表时,运行只能输入学号,姓名,输入成绩时出现问题,无法输入,直接进入下次循环,也无法输入了,请高... 我想输入3个学生数据到student中,包括学号,姓名,3门成绩,但是用链表时,运行只能输入学号,姓名,输入成绩时出现问题,无法输入,直接进入下次循环,也无法输入了,请高手指教。前面是菜单函数,应该包括五个功能,我还没写完,不必理会。
#include<stdio.h>
#include<stdlib.h>

void menu()
{
printf("MENU\n");
printf("0.输入\n");
printf("1.显示\n");
printf("2.删除\n");
printf("3.查找\n");
printf("4.插入\n");
}
struct student
{
int i;
char no[11]; /*学号由10个字符组成*/
char name[15]; /* 学生姓名*/
int score[3]; /*各门课成绩*/
float sum; /*总分*/
float average; /*平均分*/
int order; /*名次*/
struct student *next; /*指向后继结点的指针*/
};
struct student *p,*head;
void input()
{int i,n;
head=(struct student*)malloc(sizeof(struct student));
p=head;
printf("请输入数据个数");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学生学号\n");
scanf("%d",p->no);
printf("请输入学生姓名\n");
scanf("%c\n",p->name);
printf("请输入学生成绩\n");
for(i=0;i<3;i++)
scanf("%d\n",&p->score[i]);
p->next=(struct student*)malloc(sizeof(struct student));
if(i==n) p->next=NULL;
else p=p->next;
}
}
void output()
{
int i;
p=head;
printf("学号\t姓名\t成绩\t");
while(p!=NULL)
{
printf("%d%c",p->no,p->name);
for(i=0;i<3;i++)
printf("%d,%d,%d",&p->score[i]);
p=p->next;
}
}
void main()
{
int i;
menu();

printf("请选择\n");
scanf("%d",&i);
switch(i)
{
case 0:input();break;
case 1:output();break;
}
}
展开
 我来答
百度网友288ba2d
2008-06-24 · TA获得超过364个赞
知道小有建树答主
回答量:314
采纳率:0%
帮助的人:272万
展开全部
你的scanf("%c\n",p->name); scanf("%d\n",&p->score[i]); 改为scanf("%d",&p->score[i]); scanf("%s",p->name); 除此;
你的input()函数定义有问题,我试着给你改了下,你验证下是否可以,为了操作简便,我对你的结构体进行了重新定义:
typedef struct student node;
typedef node *llink;
下面是对你的input()函数的重新实现:
llink input()
{
llink head;
llink ptr,ptr1;
int i=0,n=0;
printf("请输入数据个数");
scanf("%d",&n);
head=(llink)malloc(sizeof(node));
if(!head)
return NULL;
printf("请输入学生学号\n");
scanf("%d",head->no);
printf("请输入学生姓名\n");
scanf("%s\n",head->name);
printf("学号\t姓名\t成绩\t");
scanf("%d\n",&head->score[i]);
head->next=NULL;
ptr=head;
for(i=1;i<n;i++)
{
ptr1=(llink)malloc(sizeof(node));
if(!ptr1)
return NULL;
printf("请输入学生学号\n");
scanf("%s",ptr1->no); //你把你的学号定义为char数组了.
printf("请输入学生姓名\n");
scanf("%s",ptr1->name);
printf("请输入学生成绩\n");
scanf("%d",&p->score[i]);
ptr1->next=NULL;
ptr1-next=ptr1;
ptr=ptr->next;
}
return head;
}
链表的插入操作必须有一个游动指针,必须含有
ptr1->next=NULL;
ptr1-next=ptr1;
ptr=ptr->next;
这几步关键语句;
其次关于printf()函数的格式化输出:
%c 单个字符
%d 十进制整数
%f 十进制浮点数
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 输出百分号%
仅供参考.
高金山
2008-06-24 · TA获得超过1万个赞
知道大有可为答主
回答量:4101
采纳率:0%
帮助的人:1717万
展开全部
printf("请输入学生学号\n");
scanf("%d",p->no); ///////////////应该是scanf("%s",p->no);
printf("请输入学生姓名\n");
scanf("%c\n",p->name); ///////////////应该是scanf("%s",p->name);
printf("请输入学生成绩\n");
for(i=0;i<3;i++)
scanf("%d\n",&p->score[i]); ///////////////应该是scanf("%f",&p->score[i]);

注意:上面的%s,%f分别是字符串和浮点数的输入格式!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fcbdf
2008-06-24 · 超过36用户采纳过TA的回答
知道答主
回答量:113
采纳率:0%
帮助的人:123万
展开全部
#include<stdio.h>
#include<stdlib.h>

void menu()
{
printf("MENU\n");
printf("0.输入\n");
printf("1.显示\n");
printf("2.删除\n");
printf("3.查找\n");
printf("4.插入\n");
}
struct student
{
int i;
char no[11]; /*学号由10个字符组成*/
char name[15]; /* 学生姓名*/
int score[3]; /*各门课成绩*/
float sum; /*总分*/
float average; /*平均分*/
int order; /*名次*/
struct student *next; /*指向后继结点的指针*/
};
struct student *p,*head;
void input()
{int i,n;
head=(struct student*)malloc(sizeof(struct student));
p=head;
printf("请输入数据个数");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入学生学号\n");
scanf("%s",p->no); //
printf("请输入学生姓名\n");
scanf("%s",p->name); //
printf("请输入学生成绩\n");
for(int j=0;j<3;j++) //这里也需要修改
scanf("%d",&p->score[j]);
p->next=(struct student*)malloc(sizeof(struct student));
if(i==n) p->next=NULL;
else p=p->next;
}
}
void output()
{
int i;
p=head;
printf("学号\t姓名\t成绩\t");
while(p!=NULL)
{
printf("%d%c",p->no,p->name);
for(i=0;i<3;i++)
printf("%d,%d,%d",&p->score[i]);
p=p->next;
}
}
void main()
{
int i;
menu();

printf("请选择\n");
scanf("%d",&i);
switch(i)
{
case 0:input();break;
case 1:output();break;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xniren
2008-06-24 · TA获得超过1154个赞
知道小有建树答主
回答量:554
采纳率:100%
帮助的人:522万
展开全部
1、将
scanf("%d",p->no);
修改为
scanf("%s",p->no);
2、将
scanf("%c\n",p->name);
修改为
scanf("%s\n",p->name);
3、将
if(i==n) p->next=NULL;
修改为
if(i==n-1)
{
free(p->next);
p->next=NULL;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
么乐松0h
2008-06-24
知道答主
回答量:78
采纳率:0%
帮助的人:27.2万
展开全部
....太深奥 =高手回答吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式