通讯录(链表+文件读写)

想复习下链表的操作,就写了个简易的通讯录。同时也实现了文件的读写,可以把输入的数据永久性的保存到该目录下的文件。在这里分享下!

头文件

首先写一个通讯录的头文件 contacts.h

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <conio.h>
#include <synchapi.h>
#define NAME_SIZE 50                    //名字长度//
#define SEX_SIZE 20                     //性别字符长度//
#define PHONE_SIZE 50                   //电话号码长度//
typedef struct Contact_Node{
  char Name[NAME_SIZE];
  char Sex[SEX_SIZE];
  char Phone[PHONE_SIZE];
  struct Contact_Node *Link;
}*pContacts,Contact;
void Menu ();                             //功能菜单//
void Add ();                              //新建联系人//
void Delete();                            //删除联系人//
void View_Contacts();                     //查看所有联系人//
void Find ();                             //查找指定联系人//
void revise();                            //修改联系人//
pContacts Read_Contacts();                //将文件数据以链表方式读出//
void Write_Contacts(pContacts Head);      //链表写入文件//

菜单

自己打印个框!!!1

void Menu (){
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("         ☆                                                                          ★\n");
  printf("         ★                               1.新建联系人信息                             ☆\n");
  printf("         ☆                                                                          ★\n");
  printf("         ★                               2.浏览所有联系人                             ☆\n");
  printf("         ☆                                                                          ★\n");
  printf("         ★                               3.查找联系人信息                             ☆\n");
  printf("         ☆                                                                          ★\n");
  printf("         ★                               4.修改联系人信息                             ☆\n");
  printf("         ☆                                                                          ★\n");
  printf("         ★                               5.删除联系人信息                             ☆\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                 输入0退出系统                              ☆\n");
  printf("         ☆--------------------------------------------------------------------------★\n\n");
}

主函数

这个是程序的入口,开始我设置了下控制台打开的大小!

int main (){
  system("mode con cols=100 lines=25");
  int Input;
  do{
    Menu();
    printf("                                               ");
    scanf("%d",&Input);
    switch (Input){
    case 1:
      system("cls");
      Add ();
      break;
    case 2:
      system("cls");
      View_Contacts();
      break;
    case 3:
      system("cls");
      Find ();
      break;
    case 4:
      system("cls");
      revise();
      break;
    case 5:
      system("cls");
      Delete();
      break;
    case 0:return 0;
    default:printf("请输入合适的数字!\n");
    }
  }while (1);
}

文件数据以链表方式读出

我是用fscanf读的文件中的内容,然后把他们链表方式连接,和链表的创建相似

pContacts Read_Contacts(){
  pContacts Head,Tail,New;
  FILE *fp;
  fp=fopen("contacts.txt","r");
  if (fp==NULL)
  {
    printf("通讯录打开失败!\n");
    exit(-1);
  }
  Head=(pContacts)malloc(sizeof(Contact));
  Head->Link=NULL;
  Tail=Head;
  char Name[NAME_SIZE];
  char Sex[SEX_SIZE];
  char Phone[PHONE_SIZE];
  while (fscanf(fp,"%s%s%s",Name,Sex,Phone)!=EOF){
    New=(pContacts)malloc(sizeof(Contact));
    strcpy(New->Name,Name);
    strcpy(New->Sex,Sex);
    strcpy(New->Phone,Phone);
    New->Link=NULL;
    Tail->Link=New;
    Tail=New;
  }
  fclose(fp);
  return Head;
}

链表写入文件

我用的fprint把链表一个一个写到文件

void Write_Contacts(pContacts Head){
  pContacts p;
  FILE *fp;
  fp=fopen("contacts.txt","w");
  if (fp==NULL)
  {
    printf("通讯录打开失败!\n");
    exit(-1);
  }
  p=Head->Link;
  while (p!=NULL)
  {
    fprintf(fp,"%s %s %s\n",p->Name,p->Sex,p->Phone);
    p=p->Link;
  }
  fclose(fp);
}

新建联系人

这里就是基本的链表操作了,唯一就是先在文件里面读出链表,插入新节点后再把链表读入到文件中

void Add (){
  pContacts Head,New;
  Head=Read_Contacts();
  New=(pContacts)malloc(sizeof(Contact));
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("                                                                                       \n");
  printf("                                            请输入姓名:\n");
  printf("                                               ");
  scanf("%s",New->Name);
  printf("                                            请输入性别:\n");
  printf("                                                ");
  scanf("%s",New->Sex);
  printf("                                            请输入号码:\n");
  printf("                                            ");
  scanf("%s",New->Phone);
  New->Link=Head->Link;
  Head->Link=New;
  Write_Contacts(Head);
  printf("                                             保存成功!\n");
  Sleep(1500);
  system("cls");
  free(New);
  free(Head);
}

查看所有联系人

对链表进行一次遍历

void View_Contacts(){
  pContacts Head,p;
  Head=Read_Contacts();
  p=Head->Link;
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("                                                                                       \n");
  if (p!=NULL){
    printf("                       \t\t姓名\t\t性别\t\t   号码\n");
    printf("         ☆**************************************************************************★\n");
  }
  else{
    printf("                                            此通讯录为空!\n");
    Sleep(1500);
    system("cls");
  }
  while (p!=NULL){
    printf("                      \t\t%s\t\t %s\t\t%s\n",p->Name,p->Sex,p->Phone);
    printf("         ☆**************************************************************************★\n");
    p=p->Link;
  }
  printf("\n                                             ");
  system("pause");
  system("cls");
  free(Head);
  free(p);
}

