真是怪了,双向链表例子,scanf接受整数可以,浮点数就崩溃,指针还是哪里用错了吗?
这是一个双向链表的例子,不带头结点,就是从第一个结点开始就是数据,程序没有写完,在调INSERT函数的时候,是想每次在链表尾增加。SCANF接收数据,用整数(包括长整型)时不报错,用浮点时报错,程序崩溃。程序在VC6下调试
这是头文件:
#ifndef _EX_APP_H_
#define _EX_APP_H_
struct strDATA
{
floatVOL;//** 电压
floatCUR;//** 电流
floatPOW;//** 功率
charTime[20]; //** 发生时间
};
struct sDATA
{
long num;//** 记录序号
struct strDATA Data;
struct sDATA *prior,*next;
};
typedef struct sDATA DATA;
//** 创建链表
DATA *create(void);
void savefile(DATA *head);
void showMenu(void);
void list(DATA *head,int);
void insert(DATA*, int pos);
long filesize(FILE*);
void f_debug(char *info,FILE*);
#endif
这是源文件
//** 链表应用
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include "ExApp.h"
longNODE_NUM;
char file[20] = "c:\\list.dat";
FILE *fp,*debug;
void main()
{
int c;
DATA *lk;
debug = fopen("c:\\debug.txt","w+");
if (debug == NULL)
{
printf("cann't create debug file\n");
return;
}
lk = create();
while(1)
{
system("cls");
showMenu();
c = getch();
switch(c)
{
//** 看看字符和整数的关系,以及字符的表示,这里变量C既可以定义为整型,也可以是字符型
//** case判断既可以判断字符内容,也可以判断整型数值,此时数值就是字符的ASCII码
//** 如果有非打印字符,就是用ASCII码来判断,所以对字符,可以尽量统一判断其ASCII值
case '1':
insert(lk,NODE_NUM);
break;
case '2':
break;
case '3':
break;
case '4':
list(lk,2);
break;
case '5':
savefile(lk);
fclose(debug);
exit(1); //** exit是退出应用程序,记得与break的区别
default:
break;
}
}
}
//********************************************************************************
//** 显示菜单,字符菜单还是有一定用处的,比如银行ATM的后台维护程序
//** 菜单内容就是菜单内容,不要把菜单操作动作等其他内容加入函数
//********************************************************************************
void showMenu()
{
printf(" |-------------------------------------------------|\n");
printf(" | Link List Opearte Menu |\n");
printf(" |-------------------------------------------------|\n");
printf(" | 1: Insert |\n");
printf(" | 2: Delete |\n");
printf(" | 3: Search |\n");
printf(" | 4: List |\n");
printf(" | 5: Exit |\n");
printf(" |-------------------------------------------------|\n");
}
/* 根据链表数据文件创建头结点 */
DATA *create()
{
DATA *head; /* link head and node point */
DATA *p1,*p2;
NODE_NUM = 0L;
if ((fp = fopen(file,"w+")) == NULL)
{
//** 无法对文件操作
printf("cann't open file %s\n",file);
exit(0);
}
p2 = (DATA *)malloc(sizeof(DATA));
head = p2;
p1 = (DATA *)malloc(sizeof(DATA));
memset(head,0,sizeof(DATA));
memset(p1,0,sizeof(DATA));
memset(p2,0,sizeof(DATA));
while(fread(p1, sizeof(DATA), 1, fp)==1)
{
printf("read = 1\n");
NODE_NUM++;
p2->next = p1;
p2 = p1;
p1->next = NULL;
p1 = (DATA *)malloc(sizeof(DATA));
}
free(p1);
fclose(fp);
return head;
}
//** 链表数据存盘
void savefile(DATA *head)
{
DATA *p1;
if (fp == NULL)
return;
p1 = head;
while(p1!=NULL)
{
fwrite(p1, sizeof(DATA), 1, fp);
p1 = p1->next;
}
fclose(fp);
return;
}
//** 链表清单,注意屏幕控制
//** 输入参数:链表头,每屏记录数REC
void list(DATA *head,int REC)
{
int i;
DATA *p = head->next;
if (p == NULL)
{
printf("No data,press any key to continue!\n");
getch();
return;
}
while(p != NULL)
{
printf("ID: %ld\n",p->num);
p = p->next ;
i++;
if (i == REC)
getch();
}
getch();
return;
}
//** 在链表pos位置前插入节点
void insert(DATA *head, int pos)
{
DATA *p;
DATA *q = head;
int i = 0,j = 0;
p = (DATA *)malloc(sizeof(DATA));
if (p == NULL)
{
printf("Error,cann't malloc\n");
printf("press any key to continue\n");
getch();
}
memset(p,0,sizeof(DATA));
p->num = ++NODE_NUM;
printf("num = %ld,Node = %ld,pos = %d\n",p->num,NODE_NUM,pos);
getch();
//** 就是这里出错
printf("Input VOL:");
scanf("%f",&p->Data.VOL);
//printf("Input CUR:");
//scanf("%f",&p->Data.CUR);
//printf("Input Time(YYYY-MM-DD HH:MM");
//scanf("%s",p->Data.Time);
/*
while(j <= pos-1 && q->next != NULL)
{
q = q->next;
j++;
}
if(q->next==NULL && j!= pos)
{
p->next = NULL;
p->prior = q;
q->next = p;
}
else
{
q->prior->next = p;
p->prior = q->prior;
p->next = q;
q->prior = q;
}
*/
free(p);
}
//** 求文件大小(字节)
long filesize(FILE *FP)
{
long fsize = 0L;
FP = fp;
if (FP == NULL)
return 0L;
fseek(FP,0L,SEEK_END);
fsize = ftell(FP);
return(fsize);
}
void f_debug(char *info,FILE *FP)
{
char txt[200] = {0};
fprintf(FP,"%s",txt);
}
请高手检查一下,看看什么问题
[解决办法]
这是C的一个缺陷,不能直接对结构内浮点数进行赋值,会出现异常错误,至于为什么出错我就不知道了,我只知道解决的办法:
float num;
printf("Input VOL:");
scanf("%f",&num);
p->Data.VOL = num;
这样就能达到你的目的了
[解决办法]
C语言的一个缺陷。早期资源比较紧张,而结构体往往占用资源较多,因此编译器在碰到浮点数据之前,不会讲对应的浮点库连接,因此在使用之前,可以先定义一个浮点数,输入后再给结构体元素。或者用一个指针,不要输入结构体元素,而是输入一个浮点变量,将结构体中的浮点元素指向这个变量