顺序表实现--通讯录

简介: 顺序表实现--通讯录

前言:

       通过对数据结构--顺序表的学习,了解了顺序表的增加数据,删除数据等功能;我们就可以基于顺序表来实现通讯录,接下来就一起来实现通讯录。

首先我们需要存储通讯录中联系人信息,这里创建一个结构体,

存储联系人姓名、性别、年龄、电话、住址等信息

#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
 
typedef struct personinfo //联系人信息
{
  char name[NAME_MAX];//姓名
  char gender[GENDER_MAX];//性别
  int age; //年龄
  char tel[TEL_MAX];//电话
  char addr[ADDR_MAX];//住址
}person;

这里使用#define定义常量,以后方便修改

现在创建好了应该结构体(联系人信息)那又如何有顺序表来实现呢?

       在数据结构--顺序表中,实现顺序表时,存储的是整形数据,那现在需要将用户信息存储起来,我们就让顺序表存储的数据是我们结构体(联系人信息)。

这里只需将数据类型中 int 改为 结构体类型即可;

typedef struct personinfo Type;//person

因为在结构体定义时就重命名为了person,这里可以使用person替换struct personinfo

       当然,为了方便操作,我们也会将(动态)顺序表(SeqList)重命名成通讯录(Contact)

不过这里需要注意的时:我们是基于顺序表来实现通讯录,我们需要通讯录的头文件,也需要用到顺序表的相关代码,两个头文件在使用时都会用到另一个头文件的东西,而头文件又不能相互包含,(这里在通讯录头文件Contact.h中只需声明顺序表结构体就可以了(不可以直接使用重命名后的结构体名)),顺序表实现的头文件直接包含Contact.h即可(因为会涉及到数据类型重命名和插入、查找数据等)。

       到这里,对于通讯录的实现准备工作已经做的差不多了,接下来就来就实现通讯录:

通讯录功能预览:

我们想要通讯录实现以下几种功能:

  1. 能够保存联系人信息姓名、性别、年龄、电话、地址等
  2. 增加联系人信息
  3. 删除指定联系人
  4. 查找指定联系人
  5. 修改指定联系人
  6. 显示联系人信息

先来看以下这些功能实现代码的头文件

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
 
typedef struct personinfo //联系人信息
{
  char name[NAME_MAX];//姓名
  char gender[GENDER_MAX];//性别
  int age; //年龄
  char tel[TEL_MAX];//电话
  char addr[ADDR_MAX];//住址
}person;
 
typedef struct SeqList Con;//重命名顺序表
 
//通讯录初始化
void ConInit(Con* con);
//通讯录销毁
void ConDesTroy(Con* con);
//查看通讯录
void ConShow(Con* con);
//添加联系人
void ConAdd(Con* con);
//修改联系人
void Conrev(Con* con);
//删除联系人
void ConDel(Con* con);
//查找联系人
void ConFind(Con* con);

接下来就一一实现这些功能函数

通讯录初始化

通讯录销毁

       通讯录的初始化和销毁其实就是顺序表的初始化和销毁,这里直接使用顺序表的初始化和销毁函数即可。

//通讯录初始化
void ConInit(Con* con)
{
  SLInit(con);
}
//通讯录销毁
void ConDesTroy(Con* con)
{
  SLDesTroy(con);
}

查看通讯录

       这里查看联系人信息也就是将联系人信息输出(打印)到电脑屏幕上,先看以下预期效果图

这样在下面依次输出即可,这里就需要一些格式

//查看通讯录
void ConShow(Con* con)
{
  printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
  for (int i = 0; i < con->size; i++)
  {
    printf("%-10s%-10s%-10d%-10s%-10s\n", 
      con->arr[i].name,
      con->arr[i].gender,
      con->arr[i].age,
      con->arr[i].tel,
      con->arr[i].addr);
  }
}

       我这里使用%-10s(%-10d)来限制输出对齐的格式%-10d是靠左对齐。(这里也可以给更多%-20d等)

添加联系人

       接下来就是添加联系人信息,这个这里就先从键盘上读取数据存储进来

}
//添加联系人
void ConAdd(Con* con)
{
  person psi;
  printf("请输入添加的联系人姓名:\n");
  scanf("%s", psi.name);
  printf("请输入添加的联系人性别:\n");
  scanf("%s", psi.gender);
  printf("请输入添加的联系人年龄:\n");
  scanf("%d", &psi.age);
  printf("请输入添加的联系人电话:\n");
  scanf("%s", psi.tel);
  printf("请输入添加的联系人住址:\n");
  scanf("%s", psi.addr);
 
  SLAddEnd(con, psi);
  printf("添加成功\n");
}

这里也可以像下面这种方式直接输入到顺序表数据中。

