C语言高手进来帮看下

我在做练习,写一个动态的单向链表,实现创建,删除功能,创建链表完成后,输入数据时,出现了问题,我把代码发出来,前辈们帮看看,问题出在哪?
#include <stdio.h>#include <malloc.h>
#define LEN sizeof(struct student)
struct student *creat();struct student *delet(struct student *head,int a);void print(struct student *head);
int n;
struct student{ int num; float score; struct student *next;};
void main(){ struct student *p,*y; int b; p=creat(); printf("请输入要删除的结点:"); scanf("%d",&b); y=delet(p,b); print(y); }
struct student *creat(){ struct student *head,*p1,*p2; p1=p2=(struct student *)malloc(LEN); n=0; head=NULL; printf("请输入学号:"); scanf("%d",&p1->num); printf("请输入分数:"); scanf("%f",&p1->score);//这一步的时候,就出现问题了,把%f改成%d,把上面struct student里的float score改成int,就没问题了,这是什么回事呀 while(p1->num!=0) { n++; if(n==1) { head=p1; } else { p2->next=p1; } p2=p1; p1=(struct student *)malloc(LEN); printf("请输入学号:"); scanf("%d",&p1->num); printf("请输入分数:"); scanf("%f",&p1->score); }
free(p1); p2->next=NULL;
return head;}
struct student *delet(struct student *head,int a){
}
void print(struct student *head){
}
我把运行后出问题的图片贴出来,前辈们帮看看,是怎么回事

你的这个问题我一起也遇到过,它跟输入输出缓冲区有关。具体自己研究。
解决的话就是
printf("请输入学号:\n");
scanf("%d",&p1->num);
printf("请输入分数: \n");
scanf("%f",&p1->score);
这样在后面换行就好。
也有清空缓冲区的函数,我不是很会用。
fflush(stdin);//清空输入缓冲区
fflush(stdout);//清空输出缓冲区
可追问。追问

加了\n还是不行呀。。。

追答

确实是环境的问题,好了,教你个办法:
把代码拷贝一下,重新编译就好了。不要太认真,这种事浪费时间。
#include
#include
#define LEN sizeof(struct student)
struct student *creat();
struct student *delet(struct student *head,int a);
void print(struct student *head);
int n;
struct student
{
int num;
float score;
struct student *next;
};
void main()
{
struct student *p,*y;
int b;

p=creat();

printf("请输入要删除的结点:");
scanf("%d",&b);

y=delet(p,b);

print(y);

}
struct student *creat()
{
struct student *head,*p1,*p2;

p1=p2=(struct student *)malloc(LEN);

n=0;

head=NULL;
printf("请输入学号:");
scanf("%d",&p1->num);

printf("请输入分数:");
scanf("%f",&p1->score);

while(p1->num!=0)
{
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}

p2=p1;

p1=(struct student *)malloc(LEN);

printf("请输入学号:");
scanf("%d",&p1->num);

printf("请输入分数:");
scanf("%f",&p1->score);
}

free(p1);
p2->next=NULL;

