C 链表实现通讯录
作者:Lynn 日期:2008-02-15
//大家可以参考一下。
//1、程序book.cpp
//2、love为临时数据文件。。。没有后缀
# include "stdio.h"
# include "string.h"
# include "stdlib.h"
# include "malloc.h"
# include "linklist.h"
void main()
{
head=NULL;
struct address *t=NULL;
while(1)
{
switch(menu_select())
{
case 1:enter();;save();break;
case 2:insert();break;
case 3:search();break;
case 4:del();break;
case 5:list();break;
case 0: exit(0);break;
while(head)
{
t=head;
head=head->next;
free(t);
}
printf("\t程序已结束!\n");
exit(0);
}
}
}
//3、程序 linklist.h
struct address
{
char name[10];
char qq[40];
char city[10];
char province[10];
char zip[7];
struct address * next;
};
struct address *head;
int i;
int menu_select()
{
int a;
char c[20];
printf("\t请选择功能:\n\n");
printf("\t1.新建并输入通讯录\n");
printf("\t2.添加记录\n");
printf("\t3.按姓名查找通讯地址\n");
printf("\t4.删除一个人的记录\n");
printf("\t5.显示通讯录\n");
printf("\t0.退出\n");
do
{
printf("\t请输入数字选择对应的功能:");
scanf("%d",&a);
gets(c);
}while(a<0||a>5);
return a;
}
void inputs(char * prompt,char *s,unsigned count)
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t输入越界了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
struct address * put_in(struct address * i,struct address * head)
{
struct address * pbefore ,* p;
if(head==NULL)
{
head=i;
head->next=NULL;
return head;
}
p=head;
pbefore=NULL;
while(p)
{
if(strcmp(p->name,i->name)<0)
{
pbefore=p;
p=p->next;
}
else
{
if(p==head)
{
i->next=head;
head=i;
return head;
}
pbefore->next=i;
i->next=p;
return head;
}
}
pbefore->next=i;
i->next=NULL;
return head;
}
void enter()
{
struct address * info;
while(1)
{
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存不足!\n");
return;
}
inputs("\t请输入姓名(输入为空时结束):",info->name,9);
if(!*info->name)
{
free(info);
printf("\n\n\t输入通讯记录结束!\n\n");
return;
}
inputs("\t请输入QQ号码:",info->qq,39);
inputs("\t请输入城市:",info->city,9);
inputs("\t请输入省份名称:",info->province,9);
inputs("\t请输入邮政编码:",info->zip,9);
head=put_in(info,head);
}
}
void save()
{
struct address *info;
FILE *fp;
char filename[80]="love";
if(head)
{
if(!(fp=fopen(filename,"wb")))
{
printf("\t发生异常,请重试!\n");
exit(0);
}
printf("\t正在保存文件!\n");
info=head;
while(info)
{
fwrite(info,sizeof(struct address),1,fp);
info=info->next;
}
fclose(fp);
}
else
printf("\t目前没有通讯信息可以保存!\n\n");
}
void display(struct address * info)
{
printf("\t%2d.姓名:%s\n",++i,info->name);
printf("\t Q Q:%s\n",info->qq);
printf("\t 城市:%s\n",info->city);
printf("\t 省份:%s\n",info->province);
printf("\t 邮编:%s\n",info->zip);
printf("\n");
}
void load(char * filename)
{
struct address *info,*pbefore=NULL;
FILE *fp;
while(head)
{
info=head;
head=head->next;
free(info);
}
if(!(fp=fopen(filename,"rb")))
{
printf("\t发生异常,请重试!\n");
return;
}
printf("\t正在装入文件,请等待!\n");
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存不足!\n");
return;
}
head=info;
while(!feof(fp))
{
if(fread(info,sizeof(struct address),1,fp)!=1)
break;
info->next=(struct address *)malloc(sizeof(struct address));
if(!info->next)
{
printf("\t内存不足!\n");
return;
}
pbefore=info;
info=info->next;
}
pbefore->next=NULL;
free(info);
printf("\t已成功装入文件!\n\n");
fclose(fp);
}
void list()
{
struct address * info;
char filename[80]="love";
load(filename);
i=0;
info=head;
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
struct address * find()
{
struct address * info;
char filename[80]="love";
char name[20];
while(head)
{
info=head;
head=head->next;
free(info);
}
load(filename);
info=head;
inputs("\t请输入你想要找的姓名:",name,19);
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void search()
{
struct address * info;
if(info=find())
{
printf("\n\n\t查询结果为:\n\n");
printf("\t姓名:%s\n",info->name);
printf("\tQ Q:%s\n",info->qq);
printf("\t城市:%s\n",info->city);
printf("\t省份:%s\n",info->province);
printf("\t邮篇:%s\n",info->zip);
printf("\n");
}
else
printf("\t查无此人!\n\n");
}
struct address * tell(char * name)
{
struct address * info;
info=head;
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void resave(char * filename)
{
struct address *info;
FILE *fp;
if(!(fp=fopen(filename,"wb")))
{
printf("\t发生异,请重试!\n");
return;
}
if(head)
{
printf("\t正在更新通讯录数据!\n");
info=head;
while(info)
{
if(fwrite(info,sizeof(struct address),1,fp)!=1)
return;
info=info->next;
}
printf("\t成功更新通讯录!\n");
fclose(fp);
}
else
printf("\t已经没有了通讯录信息!\n\n");
}
void del()
{
struct address * info,*pbefore=NULL,*p;
char name[20],filename[80]="love";
load(filename);
if(!head)return;
inputs("\t请输入要删除的姓名:",name,19);
info=tell(name);
if(info)
{
p=head;
while(p!=info)
{
pbefore=p;
p=p->next;
}
if(p==head)
head=head->next;
else
pbefore->next=p->next;
free(info);
resave(filename);
printf("\t已成功删除名字为“%s”的通讯记录!\n",name);
}
else
printf("\t查无此人!\n");
}
void insert()
{
char filename[80]="love";
load(filename);
if(!head)return;
enter();
resave(filename);
}
//1、程序book.cpp
//2、love为临时数据文件。。。没有后缀
# include "stdio.h"
# include "string.h"
# include "stdlib.h"
# include "malloc.h"
# include "linklist.h"
void main()
{
head=NULL;
struct address *t=NULL;
while(1)
{
switch(menu_select())
{
case 1:enter();;save();break;
case 2:insert();break;
case 3:search();break;
case 4:del();break;
case 5:list();break;
case 0: exit(0);break;
while(head)
{
t=head;
head=head->next;
free(t);
}
printf("\t程序已结束!\n");
exit(0);
}
}
}
//3、程序 linklist.h
struct address
{
char name[10];
char qq[40];
char city[10];
char province[10];
char zip[7];
struct address * next;
};
struct address *head;
int i;
int menu_select()
{
int a;
char c[20];
printf("\t请选择功能:\n\n");
printf("\t1.新建并输入通讯录\n");
printf("\t2.添加记录\n");
printf("\t3.按姓名查找通讯地址\n");
printf("\t4.删除一个人的记录\n");
printf("\t5.显示通讯录\n");
printf("\t0.退出\n");
do
{
printf("\t请输入数字选择对应的功能:");
scanf("%d",&a);
gets(c);
}while(a<0||a>5);
return a;
}
void inputs(char * prompt,char *s,unsigned count)
{
char p[255];
do
{
printf(prompt);
gets(p);
if(strlen(p)>count)
printf("\t输入越界了!\n");
}while(strlen(p)>count);
strcpy(s,p);
}
struct address * put_in(struct address * i,struct address * head)
{
struct address * pbefore ,* p;
if(head==NULL)
{
head=i;
head->next=NULL;
return head;
}
p=head;
pbefore=NULL;
while(p)
{
if(strcmp(p->name,i->name)<0)
{
pbefore=p;
p=p->next;
}
else
{
if(p==head)
{
i->next=head;
head=i;
return head;
}
pbefore->next=i;
i->next=p;
return head;
}
}
pbefore->next=i;
i->next=NULL;
return head;
}
void enter()
{
struct address * info;
while(1)
{
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存不足!\n");
return;
}
inputs("\t请输入姓名(输入为空时结束):",info->name,9);
if(!*info->name)
{
free(info);
printf("\n\n\t输入通讯记录结束!\n\n");
return;
}
inputs("\t请输入QQ号码:",info->qq,39);
inputs("\t请输入城市:",info->city,9);
inputs("\t请输入省份名称:",info->province,9);
inputs("\t请输入邮政编码:",info->zip,9);
head=put_in(info,head);
}
}
void save()
{
struct address *info;
FILE *fp;
char filename[80]="love";
if(head)
{
if(!(fp=fopen(filename,"wb")))
{
printf("\t发生异常,请重试!\n");
exit(0);
}
printf("\t正在保存文件!\n");
info=head;
while(info)
{
fwrite(info,sizeof(struct address),1,fp);
info=info->next;
}
fclose(fp);
}
else
printf("\t目前没有通讯信息可以保存!\n\n");
}
void display(struct address * info)
{
printf("\t%2d.姓名:%s\n",++i,info->name);
printf("\t Q Q:%s\n",info->qq);
printf("\t 城市:%s\n",info->city);
printf("\t 省份:%s\n",info->province);
printf("\t 邮编:%s\n",info->zip);
printf("\n");
}
void load(char * filename)
{
struct address *info,*pbefore=NULL;
FILE *fp;
while(head)
{
info=head;
head=head->next;
free(info);
}
if(!(fp=fopen(filename,"rb")))
{
printf("\t发生异常,请重试!\n");
return;
}
printf("\t正在装入文件,请等待!\n");
info=(struct address *)malloc(sizeof(struct address));
if(!info)
{
printf("\t内存不足!\n");
return;
}
head=info;
while(!feof(fp))
{
if(fread(info,sizeof(struct address),1,fp)!=1)
break;
info->next=(struct address *)malloc(sizeof(struct address));
if(!info->next)
{
printf("\t内存不足!\n");
return;
}
pbefore=info;
info=info->next;
}
pbefore->next=NULL;
free(info);
printf("\t已成功装入文件!\n\n");
fclose(fp);
}
void list()
{
struct address * info;
char filename[80]="love";
load(filename);
i=0;
info=head;
while(info)
{
display(info);
info=info->next;
}
printf("\n\n");
}
struct address * find()
{
struct address * info;
char filename[80]="love";
char name[20];
while(head)
{
info=head;
head=head->next;
free(info);
}
load(filename);
info=head;
inputs("\t请输入你想要找的姓名:",name,19);
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void search()
{
struct address * info;
if(info=find())
{
printf("\n\n\t查询结果为:\n\n");
printf("\t姓名:%s\n",info->name);
printf("\tQ Q:%s\n",info->qq);
printf("\t城市:%s\n",info->city);
printf("\t省份:%s\n",info->province);
printf("\t邮篇:%s\n",info->zip);
printf("\n");
}
else
printf("\t查无此人!\n\n");
}
struct address * tell(char * name)
{
struct address * info;
info=head;
while(info)
{
if(!strcmp(name,info->name))
return info;
info=info->next;
}
return NULL;
}
void resave(char * filename)
{
struct address *info;
FILE *fp;
if(!(fp=fopen(filename,"wb")))
{
printf("\t发生异,请重试!\n");
return;
}
if(head)
{
printf("\t正在更新通讯录数据!\n");
info=head;
while(info)
{
if(fwrite(info,sizeof(struct address),1,fp)!=1)
return;
info=info->next;
}
printf("\t成功更新通讯录!\n");
fclose(fp);
}
else
printf("\t已经没有了通讯录信息!\n\n");
}
void del()
{
struct address * info,*pbefore=NULL,*p;
char name[20],filename[80]="love";
load(filename);
if(!head)return;
inputs("\t请输入要删除的姓名:",name,19);
info=tell(name);
if(info)
{
p=head;
while(p!=info)
{
pbefore=p;
p=p->next;
}
if(p==head)
head=head->next;
else
pbefore->next=p->next;
free(info);
resave(filename);
printf("\t已成功删除名字为“%s”的通讯记录!\n",name);
}
else
printf("\t查无此人!\n");
}
void insert()
{
char filename[80]="love";
load(filename);
if(!head)return;
enter();
resave(filename);
}
[本日志由 Lynn 于 2008-02-22 08:55 AM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: C 链表实现通讯录 3L 3lshow 伴湖居者 3Lshow IT设计 平江人的博客
文章来自: 本站原创
Tags: C 链表实现通讯录 3L 3lshow 伴湖居者 3Lshow IT设计 平江人的博客 评论: 0 | 引用: 0 | 查看次数: -
发表评论
上一篇
下一篇
