C 链表实现通讯录

//大家可以参考一下。



//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);  
}




评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.