【求help】我已经纠结了过30个小时了,各位路过的帮忙看一下吧,万分感谢Orz~
各位路过的朋友们帮帮忙吧~我自己实在是无能为力了……程序一运行到删除那一块的时候就8行了……
还是觉得MAYBE的指针的问题可惜那个我学的太烂了!!~
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define INITIAL_SIZE 100 /*数组初始大小*/
#define INCR_SIZE 50 /*数组每次增加的大小*/
struct car_info
{
char name[20];
char number[20];
char date[20];
char price[20];
char company[20];
char sort[20];
struct car_info *next;
};
typedef struct car_info CarInfo;
extern int numCars; /*记录的车辆数*/
extern CarInfo*records; /*记录车辆信息的数组*/
extern char savedTag; /*信息时候已保存的标志,0为以保存,1为未保存*/
extern int arraySize; /*数组大小*/
void handle_menu(void);
int select_menu(void);
void add(void);
void modify(void);
void display(void);
void query(void);
void delMenu(void);
CarInfo *onedel(CarInfo *records);
void alldel(CarInfo *records);
int sdelMenu(void);
int save(void);
int load(void);
void quit(void);
void showTable(void);
int find(char*target,int targetType,int from);
void copy(CarInfo*src,CarInfo*dest);
#endif
/*初始化*/
int numCars=0;
CarInfo *records=NULL;
char savedTag=0; /*记录是否保存的标志,0为已保存,1为未保存*/
int arraySize;
char*sort[]={"豪华型","紧凑型","微型","中型"};
/*主函数*/
int main()
{
/*初始化数组*/
records=(CarInfo*)malloc(sizeof(CarInfo)*INITIAL_SIZE);
if(records==NULL)
{
printf("memory fail!");
exit(-1);
}
arraySize=INITIAL_SIZE;
/*主界面*/
printf("\n******************************CAR SALES SYSTEM**********************************\n");
handle_menu();
}
/*菜单处理函数*/
void handle_menu(void)
{
for(; ;)
{
switch(select_menu())
{
case 1:
add();
break;
case 2:
modify();
break;
case 3:
display();
break;
case 4:
query();
break;
case 5:
delMenu();
break;
case 6:
save();
break;
case 7:
load();
break;
case 8:
quit();
}
}
}
/*菜单选择函数*/
int select_menu()
{
char s[2];
int cn=0;
printf("\n");
printf("\t1.增加信息\n");
printf("\t2.修改信息\n");
printf("\t3.显示信息\n");
printf("\t4.查询信息\n");
printf("\t5.删除信息\n");
printf("\t6.保存信息至记录文件\n");
printf("\t7.从记录文件中读取信息\n");
printf("\t8.结束运行\n");
printf("\n\t左边数字对应功能选择,请选择1-8:");
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>8)
printf("\n\t输入错误,请重新选择1-8:");
else
break;
}
return cn;
}
/*结束运行,退出*/
void quit(void)
{
char str[5];
if(savedTag==1) /*记录尚未保存*/
{
printf("是否保存原来的记录?(Y/n)");
gets(str);
if(str[0]!='n'&&str[0]!='N')
save(); /*调用保存函数保存记录*/
}
free(records);
exit(0);
}
/*
文件存储操作函数
结果:数组records被保存到指定文件
返回:成功0,失败-1
*/
int save()
{
FILE*fp;
char fname[30];
if(numCars==0)
{
printf("没有记录可存!");
return -1;
}
printf("请输入要存入的文件名(直接回车选择文件car_info):");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"car_info");
if((fp=fopen(fname,"wb"))==NULL)
{
printf("不能存入文件!\n");
return -1;
}
printf("\n存文件...\n");
fwrite(records,sizeof(CarInfo)*numCars,1,fp);
fclose(fp);
printf("%d条记录已经存入文件,请继续操作。\n",numCars);
savedTag=0;
return 0;
}
/*
文件读取操作函数
结果:records为从指定文件中读取出的记录
返回:成功0,失败-1
*/
int load(void)
{
FILE*fp;
char fname[30];
char str[5];
if(numCars!=0 && savedTag==0)
{
printf("选择覆盖现有记录(Y),还是像读取的记录添加到现有记录之后(n)?\n");
printf("直接回车则覆盖现有记录\n");
gets(str);
if(str[0]=='n'||str[0]=='N')
savedTag=1; /*将读取的记录添加到现有记录之后*/
else
{
if(savedTag==1) /*覆盖现有记录*/
{
printf("读取文件将会更改原有的记录,是否保存原有记录?(Y/n)");
gets(str);
if(str[0]!='Y' && str[0]!='n')
save();
}
numCars=0;
}
}
printf("请输入要读取的文件名(直接回车选择文件car_info):");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"car_info");
if((fp=fopen(fname,"rb"))==NULL)
{
printf("打不开文件!请重新选择\n");
return -1;
}
printf("\n取文件...\n");
while(!feof(fp))
{
/*现在的数组空间不足,需要重新申请空间*/
if(numCars>=arraySize)
{
records=(CarInfo*)realloc(records,(arraySize+INCR_SIZE)*sizeof(CarInfo));
if(records==NULL)
{
printf("menmory fail!");
exit(-1);
}
arraySize=arraySize+INCR_SIZE;
}
if(fread(&records[numCars],sizeof(CarInfo),1,fp)!=1)
break;
numCars++;
}
fclose(fp);
printf("\n现在有%d条记录。",numCars);
return 0;
}
/*输出表头*/
void showTable(void)
{
printf("\n---------------------------INFORMATION------------------------------------------\n");
printf("name\tnumber\tdate\tprice\tcompany\tsort");
printf("\n--------------------------------------------------------------------------------\n");
}
/*显示所有汽车的信息*/
void display(void)
{
int i;
if(numCars==0)
{
printf("没有可显示的记录!");
return;
}
showTable(); /*打印表头*/
for(i=0;i<numCars;i++)
{
/*打印汽车信息*/
printf("%s\t%s\t%s\t%s\t%s\t%s\n",records[i].name,records[i].number,records[i].date,
records[i].price,records[i].company,records[i].sort);
/*打印满20个记录后停下来*/
if(i%19==0&&i!=0)
{
printf("输入任一字符后继续...\n");
getch();
printf("\n\n");
showTable();
}
}
}
/*
当前表的末尾增加新的信息
结果:records中将记录新的信息
注意:若数组的大小不够,会重新申请新的数组空间
*/
void add(void)
{
char str[10];
if(numCars==0)
printf("原来没有记录,现在建立新表\n");
else
printf("下面在当前表的末尾增加新的信息\n");
while(1)
{
printf("您将要添加一组信息,确定么?(Y/n)");
gets(str);
if(str[0]=='n'||str[0]=='N') /*不再添加新的信息*/
break;
if(numCars>=arraySize) /*现在的数组空间不足,需要申请新空间*/
{
records=(CarInfo*)realloc(records,(arraySize+INCR_SIZE)*sizeof(CarInfo));
if(records==NULL)
{
printf("memory fail!");
exit(-1);
}
arraySize=arraySize+INCR_SIZE;
}
printf("请输入名称");
gets(records[numCars].name);
printf("请输入代号");
gets(records[numCars].number);
printf("请输入上市时间");
gets(records[numCars].date);
printf("请输入价格");
gets(records[numCars].price);
printf("请输入公司");
gets(records[numCars].company);
printf("请输入类型");
gets(records[numCars].sort);
numCars++;
}
printf("\n现在一共有%d条信息\n",numCars);
savedTag=1;
}
/*
注意:如果在添加新信息之前,numCars已经大于或等于arraySize,
则使用realloc函数重新为records分配一块大小为(arraySize+INCRSIZE)个CarInfo的数组的存储块
并重新设置arraySize
*/
/*
查找指定记录
参数 target:欲查找的某一项与target相同
targetType:表明通过哪一类别来查找:
0为车辆名称,1为车辆代号,2为公司名称,3为车型(微型,紧凑型,中型,豪华型)
返回 正常返回找的记录序号
没有找到返回 -1
*/
int find(char*target,int targetType, int from)
{
int i;
for(i=from; i<numCars; i++)
{
if((targetType==0 && strcmp(target,records[i].name)==0)||
(targetType==1 && strcmp(target,records[i].number)==0)||
(targetType==2 && strcmp(target,records[i].company)==0)||
(targetType==3 && strcmp(target,records[i].sort)==0))
return i;
}
return -1;
}
/*
查找指定车辆信息
可以按照车辆名称,车辆代号,公司名称,车型来查找*/
void query(void)
{
char str[5];
char target[20];
int type;
int count;
int i;
if(numCars==0)
{
printf("没有可供查询的记录");
return;
}
while(1)
{
printf("请输入查询方式(按回车则结束本次查询):\n");
printf("1.按名称\n");
printf("2.按代号\n");
printf("3.按公司\n");
printf("4.按车型\n");
gets(str);
if(strlen(str)==0)
break;
if(str[0]==1)
{
printf("请输入名称");
gets(target);
type=0;
}
else
if(str[0]==2)
{
printf("请车辆代号");
gets(target);
type=1;
}
else
if(str[0]==3)
{
printf("请输入公司");
gets(target);
type=2;
}
else
{
printf("请输入车型");
gets(target);
type=3;
}
i=find(target,type,0);
if(i==1)
{
showTable(); /*打印查询到的车辆信息*/
}
count=0;
while(i!=-1)
{
count++;
printf("%s\t%s\t%s\t%s\t%s\t%s",records[i].name,records[i].number,records[i].date,
records[i].price,records[i].company,records[i].sort);
i=find(target,type,i+1);
}
if(count==0)
printf("没有找到符合条件的车辆!\n");
else
printf("\n一共找到%d辆符合条件的车辆\n",count);
}
}
/*删除记录函数*/
void delMenu(void)
{
switch(sdelMenu())
{
case 1:
records=onedel(records); //部分删除
break;
case 2:
alldel(records); //全部删除
break;
case 0:
return; //返回主界面
}
}
/*菜单选择函数*/
int sdelMenu()
{
int ch;
printf("\n");
printf("\t1.删除指定条车辆信息\n");
printf("\t2.删除全部车辆信息\n");
printf("\t0.返回主界面\n");
printf("\n\t左边数字对应功能选择,请选择:");
for(;;)
{
scanf("%d",&ch);
if(ch<0||ch>2)
printf("\n\t输入错误,请重新选择:");
else
break;
}
return ch;
}
//逐条删除
CarInfo *onedel(CarInfo *records)
{
CarInfo *p,*q; //*p为查找到要删除的接点,q为其前驱指针
char onename[20]; //存放要删除的名称
char c; //确认指令删除or not
printf("请输入你要删除的车辆名称\nPlease input the name of the car you want to delete\n");
//输出提示信息
scanf("%s",onename); //输入要删除的车辆名称
q=p=records; //给p、q赋初值头指针
while (strcmp(p->name,onename)&&p!=NULL) //当记录得名称非要找的,或者指针为空时
{
q=p;
p=p->next; //p指向下一项记录
}
if(p==NULL) //p是否为空
{
printf("\n 列表中不存在名字为%s的车",onename);
printf("\n List no %s car\n",onename); //输出无该结点
//【返回主界面】
}
else
{
printf("**************************have found*****************************");
printf("| 名称 | 代号 | 上市日期 | 车型 | 价格 | 所属公司 |\n");
printf("|--------|--------|----------|------|------|----------|\n");
printf("|%s|%s|%4d %2d %2d|%1d|%d|%s|\n",p->name,p->number,p->date,p->sort,p->price,p->company);
printf("******************************************************************");
printf("\n确定要删除吗?Y OR N!\n"); //显示删除信息
scanf("%s",&c);
if((c=='y')||(c=='Y'))
{
if(p==records)
records=p->next;
else
q->next=p->next;
free(p);
printf("delete………………\n");
printf("\n**********该车已经删除********");
return(records);
}
}
}
//全部删除
void alldel(CarInfo *records)
{
CarInfo *p,*q;
char c; //确认指令删除or not
printf("\n确定全部要删除吗?Y OR N!\n");
scanf("%s",&c);
if((c=='y')||(c=='Y'))
{
p=records->next;
q=records;
while(p!=NULL)
{
free(q);
q=p;
p=p->next;
}
free(q);
printf("All record are delete.\n\n");
}
else
return;
}
/*修改指定车辆信息函数*/
void modify(void)
{
char str[5];
char target[20];
int type;
int i;
if(numCars==0)
{
printf("没有可供修改的记录");
return;
}
while(1)
{
printf("请输入如何找到欲修改的记录的方式:");
printf("(直接回车则结束修改操作)\n");
printf("1.按名称\n");
printf("2.按代号\n");
printf("3.按名称\n");
printf("4.按车型\n");
gets(str);
if(strlen(str)==0)
break;
if(str[0]=='1')
{
printf("请输入名称");
gets(target);
type=0;
}
else
if(str[0]=='2')
{
printf("请输入代号");
gets(target);
type=1;
}
else
if(str[0]=='3')
{
printf("请输入公司");
gets(target);
type=2;
}
else
{
printf("请输入车型");
gets(target);
type=3;
}
i=find(target,type,0);
if(i==-1)
printf("没有符合条件的车辆!\n");
while(i!=-1)
{
showTable();
printf("%s\t%s\t%s\t%s\t%s\t%s",records[i].name,records[i].number,records[i].date,
records[i].price,records[i].company,records[i].sort);
printf("确定要修改该车辆的信息吗?(Y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("下面请重新输入该车辆的信息:\n");
printf("请输入名称:\n");
gets(records[i].name);
printf("请输入代号:\n");
gets(records[i].number);
printf("请日期:\n");
gets(records[i].date);
printf("请价格:\n");
gets(records[i].price);
printf("请输入公司:\n");
gets(records[i].company);
printf("请输入车型:\n");
gets(records[i].sort);
}
i=find(target,type,i+1);
}
}
savedTag=1;
}
[ 本帖最后由 moneybright 于 2010-9-7 16:28 编辑 ]