帮忙改一下错误,代码没错,但是运行时添加收入的信息和查询时的信息不一致,请大神帮忙改改,谢谢了
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAXNAME 11 //家庭成员姓名的最大长度
#define MAXDETAIL 21 //注最大长度
//自定义枚举类型fi_type,用来表示收入与支出
typedef enum _fi_type
{
income=1,//收入
payout =-1 //支出
} fi_type;
// 家庭财务信息结构体
typedef struct _fi_info
{
int year;
int month;
fi_type type;
char name[9];
float money;
char detail[11];
}fi_info;
// 存储财务数据结构的结构体
typedef struct _fi_data
{
fi_info info;
struct _fi_data* next;
} fi_data;
fi_data *head;//财务数据的头结点
void menu();//菜单函数
void add_income();
void search_income();
void delete_income();
void update_income();
void add_payout();
void search_payout();
void delete_payout();
void update_payout();
void count_total();
void quit();
//
void search_data(fi_type type);
void delete_data(fi_type type);
void update_data(fi_type type);
void search_name(fi_type type);
//
void initialize();
void save_to_file();
void clear_data();
fi_data *get_last();
fi_data *get_previous(fi_data *p);
void input_info(fi_info *info);
void show_info(fi_data *p);
void menu()
{
printf("\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 家庭财务管理系统\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t*******************************************\n");
printf("\t\t收入管理:");
printf("1.添加收入");
printf(" 2.查询收入明细\n");
printf("\t\t\t 3.删除收入");
printf(" 4.修改收入\n");
printf("\t\t*******************************************\n");
printf("\t\t支出管理:");
printf("5.添加支出");
printf(" 6.查询支出明细\n");
printf("\t\t\t 7.删除支出");
printf(" 8.修改支出\n");
printf("\t\t*******************************************\n");
printf("\t\t统计:");
printf("9.统计总收入/总支出\n");
printf("\t\t*******************************************\n");
printf("\t\t0.退出系统");
}
main()
{
int selected=0;
initialize();
while(selected>=0&&selected<=9)
{
system("cls");
menu();
printf(">请选择要进行的操作(0-9)");
if(scanf("%d",&selected)!=1||selected<0||selected>9)
{
printf(">输入有误!请选择(0-9)之间的数字!按任意键重试...");
getchar();
}
else
{
switch(selected)
{
case 0:exit(0);clear_data();break;
case 1:add_income();save_to_file();break;
case 2:search_income();break;
case 3:delete_income();save_to_file();break;
case 4:update_income();save_to_file();break;
case 5:add_payout();save_to_file();break;
case 6:search_payout();break;
case 7:delete_payout();save_to_file();break;
case 8:update_payout();save_to_file();break;
case 9:count_total();break;
}
}
}
}
void add_income()//添加收入
{
fi_data *p=(fi_data *)malloc(sizeof(fi_data));
p->next=NULL;
input_info(&(p->info));
p->info.type=income;
if(head==NULL)
head=p;
else
get_last(head)->next=p;
}
void add_payout()//添加收入
{
fi_data *p=(fi_data *)malloc(sizeof(fi_data));
p->next=NULL;
input_info(&(p->info));
p->info.type=payout;
if(head==NULL)
head=p;
else
get_last(head)->next=p;
}
//输入函数
void input_info(fi_info *info)
{
printf("<请输入记账日期(YYYY/M)");
scanf("%d/%d",&(info->year),&(info->month));
printf("<请输入家庭成员姓名(最大长度为%d):",MAXNAME-1);
scanf("%s",info->name);
printf(">请输入金额:");
scanf("%f",&(info->money));
printf(">请输入事项(最大长度为%d):",20);
scanf("%s",info->detail);
}
//查找数据函数
void search_data(fi_type type)
{
int year=0;
int month=0;
fi_data *p=NULL;
int count=0;
char input=' ';
{
printf(">请输入要查询的记账日期(例如:2009/1)");
scanf("%d/%d",&year,&month);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.year==year)&&(p->info.type==type))
{
show_info(p);
system("PAUSE");
count++;
}
p=p->next;
}
if(count==0)
{
printf(">没有找到数据\n");
}
printf(">按任意键返回主菜单");
getch();
}
}
void search_name(fi_type type)
{
char name[9];
fi_data *p=NULL;
int count=0;
char input=' ';
printf(">请输入要查询的家庭成员姓名(例如:韩梅梅)");
scanf("%s",name);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.name==name)&&(p->info.type==type))
{
show_info(p);
system("PAUSE");
count++;
}
p=p->next;
}
if(count==0)
{
printf(">没有找到数据\n");
}
printf(">按任意键返回主菜单");
getch();
}
//初始化函数,读取文本数据
void initialize()
{
FILE * fp=NULL;
fi_data *p=NULL;
fi_data *last=NULL;
int count=0;
fp=fopen("data.txt","rb");
if(fp==NULL)
{
fp=fopen("data.txt","w");
fclose(fp);
return;
}
p=(fi_data*)malloc(sizeof(fi_data));
memset(p,0,sizeof(fi_data));
p->next=NULL;
while(fread(&(p->info),sizeof(fi_info),1,fp)==1)
{
if(head==NULL)
head=p;
else
{
last=get_last();
last->next=p;
}
count++;
fseek(fp,count*sizeof(fi_info),SEEK_SET);
p=(fi_data *)malloc(sizeof(fi_data));
memset(p,0,sizeof(fi_data));
p->next=NULL;
}
free(p);
p=NULL;
fclose(fp);
}
//显示信息函数
void show_info(fi_data *p)
{
int i=0;
printf("|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\n");
printf ("| 编号 | 日 期 | 类 型 | 金额 | 姓 名 | 备注 |\n");
printf("|%5d\t|%4d/%02d|%4s\t|%10s|%10.2f|%20s|\n",i+1,
p->info.year,p->info.month,p->info.type==income?"收入":"支出",
p->info.name,p->info.money,p->info.detail);
printf("|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\t\t\t|\n");
}
//统计总收入、总支出
void count_total()
{
float total_income=0.0;
float total_payout=0.0;
fi_data *p=head;
while(p!=NULL)
{
if(p->info.type==income)
{
total_income+=p->info.money;
}
else
{
total_payout+=p->info.money;
}
p=p->next;
}
printf("\t\t+\t\t+\t\t+\n");
printf("|合计收入\t|合计支出\t|结余\t|\n");
//printf("\t\t+\t\t+\t\t+\n");
printf("%12.2f|%12.2f|%12.2f|\n",total_income,total_payout,total_income-total_payout);
printf("\t\t+\t\t+\t\t+\n");
printf(">按任意键返回主菜单。。。");
getchar();
}
//保存到文件
void save_to_file()
{
FILE *fp=fopen("data.txt","wb" );
fi_data *p=head;
while(p!=NULL)
{
fwrite(&(p->info),sizeof(fi_info),1,fp);
fseek(fp,0,SEEK_END);
p=p->next;
}
fclose(fp);
}
//修改信息函数
void update_data(fi_type type)
{ int year=0;
int month=0;
fi_data *p=NULL;
fi_data *pre=NULL;
char input=' ';
int count=0;
int i=0;
while(1)
{ printf(">请输入要查询的记账日期(例如:2009/1)");
scanf("%d/%d",&year,&month);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.year==year)&&(p->info.type==type))
{
count++;
show_info(p);
input_info(&(p->info));
printf("修改成功\n");
p=get_previous(p);
}
p=p->next;
}
if(count==0)
printf(">没有找到数据\n");
printf(">按任意键返回主菜单");
input=getchar();
}
}
void update_name(fi_type type)
{ char name[9];
fi_data *p=NULL;
int count=0;
char input=' ';
{ printf(">请输入要查询的家庭成员姓名(例如:韩梅梅)");
scanf("%s",name);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.name==name)&&(p->info.type==type))
{
count++;
show_info(p);
input_info(&(p->info));
printf("修改成功\n");
p=get_previous(p);
}
p=p->next;
}
if(count==0)
printf(">没有找到数据\n");
printf(">按任意键返回主菜单");
input=getchar();
}
}
void delete_data(fi_type type)//删除数据函数
{
int year=0;
int month=0;
fi_data *p=NULL;
fi_data *pre=NULL;
int count=0;
int i=0;
while(1)
{ printf(">请输入要查询的记账日期(例如:2009/1)");
scanf("%d/%d",&year,&month);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.year==year)&&(p->info.type==type))
{
count++;
show_info(p);
input_info(&(p->info));
printf("删除成功\n");
p=get_previous(p);
}
p=p->next;
}
if(count==0)
printf(">没有找到数据\n");
printf(">按任意键返回主菜单");
getchar();
}
}
void delete_name(fi_type type)
{ char name[9];
fi_data *p=NULL;
int count=0;
char input=' ';
{ printf(">请输入要查询的家庭成员姓名(例如:韩梅梅)");
scanf("%s",name);
p=head;
count=0;
while(p!=NULL)
{
if((p->info.name==name)&&(p->info.type==type))
{
count++;
show_info(p);
input_info(&(p->info));
printf("删除成功\n");
p=get_previous(p);
}
p=p->next;
}
if(count==0)
printf(">没有找到数据\n");
printf(">按任意键返回主菜单");
input=getchar();
}
}
void clear_data()//清空链表数据
{
fi_data *p=NULL;
while(head!=NULL)
{
if(head->next!=NULL)
{
p=head;
head=head->next;
free(p);
p=NULL;
}
else
{
free(head);
head=NULL;
}
}
}
fi_data *get_last()
{
fi_data * p=head;
if(p==NULL)
return p;
while((p!=NULL)&&(p->next!=NULL))
p=p->next;
return p;
}
fi_data *get_previous(fi_data *p)
{
fi_data *previous=head;
while(previous!=NULL)
{
if(previous->next==p)
break;
previous=previous->next;
}
return previous;
}
void search_payout()
{
search_data(payout);
}
void delete_payout()
{
delete_data(payout);
}
void update_payout()
{
update_data(payout);
}
void search_income(){
int a;
printf("(1)按日期查询\n");
printf("(2)按姓名查询\n");
printf("请输入选择:");
scanf("%d",&a);
if(a==1) search_data(income);
if(a==2) search_name(income);
}
void delete_income()
{
delete_data(income);
}
void update_income()
{
update_data(income);
}