return head;
}
struct student *delet(struct student *head,int a)
{
return head;
}
void print(struct student *head)
{

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-19
scanf 函数遇到 其他标点符号或者空格 比如 浮点数 中的 点. 就会认为你输入完毕了。导致 点后面的值再次跑到 printf("请输入学号:");
scanf("%d",&p1->num);里面。你可以换一个从屏幕读取数值的函数,不用scanf 。 这样就可以了。追问

我用getchar(p1->score),但是不给输入,,

追答

getchar 是从屏幕获取一个字符。兄弟。你用错了。

追问

那应该换哪个呀?,,

第2个回答  2013-09-19
建议更换编译环境。追问

我的代码应该没有问题吧?上一次做练习时这样还行,现在就不行了,,

C语言高手进,帮忙解答一下下列各题的标准答案。此题是我的重要复习题...
【答案】32.D 33.B 36.A 45.C 47.C 50.D 58.B 【解析】32.字符串数组除了里面的实际字符,系统还会自动的分配一个结束符"\\0",所以该数组所占空间为6+1=7个。33.一句话说不明白,放心,已经通过程序验证,答案肯定正确。36.括号内的只能算是一个参数。45.因为是static定义的静态变量,所...

c语言高手帮忙下,看看下面这个程序哪里出错
首先。。。y=3x-1;和y=2x-1;这里,明显是错误的,c语言中的变量不能以数字开头的,3x,2x明显不是变量,应该是想做乘法运算吧,如果是乘法运算的话应该有“*”。其次,else是自动跟上一个没配对掉的if组合,这样的话if(x>=10)y=3x-1;printf("=%d",y);else的写法就不对了,应该在if后...

C语言高手进来帮一下忙啊 两个程序有什么不一样吗?为什么结果不同呢...
参考以下吧, fopen的参数 r 以只读方式打开文件,该文件必须存在。r+ 以可读写方式打开文件,该文件必须存在。rb+ 读写打开一个二进制文件,允许读数据。rw+ 读写打开一个文本文件,允许读和写。w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ ...

C语言高手来看看,看程序写结果,告诉我步骤
include<stdio.h> int x1=30,x2=40;\/\/此时全局变量变成10;void sub(int x,int y){ x1=x; \/\/把传进来的值赋值给全局变量x1;x=y;\/\/这一段和下面一段不用管,形参x跟y值的改变是不改变实参x3,跟x4的值的,只要注意全局变量x1跟x2即可。y=x1;} int main(){ int x3=10,x4=20;sub...

用C语言编写求高手帮我看一下,那里错了,题目是这样的,读入三角形三边的...
S(a,b,c)(a+b+c)\/2 define AREA(a,b,c) sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c))这种定义习惯非常不好,把他们改成函数,在main中调用 补充:语法上是没有错,但是你的sqrt 是在某个h文件中的宏定义 在编译的时候,编译器找不到对应sqrt的宏 ...

C语言高手进来帮看下
具体自己研究。解决的话就是 printf("请输入学号:\\n");scanf("%d",&p1->num);printf("请输入分数: \\n");scanf("%f",&p1->score);这样在后面换行就好。也有清空缓冲区的函数,我不是很会用。fflush(stdin);\/\/清空输入缓冲区 fflush(stdout);\/\/清空输出缓冲区 可追问。

关于C语言求一串阶乘的和,求高手帮我看一下!
如果在计算20以内的阶乘之和时,使用常规的整型变量,可能会出现计算结果错误的问题。原因在于阶乘之和超过了整型变量的存储上限。例如,计算结果实际为2561327494111820313,而代码输出为268040729。这主要是因为计算过程中数值超过了整型的最大值。解决此问题的方法是使用浮点型变量进行计算,以避免整数溢出。

C语言的高手们快进来!帮忙啊
楼上说的对,执行完printf("%c,",b++); b现在是字符'3',然后,你把b-a,首先2个字符不能直接运算,计算机自动转换他们的ASCII,结果是 int类型的数字2,然后%d输出,就是数字2了。

C语言高手请进 帮我看看这个函数写对了吗??
int create(){ int n=0;struct man temp,man_list[N],*p,*a;FILE *fp;int res;fp=fopen("d:\\\\tongxunlu.dat","r+"); \/\/ 打开方式出错 if(fp==NULL){ printf("文件打开失败");return 0;} p=man_list;res=fscanf(fp,"%20s%15s%15s",p->name,p->cellph,p->tel);if(...

c语言高手请进来!
int i=-1;printf("%d,%o\\n",i,i)上面那大哥说的差不多了,只是%d是表示10进制的,%o是表示8进制的,关于在内存中怎么存贮转化你可以参考下清华大学出版社的 计算机基础,。大一的学生用的。8进制的177777转化成10进制并不是-1,这和在内存中的存储有关系,具体说太复杂了,你去自己看下吧。

相似回答
大家正在搜