读书人

真是怪了双向链表事例scanf接受整

发布时间: 2012-06-24 18:32:37 作者: rapoo

真是怪了,双向链表例子,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语言的一个缺陷。早期资源比较紧张,而结构体往往占用资源较多,因此编译器在碰到浮点数据之前,不会讲对应的浮点库连接,因此在使用之前,可以先定义一个浮点数,输入后再给结构体元素。或者用一个指针,不要输入结构体元素,而是输入一个浮点变量,将结构体中的浮点元素指向这个变量

读书人网 >C语言

热点推荐