查找指定联系人

也是对链表遍历在做匹配

void Find (){
  pContacts Head;
  char Name[NAME_SIZE];
  int flag=0;
  Head=Read_Contacts();
  pContacts p;
  p=Head->Link;
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("                                                                                       \n");
  printf("                                       请输入查询联系人姓名:\n");
  printf("                                               ");
  scanf("%s",Name);
  while (p!=NULL){
    if (strcmp(p->Name,Name)==0)
    {
      flag=1;
      printf("\n");
      printf("                       \t\t姓名\t\t性别\t\t   号码\n");
      printf("         ☆**************************************************************************★\n");
      printf("                      \t\t%s\t\t %s\t\t%s\n",p->Name,p->Sex,p->Phone);
      printf("         ☆**************************************************************************★\n");
      break;
    }
    p=p->Link;
  }
  if (!flag)
  {
    printf("         ☆**************************************************************************★\n");
    printf("                                              查无此人!\n");
    printf("         ☆**************************************************************************★\n");
  }
  printf("\n                                             ");
  system("pause");
  system("cls");
}

修改联系人

遍历链表修改制定数据

void revise(){
  pContacts Head,p;
  Head=Read_Contacts();
  char Name[NAME_SIZE];
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("                                                                                       \n");
  printf("                                    请输入需要修改的联系人姓名:\n");
  printf("                                               ");
  scanf("%s",Name);
  p=Head->Link;
  int flag=0;
  while (p!=NULL){
    if (strcmp(p->Name,Name)==0){
      flag=1;
      printf("                                    请输入需要修改的联系人姓名:\n");
      printf("                                               ");
      scanf("%s",p->Name);
      printf("                                    请输入需要修改的联系人性别:\n");
      printf("                                               ");
      scanf("%s",p->Sex);
      printf("                                    请输入需要修改的联系人号码:\n");
      printf("                                               ");
      scanf("%s",p->Phone);
      printf("         ☆**************************************************************************★\n");
      printf("                                              修改成功!\n");
      printf("         ☆**************************************************************************★\n");
      Write_Contacts(Head);
      break;
    }
    p=p->Link;
  }
  free(Head);
  free(p);
  if (!flag)
  {
    printf("         ☆**************************************************************************★\n");
    printf("                                              查无此人!\n");
    printf("         ☆**************************************************************************★\n");
  }
  Sleep(1500);
  system("cls");
}

删除联系人

链表的基本删除

void Delete(){
  pContacts Head;
  pContacts *top,tail;
  int flag=0;
  char Name[NAME_SIZE];
  Head=Read_Contacts();
  printf("                  ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★\n");
  printf("         ☆**************************************************************************★\n");
  printf("         ★                                通讯录管理系统                              ☆\n");
  printf("                                                                                       \n");
  printf("                           \t\t请输入删除联系人的姓名:\n");
  printf("                                      \t\t");
  scanf("%s",Name);
  top=&Head->Link;
  tail=*top;
  while (tail!=NULL)
  {
    if (strcmp(tail->Name,Name)==0) {
      flag=1;
      *top=tail->Link;
      free(tail);
      printf("                                               删除成功!\n");
      break;
    }
    else{
      top=&(tail->Link);
      tail=tail->Link;
    }
  }
  Write_Contacts(Head);
  if (!flag)
  {
    printf("                                          通讯录没有此人!\n");
  }
  Sleep(1500);
  system("cls");
  free(Head);
}
实训项目,满足以下要求 【要求】 (1)程序的主窗口如左图所示。 程序启动时,窗口左边的“姓名”列表框中显示了本软件中已保存的所有人员姓名,从中选择一个姓名,窗口左边的“详细信息”区域显示出此人的详细通讯录内容。 (2)窗口顶部“城市”和“性别”两个列表框中列出了可供选择的城市名称和姓名。使用这两个控件,可以筛选出感兴趣的内容。例如,在“城市”中选择“南京”,在性别中选择“男”,则在“姓名”列表框中只显示出程序所保存的住在南京的男性人员。选择“城市”和“性别”中的“全部”,则列出所有人员。 (3)单击“添加”按钮 ,弹出一个对话框。通过此对话框,可以添加新的通讯录条目。在添加新条目时,所在城市应从组合框中选择,若组合框中没有想要的城市,可以直接在组合框中键入。要求键入的新城市名能自动添加到“添加”对话框中“所在城市”组合框和主窗口中“城市”组合框的下拉列表中。 (4)在主窗口中点击“删除”按钮 可以删除当前显示的条目。 (5)增加“保存”和“打开”按钮或菜单项,要求能够自动保存所做的添加和删除操作。 (6)所有的数据保存在.txt文件中,并能读出。比如.txt文件的每一行保存一条记录。如:姓名|性别|生日…………【可选用CFile/CStdioFile类】 【提示】创建通讯类,包括姓名、性别、生日、所在城市、工作单位、办公电话、住宅电话等必要信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值