//添加联系人
void ConAdd(Con* con)
{
  if (con->size >= con->num) {
    Conzengrong(con);
  }
  printf("请输入添加联系人的姓名:\n");
  scanf("%s", con->arr[con->size].name);
  printf("请输入添加联系人的性别:\n");
  scanf("%s", con->arr[con->size].gender);
  printf("请输入添加联系人的年龄:\n");
  scanf("%d", &con->arr[con->size].age);
  printf("请输入添加联系人的电话:\n");
  scanf("%s", con->arr[con->size].tel);
  printf("请输入添加联系人的地址:\n");
  scanf("%s", con->arr[con->size].addr);
  printf("添加成功\n");
  con->size++;
}

       但我们这是基于顺序表来实现的通讯录,这里就使用第一种方式。

这里就不一一测试了;

删除联系人

       删除联系人,我们首先要找到这个联系人信息,就要先写一个函数先找到联系人信息(在查找联系人,修改联系人都会用到):

//按照名字查找
int Find_name(Con* con, char* name)
{
  for (int i = 0; i < con->size; i++) 
  {
    if (strcmp(con->arr[i].name, name) == 0)
    {
      return i;
    }
  }
  return -1;
}

这里如果找到联系人数据,就返回其下标,如果找不到就返回-1;

       接下来就通过查找函数的返回值来删除数据:这里会用到顺序表中删除指定位置的函数

//删除联系人
void ConDel(Con* con)
{
  char name[NAME_MAX];
  printf("请输入删除的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("需要删除的联系人不存在\n");
    return;
  }
  SLDeleve(con, find);
  printf("删除成功\n");
}

当然这里也可以不使用顺序表的函数,直接进行查找到下标如何进行删除,这里就不添加这种方式的代码了,(其实就是将顺序表的代码写到这个函数中)

查找联系人

       与删除函数相同的是,查找也需要先找到指定联系人的下标,再通过下标将数据输出出来

代码如下:

//查找联系人
void ConFind(Con* con)
{
  char name[NAME_MAX];
  printf("请输入查找的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("查找的联系人不存在\n");
    return;
  }
  printf("查找成功\n");
  printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
  printf("%-10s%-10s%-10d%-10s%-10s\n",
    con->arr[find].name,
    con->arr[find].gender,
    con->arr[find].age,
    con->arr[find].tel,
    con->arr[find].addr);
}

修改联系人

       修改与删除和查找都需要先找到指定联系人数据的下标,再通过下标对联系人信息进行操作

//修改联系人
void Conrev(Con* con)
{
  char name[NAME_MAX];
  printf("请输入需要修改的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("需要修改的联系人不存在\n");
    return;
  }
  printf("请输入修改后的联系人姓名:\n");
  scanf("%s", con->arr[find].name);
  printf("请输入修改后的联系人性别:\n");
  scanf("%s", con->arr[find].gender);
  printf("请输入修改后的联系人年龄:\n");
  scanf("%d", &con->arr[find].age);
  printf("请输入修改后的联系人电话:\n");
  scanf("%s", con->arr[find].tel);
  printf("请输入修改后的联系人住址:\n");
  scanf("%s", con->arr[find].addr);
  printf("修改成功\n");
}

到这里通讯录的基本代码已经完了,先来写测试代码来测试以下

测试代码test.c:

#include"SeqList.h"
 
void Contact()
{
  int n = 0;
  Con con;
  ConInit(&con);
  do
  {
    printf("******************************通讯录******************************\n");
    printf("********************1.添加联系人  2.删除联系人********************\n");
    printf("********************3.修改联系人  4.查找联系人********************\n");
    printf("********************5.查看通讯录  0.退出通讯录********************\n");
    printf("******************************************************************\n");
    printf("------------------------------请选择------------------------------\n");
    scanf("%d", &n);
    switch (n)
    {
    case 1:
      ConAdd(&con);
      break;
    case 2:
      ConDel(&con);
      break;
    case 3:
      Conrev(&con);
      break;
    case 4:
      ConFind(&con);
      break;
    case 5:
      ConShow(&con);
      break;
    case 0:
      break;
    default:
      printf("输入错误,请重新输入\n");
 
    }
  } while (n);
  ConDesTroy(&con);
}
int main()
{
  Contact();
  return 0;
}

结果预览


image.png

顺序表实现通讯录

       当然这样写,我们的通讯录信息再程序结束后就丢失了,要想长久保存,我们就要将通讯录信息写到文件中,文件操作相关知识在之前有所了解

这里就不进行文件相关操作了,可以自行尝试

代码总览

       有很多是顺序表实现的相关代码,这里可以直接拿来用,这里只展示通讯录的相关代码,顺序表的代码可以查看上篇文章 顺序表

Contact.c

#include"SeqList.h"
#include"Contact.h"
 
