三向十字链表的保存和载入函数,把电脑搞到死机,直接切了电源。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义结构类型
typedef struct in_basic
{
char pool_name[4]; //塘号
char seed_num[8]; //苗种编号
char time[11]; //投养时间
int num; //投养数量
float price; //单价
char *resource; //苗种来源
char list_num[5]; //供货单号
struct in_basic* next;
}IN_BASIC;
typedef struct seed_basic
{
char pool_name[4]; //塘号
char seed_num[8]; //苗种编号
char seed_name[20]; //苗种名称
char spe[5]; //规格
struct in_basic* inext;
struct seed_basic* next;
}SEED_BASIC;
typedef struct pool_basic
{
float size; //水面积
char pool_name[4]; //塘号
struct seed_basic* snext;
struct pool_basic* next;
}POOL_BASIC;
//增加链表信息
void add(POOL_BASIC** head)
{
POOL_BASIC *hp=*head,*p;
SEED_BASIC *pp;
IN_BASIC *ppp;
char ch;
do
{
printf("确实要录入信息?(y/n)\n");
getchar();
ch=getchar();
}while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y');
if(ch=='n'||ch=='N')
return;
lop:printf("(1)请输入鱼塘基本信息:\n");
p=(POOL_BASIC *)malloc(sizeof(POOL_BASIC));
printf(" 塘号:");
scanf("%s",p->pool_name);
printf("水面积:");
scanf("%f",&p->size);
getchar();
p->snext=NULL;
p->next=hp;
hp=p;
*head=hp;
while (p!=NULL)
{
printf("(2)请输入%s的苗种基本信息:",p->pool_name);
printf("\n");
looop:pp=(SEED_BASIC*)malloc(sizeof(SEED_BASIC));
printf(" 苗种编号:");
scanf("%s",pp->seed_num);
printf(" 苗种名称:");
scanf("%s",pp->seed_name);
printf(" 规格:");
scanf("%s",pp->spe);
getchar();
strcpy(pp->pool_name, p->pool_name);
pp->next=p->snext;
p->snext=pp;
pp->inext=NULL;
while(pp!=NULL)
{
loop:printf("(3)请输入%s的投苗基本信息:",pp->seed_name);
ppp=(IN_BASIC*)malloc(sizeof(IN_BASIC));
printf("\n");
printf(" 投养时间:");
scanf("%s", ppp->time);
printf(" 投养数量:");
scanf("%d",&ppp->num);
printf(" 单价:");
scanf("%f",&ppp->price);
ppp->resource=(char *)malloc(sizeof(char)*20);
printf(" 苗种来源:");
scanf("%s",ppp->resource);
printf(" 供货单号:");
scanf("%s",ppp->list_num);
getchar();
strcpy(ppp->pool_name,pp->pool_name);
strcpy(ppp->seed_num, pp->seed_num);
ppp->next=pp->inext;
pp->inext=ppp;
printf("(3)是否继续输入%s的投苗基本信息?(y/n):",pp->seed_name);
ch=getchar();
getchar();
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("(3)是否继续输入%s的投苗基本信息?(y/n):",pp->seed_name);
ch=getchar();
getchar();
}
if(ch=='Y'||ch=='y')
goto loop;
else
printf("(2)是否继续输入%s的苗种基本信息?(y/n):",p->pool_name);
ch=getchar();
getchar();
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("(2)是否继续输入%s的苗种基本信息?(y/n):",p->pool_name);
ch=getchar();
getchar();
}
if(ch=='Y'||ch=='y')
goto looop;
else if(ch=='N'||ch=='n')
break;
}
printf("(1)是否继续输入鱼塘基本信息?(y/n):");
ch=getchar();
getchar();
while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N')
{
printf("(1)是否继续输入鱼塘基本信息?(y/n):");
ch=getchar();
getchar();
}
if(ch=='y'||ch=='Y')
goto lop;
else break;
}
*head=p;
}
//遍历函数
void traverse(POOL_BASIC *head)
{
POOL_BASIC *p=head;
SEED_BASIC *pp;
IN_BASIC *ppp;
int i=1;
if(head==NULL)
{
printf("链表中没有信息!");
getchar();
return;
}
for(;p!=NULL;p=p->next,i++)
{
printf("(%d)\n",i);
printf("-------------------------------------------\n");
printf("鱼塘基本信息:\n");
printf("塘号:%s",p->pool_name);
printf(" ");
printf("水面积:%.2f",p->size);
printf("\n");
pp=p->snext;
while(pp!=NULL)
{
printf("**************************************");
printf("\n");
printf("苗种基本信息:\n");
printf("苗种编号:%s", pp->seed_num);
printf(" ");
printf("苗种名称:%s",pp->seed_name);
printf(" ");
printf("规格:%s",pp->spe);
printf("\n");
printf("**************************************\n");
ppp=pp->inext;
while(ppp!=NULL)
{
printf("##########################################################\n");
printf("投苗基本信息:\n");
printf("投养时间:%-11s",ppp->time);
printf(" ");
printf("投养数量:%d",ppp->num);
printf(" ");
printf("单价:%.2f",ppp->price);
printf("\n");
printf("苗种来源:%-11s",ppp->resource);
printf(" ");
printf("供货单号:%s",ppp->list_num);
printf("\n");
printf("##########################################################\n");
ppp=ppp->next;
}
pp=pp->next;
}
printf("-------------------------------------------\n");
}
getchar();
}
//保存函数
void save(POOL_BASIC* head)
{
FILE *fp1, *fp2, *fp3;
POOL_BASIC *p=head;
SEED_BASIC *pp;
IN_BASIC *ppp;
if(head==NULL)
{
printf("没有信息,保存失败!");
getchar();
return;
}
if((fp1=fopen("pool.dat","wb"))==NULL)
exit(-1);
if((fp2=fopen("seed.dat","wb"))==NULL)
exit(-1);
if((fp3=fopen("in.dat","wb"))==NULL)
exit(-1);
while(p!=NULL)
{
fwrite(p,sizeof(POOL_BASIC) ,1, fp1);
pp=p->snext;
while(pp!=NULL)
{
fwrite(pp,sizeof(SEED_BASIC), 1, fp2);
ppp=pp->inext;
while(ppp!=NULL)
{
fwrite(ppp,sizeof(IN_BASIC), 1, fp3);
ppp=ppp->next;
}
pp=pp->next;
}
p=p->next;
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("已经保存!");
getchar();
}
//载入数据
void load(POOL_BASIC** head)
{
FILE *fp1;
FILE *fp2;
FILE *fp3;
POOL_BASIC *hp=NULL, *p=*head;
SEED_BASIC *pp;
IN_BASIC* ppp;
if((fp1=fopen("pool.dat","rb"))==NULL)
exit(-1);
if((fp2=fopen("seed.dat","rb"))==NULL)
exit(-1);
if((fp3=fopen("in.dat","rb"))==NULL)
exit(-1);
while(!feof(fp1))
{
p=(POOL_BASIC *)malloc(sizeof(POOL_BASIC));
fread(p, sizeof(POOL_BASIC), 1, fp1);
p->snext=NULL;
p->next=hp;
hp=p;
}
*head=hp;
printf("第一结点读完");
getchar();
while(!feof(fp2))
{
pp=(SEED_BASIC*)malloc(sizeof(SEED_BASIC));
fread(pp, sizeof(SEED_BASIC), 1, fp2);
p=*head;
while(p!=NULL)
{
if(!strcmp(p->pool_name, pp->pool_name))
{
pp->inext=NULL;
pp->next=p->snext;
p->snext=pp;
break;
}
else
p=p->next;
}
}
while(!feof(fp3))
{
ppp=(IN_BASIC*)malloc(sizeof(IN_BASIC));
fread(ppp, sizeof(IN_BASIC), 1, fp3);
p=*head;
while(p!=NULL)
{
pp=p->snext;
while(pp!=NULL)
{
if(!strcmp(ppp->pool_name,pp->pool_name)&&(!strcmp(ppp->seed_num, pp->seed_name)))
{
ppp->next=pp->inext;
pp->inext=ppp;
break;
}
else
pp=pp->next;
}
p=p->next;
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("已经载入!");
getchar();
}
上面的就是我写的保存函数和载入函数,保存函数不知道有没有问题,载入函数肯定有问题,我点了载入后,没反应,狂点了几下回车,然后就死机了。。。。
[解决办法]
这么长……保证没人看,嘿嘿