谭浩强《C语言程序设计》里面有一个动态链表的输入和输出的例子,代码如下:
#include <stdio.h> #include <conio.h> #include <malloc.h> #define LEN sizeof(struct student) struct student { int num; float score; struct student *next; }; struct student *creat(void) { int N=0; struct student *p1,*p2,*head; p1=p2=(struct student *)malloc(LEN); scanf("%d%f",&p1->num,&p1->score); head=0; while(p1->num!=0) { N++; if(N==1) head=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf("%d%f",&p1->num,&p1->score); } p2->next=0; return(head); } void print(struct student *head) { struct student *p; p=head; if(head!=0) do { printf("%d %fn",p->num,p->score); p=p->next; }while(p!=0); } void main() { struct student *head1; printf("input:n"); head1=creat(); printf("output:n"); print(head1); getch(); }
用win-tc编译的时候,没有错误,可是运行的时候输入第二值后就自动关闭了,用Turbo C也一样,不过找到错误提示是scanf:floating point formats not linked. 到网上搜了搜错误原因是这样的:TC开发时(80年代)DOS下的存储资源紧缺,因此TC在编译时尽量不加入无关部分。在没发现需要做浮点转换时,就不将这个部分安装到可执行程序里。也就是说默认的情况下是不连接浮点库的,除非你需要他,这就造成了如果你没有调用浮点函数,而是直接用%f或别的形式在scanf()和peintf()里调用就会出现本例的错误——floating point formats not linked.
有两种解决办法:
1.声明一个float型的中间变量,读入,然后赋值给p->score。把第一个 scanf("%d,%f",&p->num,&p->score);
改为
float temp;
scanf("%f",&temp);
p->score = temp;
2.生明一个函数,不用调用它。
static void forcefloat(float *p)
{ float f = *p;
forcefloat(&f);
}
3.使用gcc或vc++编译器