C语言实现简单电子通讯录(2)

2020-06-28 17:00:50于丽

本文实例为大家分享了C语言实现简单电子通讯录的具体代码,供大家参考,具体内容如下

这两天学完系统调用和标准IO,之前的通讯录可以进行一些改进,将数据保存到文件中(图我这里就不发了)。

原理:每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息,然后将读取到的信息导入到结构体中;每次执行退出时,先将预设文件以更新方式打开,并将文件中之前保存的信息清空,然后将结构体的数据保存到文件中去,再退出程序。

还有在文件写入时和读取时,先写入(读取)保存数据的总个数,让程序知道有多少数据要写入(读取),然后保存每个数据的字节数(程序会根据每个数据的字节数来进行保存),最后再保存数据。

与之前版本相比,改动的只有主函数中加入了读取文件和写入数据这两个步骤,还有的变动就是结构体从一个变成了两个,将指针从原来一个结构体中分离出来,方便数据从文件中的导入导出。下面是代码(免得你们往前翻,我把之前的代码都修改了考过来):

头文件 head.h 唯一修改的就是结构体

#ifndef HEAD_H_
#define HEAD_H_

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>       // sleep函数头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define uint unsigned int
#define OK      0
#define ERROR     -1
#define MALLOC_ERROR -2
#define N       20 


typedef int ElementType;
typedef struct data
{
  ElementType ID;       // ID号
  char Name [N];       // 姓名
  char Mobile_Phone [N];   // 手机号码
  char Home_Address [N];   // 家庭住址
  char Company_Tell [N];   // 公司电话

}Data;
typedef struct _Node
{
  Data data;
  struct _Node* next;     // 节点指针
}Node;

typedef Node* PNode;      // 重命名节点指针类型

//显示操作界面
int Interface_Display ();

//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num);

//显示所有好友信息
int Friend_Information (PNode head);

//查找好友
int Search_Friend (PNode head, char* Name);

//删除好友
void Delete_Friend (PNode head, char* Name);

#endif

源文件 head.c 关于结构体的部分要进行修改

#include "head.h"

//显示操作界面
int Interface_Display ()
{
  system ("clear");
  printf ("t*****************************************n");
  printf ("t~     欢迎使用通讯录        ~n");
  printf ("t~                    ~n");
  printf ("t~   1 >>>>>>>> 添加好友信息     ~n");
  printf ("t~   2 >>>>>>>> 列表好友信息     ~n");
  printf ("t~   3 >>>>>>>> 搜索好友       ~n");
  printf ("t~   4 >>>>>>>> 删除好友       ~n");
  printf ("t~   5 >>>>>>>> 退出         ~n");
  printf ("t~                    ~n");
  printf ("t~                    ~n");
  printf ("t~            作者:believe ~n");
  printf ("t*****************************************n");
  printf ("                      n");
  printf ("                      n");
  printf ("t请输入对应数字选择相应功能:");
}

//添加好友信息 (尾插法)
int Add_Friend (PNode head, ElementType num)
{
  if (NULL == head)
  {
    return ERROR;
  }

  //创建一个新的结点
  PNode p = (PNode) malloc(sizeof(Node)/sizeof(char));
  if (NULL == p)
  {
    return MALLOC_ERROR;
  }

  //将新数据赋给新结点
  system("clear");  
  printf ("t*************添加好友***************n");

  p->data.ID = num;
  printf ("t好友的ID为:%dn", p->data.ID);
  printf ("n");

  printf ("t请输入好友的名字:");
  scanf ("%s", p->data.Name);
  printf ("n");

  printf ("t请输入好友的手机号:");
  scanf ("%s", p->data.Mobile_Phone);
  printf ("n");

  printf ("t请输入好友的家庭住址:");
  scanf ("%s", p->data.Home_Address);
  printf ("n");

  printf ("t请输入好友的公司电话:");
  scanf ("%s", p->data.Company_Tell);
  printf ("n");

  p->next = NULL;

  //找到最后一个结点
  PNode Ptmp;         //将头结点地址给临时指针Ptmp
  Ptmp = head;
  while (Ptmp->next)
  {
    Ptmp = Ptmp->next;
  }
  Ptmp->next = p;

  return OK;

}

//显示所有好友信息
int Friend_Information (PNode head)
{
  if (NULL == head)
  {
    return ERROR;
  }

  PNode p = head->next;

  printf ("tIDt姓名tt手机号tt住址ttt公司电话n");

  while (p)
  {
    printf ("t%dt%stt%stt%sttt%sn", p->data.ID, p->data.Name,p->data.Mobile_Phone, p->data.Home_Address, p->data.Company_Tell);
    p = p->next;
  }
  putchar('n');

  return OK;
}

//通过名字查找好友
int Search_Friend (PNode head, char* Name)     
{
  PNode p = head;
  PNode q = NULL;

  if ((NULL != p) && NULL != (p->next))
  {
    while (p->next) 
    {
      q = p->next;
      if ((NULL != q) && 0 == (strcmp(q->data.Name, Name)))
      {
        printf ("t好友信息: ntID:%dnt姓名: %snt手机号码: %snt家庭地址:%snt公司电话: %sn", q->data.ID, q->data.Name, q->data.Mobile_Phone, q->data.Home_Address, q->data.Company_Tell);
      }
      else
      {
        printf ("t对不起,您的通讯录没有该好友!n");
      }
      p = p->next;
    }
  }

  /* 另一种做法
  if (NULL == head)
  {
    return ERROR;
  }

  PNode p;
  int flag = 1;
  for (p = head->next; p != NULL; p = p->next)
  {
    if (0 == strcmp(p->data.Name, Name))
    {
      flag = 0;
      printf ("t好友信息:ntID: %dnt姓名: %snt手机号码: %snt家庭地址: %snt公司电话: %sn", p->data.ID, p->data.Name, p->data.Mobile_Phone, p->data.Home_Address, p->data.Company_Tell);
    }
  }
  fi (flag)
  {
    printf ("t对不起,您的通讯录没有该好友!n");
  }

  putchar('n');
  */

  return OK;
}

//删除好友
void Delete_Friend (PNode head, char* Name)
{
  PNode p = head;
  PNode q = NULL;

  while (NULL != p && NULL != (p->next))
  {
    q = p->next;
    if (NULL != q && 0 == strcmp(q->data.Name, Name))
    {
      p->next = q->next;
      free(q);

      int j;

      printf ("t正在删除n");
      printf ("t请稍候");
      fflush (stdout);      //强制刷新缓存,输出显示
      for (j = 0; j < 2; j++)
      {
        sleep (1);       //linux使用sleep,参数为秒
        printf (".");
        fflush(stdout);     //强制刷新缓存,输出显示
      }
      printf ("n");
      printf ("t该好友已成功删除!n");
    }
    else if (NULL == q->next && 0 != strcmp(q->data.Name, Name))
    {
      printf ("t您的通讯录没有该好友!n");
    }
    p = p->next;
  }
}