很诡异的事件。。。。
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef struct person //通讯录结构中节点的定义
{
char name[30]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbnub[15]; //移动电话
struct person *next;
}listnode,*listlink;
struct add_person //通讯录记录结构
{
char name[30];
char addr[30];
char offphnum[15];
char hmphnum[15];
char mbnub[15];
};
listlink create(); //建立通讯录并将信息存入文件
listlink readfp(); //将文件的信息独处并转存如链表
void Show(listlink head); //显示信息
void Delete(listlink head);//删除一条记录的信息
void Find(listlink head); //查找记录
void Input(listlink head); //向通讯录加入一条记录
void Alter(listlink head); //修改一条记录的信息
void Save(listlink head); //保存信息到文件
int main()
{
listlink head=NULL;
int n;
head=readfp();
if(head==NULL)
head=create(head);
while(1)
{
printf("------------------------------------\n");
printf("请选择操作:1 显示所有 2 删除记录 \n");
printf(" 3 查询记录 4 插入新记录\n");
printf(" 5 修改记录 0 保存退出 \n");
printf("请选择操作:");
scanf("%d",&n);
switch(n)
{
case 1:Show(head);break;
case 2:Delete(head);break;
case 3:Find(head);break;
case 4:Input(head);break;
case 5:Alter(head);break;
case 0:Save(head);return 0;
}
}
return 0;
}
//----------------------------建立通讯录
listlink create()
{
listlink s;
listlink head=NULL,end=NULL;
printf("请输入信息(结束请在姓名处输入‘#’)\n\n");
while(1)
{
s=(listlink)malloc(sizeof(listnode));
printf("姓名:");
scanf("%s",&s->name);
if(strcmp(s->name,"#")==0) break;
printf("地址:");
scanf("%s",&s->addr);
printf("办公电话:");
scanf("%s",&s->offphnum);
printf("家庭电话:");
scanf("%s",&s->hmphnum);
printf("移动电话:");
scanf("%s",&s->mbnub);
s->next=NULL;
if(head==NULL)
head=end=s;
else
{
end->next=s;
end=s;
}
printf("\n");
}
return (head);
}
//-----------------------------显示全部记录
void Show(listlink head)
{
listlink p1;
p1=head;
while(p1!=NULL)
{
printf("姓名:%s\n",p1->name);
printf("地址:%s\n",p1->addr);
printf("办公电话:%s\n",p1->offphnum);
printf("家庭电话:%s\n",p1->hmphnum);
printf("移动电话:%s\n",p1->mbnub);
p1=p1->next;
}
}
//----------------------------将文件的信息读出并转存如链表中
listlink readfp()
{
FILE *fp;
struct add_person persons;
listnode *s;
listlink head=NULL,end=NULL;
fp=fopen("people.txt","rb");
if(fp==NULL)
{
printf("cannot open file!\n");
return head;
}
fread(&persons,sizeof(struct add_person),1,fp);
while(!feof(fp))
{
s=(listnode *)malloc(sizeof(listnode)); //存入链表中
strcpy(s->name,persons.name);
strcpy(s->addr,persons.addr);
strcpy(s->offphnum,persons.offphnum);
strcpy(s->hmphnum,persons.hmphnum);
strcpy(s->mbnub,persons.mbnub);
s->next=NULL;
if(head==NULL) //尾插法将其插入链表中
head=end=NULL;
else
{
end->next=s;
end=s;
}
fread(&persons,sizeof(struct add_person),1,fp);
}
return head;
}
//-------------------------------------将信息保存到文件中
void Save(listlink head)
{
FILE *fp;
static struct add_person persons;
listlink p;
fp=fopen("people.txt","wb");
p=head;
while(p!=NULL)
{
strcpy(persons.name,p->name);
strcpy(persons.addr,p->addr);
strcpy(persons.offphnum,p->offphnum);
strcpy(persons.hmphnum,p->hmphnum);
strcpy(persons.mbnub,p->mbnub);
fwrite(&persons,sizeof(struct add_person),1,fp);
}
fclose(fp);
}
//----------------------------------删除一条记录
void Delete(listlink head)
{
listlink p1,p2;
char Name[10];
p1=p2=head;
if(p1==NULL)
{
printf("没有记录!\n");
return ;
}
printf("请输入要删除人的姓名:");
scanf("%s",&Name);
while(strcmp(p1->name,Name)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,Name)==0)
{
if(p1==head)
p1=p1->next;
else
p2->next=p1->next;
free(p1);
}
else
printf("要删除的记录不存在!\n");
}
//--------------------------------------查找指定记录
void Find(listlink head)
{
listlink p1;
char Name[10];
int k=1;
while(k)
{
p1=head;
printf("请输入要查找人的姓名:");
scanf("%s",&Name);
while(strcmp(Name,p1->name)!=0&&p1->next!=NULL)
{
p1=p1->next;
}
if(strcmp(Name,p1->name)!=0)
printf("要查找的记录不存在!\n");
else
{
printf("姓名:%s\n",p1->name);
printf("地址:%s\n",p1->addr);
printf("办公电话:%s\n",p1->offphnum);
printf("家庭电话:%s\n",p1->hmphnum);
printf("移动电话:%s\n",p1->mbnub);
}
printf("是否继续?(Y/N)");
if(getchar()!='Y'||getchar()!='y')
k=0;
}
}
//------------------------------------------向通讯录中插入新的记录
void Input(listlink head)
{
int k=1;
listlink s,end;
end=head;
while(k)
{
s=(listlink)malloc(sizeof(listnode));
while(end->next!=NULL)
end=end->next;
printf("姓名:");
scanf("%s",&s->name);
printf("地址:");
scanf("%s",&s->addr);
printf("办公电话:");
scanf("%s",&s->offphnum);
printf("家庭电话:");
scanf("%s",&s->hmphnum);
printf("移动电话:");
scanf("%s",&s->mbnub);
s->next=NULL;
end->next=s;
s=end;
printf("是否继续?(Y/N)");
if(getchar()!='Y'||getchar()!='y')
k=0;
}
}
//-----------------------------------------修改一条记录的信息
void Alter(listlink head)
{
listlink p=head;
char pname[10];
printf("请输入要修改人的姓名:");
scanf("%s",&pname);
while(strcmp(pname,p->name)!=0&&p->next!=NULL)
p=p->next;
if(strcmp(pname,p->name)!=0)
{
printf("没有要修改人的记录!\n");
return;
}
else
{
printf("请输入要修改的信息!\n");
printf("姓名:");
scanf("%s",&p->name);
printf("地址:");
scanf("%s",&p->addr);
printf("办公电话:");
scanf("%s",&p->offphnum);
printf("家庭电话:");
scanf("%s",&p->hmphnum);
printf("移动电话:");
scanf("%s",&p->mbnub);
}
}今天写了一个通讯录,运行后输入数据,保存。。
但是产生的文件 竟然有1.86G!!
很是无语啊。。谁知道怎么回事??
[ 本帖最后由 bccn_2012 于 2011-6-11 19:23 编辑 ]