//通讯录初始化
void ConInit(Con* con)
{
  SLInit(con);
}
//通讯录销毁
void ConDesTroy(Con* con)
{
  SLDesTroy(con);
}
//查看通讯录
void ConShow(Con* con)
{
  printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
  for (int i = 0; i < con->size; i++)
  {
    printf("%-10s%-10s%-10d%-10s%-10s\n", 
      con->arr[i].name,
      con->arr[i].gender,
      con->arr[i].age,
      con->arr[i].tel,
      con->arr[i].addr);
  }
}
//添加联系人
void ConAdd(Con* con)
{
  person psi;
  printf("请输入添加的联系人姓名:\n");
  scanf("%s", psi.name);
  printf("请输入添加的联系人性别:\n");
  scanf("%s", psi.gender);
  printf("请输入添加的联系人年龄:\n");
  scanf("%d", &psi.age);
  printf("请输入添加的联系人电话:\n");
  scanf("%s", psi.tel);
  printf("请输入添加的联系人住址:\n");
  scanf("%s", psi.addr);
 
  SLAddEnd(con, psi);
  printf("添加成功\n");
}
//按照名字查找
int Find_name(Con* con, char* name)
{
  for (int i = 0; i < con->size; i++) 
  {
    if (strcmp(con->arr[i].name, name) == 0)
    {
      return i;
    }
  }
  return -1;
}
 
//删除联系人
void ConDel(Con* con)
{
  char name[NAME_MAX];
  printf("请输入删除的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("需要删除的联系人不存在\n");
    return;
  }
  SLDeleve(con, find);
  printf("删除成功\n");
}
//修改联系人
void Conrev(Con* con)
{
  char name[NAME_MAX];
  printf("请输入需要修改的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("需要修改的联系人不存在\n");
    return;
  }
  printf("请输入修改后的联系人姓名:\n");
  scanf("%s", con->arr[find].name);
  printf("请输入修改后的联系人性别:\n");
  scanf("%s", con->arr[find].gender);
  printf("请输入修改后的联系人年龄:\n");
  scanf("%d", &con->arr[find].age);
  printf("请输入修改后的联系人电话:\n");
  scanf("%s", con->arr[find].tel);
  printf("请输入修改后的联系人住址:\n");
  scanf("%s", con->arr[find].addr);
  printf("修改成功\n");
}
//查找联系人
void ConFind(Con* con)
{
  char name[NAME_MAX];
  printf("请输入查找的联系人姓名:\n");
  scanf("%s", name);
  int find = Find_name(con, name);
  if (find < 0)
  {
    printf("查找的联系人不存在\n");
    return;
  }
  printf("查找成功\n");
  printf("%-10s%-10s%-10s%-10s%-10s\n", "姓名", "性别", "年龄", "电话", "住址");
  printf("%-10s%-10s%-10d%-10s%-10s\n",
    con->arr[find].name,
    con->arr[find].gender,
    con->arr[find].age,
    con->arr[find].tel,
    con->arr[find].addr);
}

Coontact.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 50
 
typedef struct personinfo //联系人信息
{
  char name[NAME_MAX];//姓名
  char gender[GENDER_MAX];//性别
  int age; //年龄
  char tel[TEL_MAX];//电话
  char addr[ADDR_MAX];//住址
}person;
 
typedef struct SeqList Con;//重命名顺序表
 
//通讯录初始化
void ConInit(Con* con);
//通讯录销毁
void ConDesTroy(Con* con);
//查看通讯录
void ConShow(Con* con);
//添加联系人
void ConAdd(Con* con);
//修改联系人
void Conrev(Con* con);
//删除联系人
void ConDel(Con* con);
//查找联系人
void ConFind(Con* con);

感谢各位大佬支持并指出问题,

如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!

相关文章
|
5月前
|
存储
基于静态顺序表实现通讯录
基于静态顺序表实现通讯录
|
12月前
通讯录的实现(增删查改排序)(2)
本课题模拟通讯录的实现,包括: 1.增加联系人的信息 2.删除联系人 3.查找联系人 4.修改联系人信息 5.对联系人进行排序
36 0
|
12月前
|
Go
通讯录的实现(增删查改排序)(1)
本课题模拟通讯录的实现,包括: 1.增加联系人的信息 2.删除联系人 3.查找联系人 4.修改联系人信息 5.对联系人进行排序
64 0
|
2月前
|
Java C++
【C项目】顺序表
【C项目】顺序表
|
3月前
|
存储 C语言
顺序表项目实战(基于动态顺序表实现通讯录)
顺序表项目实战(基于动态顺序表实现通讯录)
|
4月前
基于顺序表 --- 实现简易【通讯录】
基于顺序表 --- 实现简易【通讯录】
20 0
顺序表应用——通讯录实现
顺序表应用——通讯录实现
|
5月前
|
存储
【数据结构】----顺序表项目-通讯录
【数据结构】----顺序表项目-通讯录
24 0
|
5月前
|
存储 算法
|
5月前
顺序表的应用之通讯录
学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。
37 0