前言
前面的两节我们弄清了顺序表是什么?顺序表是怎么实现的?此时大家可能有疑问了:顺序表被创造出来具体有什么用呢?那么本节就给大家带来顺序表的应用--通讯录的实现,废话不多说,我们正式进入本节的学习
基于顺序表实现通讯录项目
通讯录的前置
我们在日常生活中都使用过通讯录。通讯录里面的一条联系人数据通常会包含以下的内容:
通讯人的姓名、性别、年龄、电话号码、家庭住址等等,通讯录里面通常包含多条联系人数据
之前我们讲解的顺序表的类型是 int 类型的,但是通讯录里面的数据多种多样,仅仅使用 int 类型的顺序表是肯定无法完成通讯录的实现的,我们知道顺序表可以存储 int 、char 等类型的数据,所以顺序表中也可以存入自定义类型的数据,所以此时我们就让顺序表“升级”一下,我们在顺序表中存入结构体,每个结构体里面都包含每个联系人的数据,我们设结构体的名称为 personInfo ,该结构体里面存放联系人的 姓名、性别、年龄、等数据,我们把这些数据称作联系人数据,我们将每一条联系人数据存入数组,我们就可以存储多个联系人数据
通讯录的实现
我们先来定义联系人数据结构:
typedef struct personInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}peoInfo;
我们再在顺序表的头文件里面改一下类型:
将顺序表改成通讯录
定义 Contact.h 文件
我们根据联系人数据来定义一下Contact.h 文件,同时该文件里面包含了通讯录的操作:
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10 //male female
#define TEL_MAX 20
#define ADDR_MAX 100
//定义联系人数据结构
//姓名 性别 年龄 电话号码 地址
typedef struct personInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}peoInfo;
//与通讯录相关的方法--要用到顺序表里面的操作
//给顺序表重新命名,将其命名为通讯录
typedef struct Seqlist Contact;
//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTory(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录的查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);
我们在这里尤其需要注意一下这一步的代码:
typedef struct Seqlist Contact;
对通讯录进行初始化的过程在本质上其就是对顺序表进行初始化,此时我们给顺序表重新命名一下,就把他的名字改成通讯录
我们此时需要修改一下之前顺序表的代码,因为之前顺序表的实现是 int 类型的,而现在通讯录是自定义类型的。之前编写的代码和现在的代码肯定会有所冲突,我们将有冲突的代码直接删除或者注释掉,再适当的更改某些地方的代码,让他不再报错,此时修改过的文件应该如下
Seqlist.h 文件的修改:
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "contact.h"
typedef peoInfo SLDataType;
//动态顺序表
typedef struct Seqlist
{
SLDataType* arr;
int size;//有效数据的个数
int capacity;//空间大小
}SL;
//顺序表的初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestory(SL* ps);
//顺序表的头部 插入 和 删除 + 顺序表的 尾部 插入 和 删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
//顺序表的打印
void SLPrint(SL s);
//在顺序表的指定位置之前插入和删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);
我们需要在该文件里面包含 "contact.h" 文件
Seqlist.c 文件的修改:
#define _CRT_SECURE_NO_WARNINGS 1
//静态顺序表
//struct Seqlist
//{
// int arr[100];
// int size;//记录顺序表当前有效数据的个数
//
//
//};
//动态顺序表
//struct Seqlist
//{
// int* arr;
// int size;//有效的数据个数
// int capacity;//记录空间大小
//};
#include"Seqlist.h"
void SLInit(SL* ps)
{
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
//顺序表的销毁
void SLDestory(SL* ps)
{
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{
//插入数据前看空间够不够
if (ps->capacity == ps->size)
{
//申请空间
//判断capacity是否为0
int newCapaciy = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapaciy * sizeof(SLDataType));
if (tmp == NULL)
{
perror("realloc fail!");
exit(1);
//直接退出程序,不再继续执行
}
//空间申请成功
ps->arr = tmp;
ps->capacity = newCapaciy;
}
}
//尾插
void SLPushBack(SL* ps, SLDataType x)
{
if (ps == NULL)
{
return;
}
SLCheckCapacity(ps);
ps->arr[ps->size] = x;
++ps->size;
//或者写作 ps->arr[ps->size++] = x;
}
//头插
void SLPushFront(SL* ps, SLDataType x)
{
if (ps == NULL)
{
return;
}
SLCheckCapacity(ps);
//先让顺序表中的数据向后挪动一位
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]
}
ps->arr[0] = x;
ps->size++;
}
打印
//void SLPrint(SL s)
//{
// for (int i = 0; i < s.size; i++)
// {
// printf("%d ", s.arr[i]);
// }
// printf("\n");
//}
//尾部删除
void SLPopBack(SL* ps)
{
if (ps == NULL)
{
return;
}
if (ps->size == 0)
{
return;
}
--ps->size;
}
//头部删除
void SLPopFront(SL* ps)
{
if (ps == NULL)
{
return;
}
if (ps->size == 0)
{
return;
}
//数据整体前挪
for (int i = 0; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
//pos后数据整体后挪
for (int i = ps->size; i > pos; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
ps->size++;
}
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
for (int i = pos; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
顺序表的查找
//int SLFind(SL* ps, SLDataType x)
//{
// assert(ps);
// for (int i = 0; i < ps->size; i++)
// {
// if (ps->arr[i] == x)
// {
// //此时已经找到了
// return i;
// }
// }
// //没有找到
// return -1;
//}
我们把报错了的代码全部都注释掉,此时的代码如上所示
通讯录的初始化
对通讯录的初始化实际上是要进行顺序表的初始化,顺序表的初始化在之前就已经实现好了,我们可以将其引入 Contact.c 文件中,就可以直接使用了
#include "Seqlist.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
//实际上是要进行顺序表的初始化
//顺序表的初始化在之前就已经实现好了
SLInit(con);
}
通讯录的销毁
对通讯录的销毁其实在本质上就是对顺序表的销毁,所以我们就可以编写出代码如下:
//通讯录的销毁
void ContactDesTroy(Contact* con)
{
SLDestory(con);
}
通讯录添加数据
我们首先需要在键盘上获取用户的数据:联系人姓名、性别、年龄、电话号码、地址
然后再把它存入通讯录中:
//通讯录添加数据
void ContactAdd(Contact* con)
{
//获取用户输入的内容:联系人姓名、性别、年龄、电话号码、地址
peoInfo info;
printf("请输入要添加的联系人姓名:\n");
scanf("%s", info.name);
printf("请输入要添加的联系人性别:\n");
scanf("%s", info.gender);
printf("请输入要添加的联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入要添加的联系人电话号码:\n");
scanf("%s", info.tel);
printf("请输入要添加的联系人住址:\n");
scanf("%s", info.addr);
//往通讯录中添加联系人数据
SLPushBack(con, info);
}
我们此时在 test 文件中测试一下:
void ContactTest01()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactDesTory(&con);
}
int main()
{
ContactTest01();
return 0;
}
运行成功,没有报错
通讯录删除数据
我们要想删除数据,其前提条件是该数据必须存在,只有存在的数据才能执行删除操作
在删除文件前,我们需要找到联系人信息,我们可以用多种方式去找到联系人信息--可以用姓名、电话号码、住址等,我们就选择通过姓名来找到联系人吧:
int FindByName(Contact* con, char name[])
{
for (int i = 0; i < con->size; i++)
{
if(0 == strcmp(con->arr[i].name,name));
{
//找到了
return i;
}
}
//没有找到
return -1;
}
如果要删除的联系人数据存在,那么我们此时就知道了要删除的联系人数据对应的下标
所以我们此时就可以写出删除联系人的代码:
//通讯录删除数据
void ContactDel(Contact* con)
{
//数据只有存在才能被删除
//查找
char name[NAME_MAX];
printf("请输入要删除的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要删除的联系人数据不存在\n");
return;
}
//要删除的联系人数据存在--知道了要删除的联系人数据对应的下标
SLErase(con, find);
printf("删除成功!\n");
}
展示通讯录数据
我们需要针对类似于表格的形式展示联系人数据,所以我们还需要打印一个表头
//展示通讯录数据
void ContactShow(Contact* con)
{
//表头:姓名、性别、年龄、电话号码、地址
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话号码", "地址");
//展示数据,遍历通讯录,打印每个联系人数据
for (int i = 0; i < con->size; i++)
{
printf("%s %s %d %s %s\n",
con->arr[i].name, \
con->arr[i].gender, \
con->arr[i].age, \
con->arr[i].tel, \
con->arr[i].addr
);
}
}
我们来测试一下:
可以看到它的运行没有出现错误
通讯录的修改
要修改通讯录,其前提是要修改的联系人数据存在
void ContactModify(Contact* con)
{
//要修改的联系人数据存在
char name[NAME_MAX];
printf("请输入要修改的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(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 ContactTest01()
{
Contact con;
ContactInit(&con);
ContactAdd(&con);
ContactAdd(&con);
ContactShow(&con);
/*ContactDel(&con);*/
ContactModify(&con);
ContactShow(&con);
ContactDesTory(&con);
}
代码运行成功,没有存在问题
通讯录的查找
之前我们在删除和修改数据的时候定义了一个通过姓名来查找的函数,但它仅仅只能返回数组里面的下标,我们想要通过查找来打印出所有的联系人信息
据此我们可以写出代码如下:
//通讯录的查找
void ContactFind(Contact* con)
{
char name[NAME_MAX];
printf("请输入要查找的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要查找的联系人数据不存在\n");
return;
}
//按照格式打印:
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话号码", "地址");
printf("%3s %3s %3d %3s %3s\n",
con->arr[find].name, \
con->arr[find].gender, \
con->arr[find].age, \
con->arr[find].tel, \
con->arr[find].addr
);
}
我们再来测试一下:
查找的功能实现成功
整合通讯录
之前我们在测试的都是单一代码的展现,通讯录是一个完整的功能,我们要把通讯录整合起来,创造一个菜单,来让用户自行选择通讯录的操作,让通讯录的功能变得完整:
void menu()
{
printf("*************************通讯录***********************\n");
printf("***********1.增加联系人 2.删除联系人**********\n");
printf("***********3.修改联系人 4.查找联系人**********\n");
printf("***********5.展示联系人 0.退出此程序**********\n");
printf("******************************************************\n");
}
int main(void)
{
int op = -1;
Contact con;
ContactInit(&con);
do
{
menu();
printf("请选择您的操作:\n");
scanf("%d", &op);
//根据 op 来选择操作
switch (op)
{
case 1:
ContactAdd(&con);
break;
case 2:
ContactDel(&con);
break;
case 3:
ContactModify(&con);
break;
case 4:
ContactFind(&con);
break;
case 5:
ContactShow(&con);
break;
case 0:
printf("退出通讯录...\n");
break;
default:
printf("没有此操作,请重新选择\n");
break;
}
}while(op != 0);
ContactDesTory(&con);
return 0;
}
程序包装完美,通讯录功能成功实现
全代码展示
Seqlist.h:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "contact.h"
typedef peoInfo SLDataType;
//动态顺序表
typedef struct Seqlist
{
SLDataType* arr;
int size;//有效数据的个数
int capacity;//空间大小
}SL;
//顺序表的初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestory(SL* ps);
//顺序表的头部 插入 和 删除 + 顺序表的 尾部 插入 和 删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
//顺序表的打印
void SLPrint(SL s);
//在顺序表的指定位置之前插入和删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);
int SLFind(SL* ps, SLDataType x);
Seqlist.c:
#define _CRT_SECURE_NO_WARNINGS 1
//静态顺序表
//struct Seqlist
//{
// int arr[100];
// int size;//记录顺序表当前有效数据的个数
//
//
//};
//动态顺序表
//struct Seqlist
//{
// int* arr;
// int size;//有效的数据个数
// int capacity;//记录空间大小
//};
#include"Seqlist.h"
void SLInit(SL* ps)
{
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
//顺序表的销毁
void SLDestory(SL* ps)
{
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void SLCheckCapacity(SL* ps)
{
//插入数据前看空间够不够
if (ps->capacity == ps->size)
{
//申请空间
//判断capacity是否为0
int newCapaciy = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapaciy * sizeof(SLDataType));
if (tmp == NULL)
{
perror("realloc fail!");
exit(1);
//直接退出程序,不再继续执行
}
//空间申请成功
ps->arr = tmp;
ps->capacity = newCapaciy;
}
}
//尾插
void SLPushBack(SL* ps, SLDataType x)
{
if (ps == NULL)
{
return;
}
SLCheckCapacity(ps);
ps->arr[ps->size] = x;
++ps->size;
//或者写作 ps->arr[ps->size++] = x;
}
//头插
void SLPushFront(SL* ps, SLDataType x)
{
if (ps == NULL)
{
return;
}
SLCheckCapacity(ps);
//先让顺序表中的数据向后挪动一位
for (int i = ps->size; i > 0; i--)
{
ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]
}
ps->arr[0] = x;
ps->size++;
}
打印
//void SLPrint(SL s)
//{
// for (int i = 0; i < s.size; i++)
// {
// printf("%d ", s.arr[i]);
// }
// printf("\n");
//}
//尾部删除
void SLPopBack(SL* ps)
{
if (ps == NULL)
{
return;
}
if (ps->size == 0)
{
return;
}
--ps->size;
}
//头部删除
void SLPopFront(SL* ps)
{
if (ps == NULL)
{
return;
}
if (ps->size == 0)
{
return;
}
//数据整体前挪
for (int i = 0; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
//pos后数据整体后挪
for (int i = ps->size; i > pos; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
ps->size++;
}
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
for (int i = pos; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1];
}
ps->size--;
}
顺序表的查找
//int SLFind(SL* ps, SLDataType x)
//{
// assert(ps);
// for (int i = 0; i < ps->size; i++)
// {
// if (ps->arr[i] == x)
// {
// //此时已经找到了
// return i;
// }
// }
// //没有找到
// return -1;
//}
Contact.h:
#pragma once
#define NAME_MAX 20
#define GENDER_MAX 10 //male female
#define TEL_MAX 20
#define ADDR_MAX 100
//定义联系人数据结构
//姓名 性别 年龄 电话号码 地址
typedef struct personInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}peoInfo;
//与通讯录相关的方法--要用到顺序表里面的操作
//给顺序表重新命名,将其命名为通讯录
typedef struct Seqlist Contact;
//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTory(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录的查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);
Contact.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
#include "Seqlist.h"
//通讯录的初始化
void ContactInit(Contact* con)
{
//实际上是要进行顺序表的初始化
//顺序表的初始化在之前就已经实现好了
SLInit(con);
}
//通讯录的销毁
void ContactDesTory(Contact* con)
{
SLDestory(con);
}
//通讯录添加数据
void ContactAdd(Contact* con)
{
//获取用户输入的内容:联系人姓名、性别、年龄、电话号码、地址
peoInfo info;
printf("请输入要添加的联系人姓名:\n");
scanf("%s", info.name);
printf("请输入要添加的联系人性别:\n");
scanf("%s", info.gender);
printf("请输入要添加的联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入要添加的联系人电话号码:\n");
scanf("%s", info.tel);
printf("请输入要添加的联系人住址:\n");
scanf("%s", info.addr);
//往通讯录中添加联系人数据
SLPushBack(con, info);
}
int FindByName(Contact* con, char name[])
{
for (int i = 0; i < con->size; i++)
{
if(0 == strcmp(con->arr[i].name,name));
{
//找到了
return i;
}
}
//没有找到
return -1;
}
//通讯录删除数据
void ContactDel(Contact* con)
{
//数据只有存在才能被删除
//查找
char name[NAME_MAX];
printf("请输入要删除的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要删除的联系人数据不存在\n");
return;
}
//要删除的联系人数据存在--知道了要删除的联系人数据对应的下标
SLErase(con, find);
printf("删除成功!\n");
}
//展示通讯录数据
void ContactShow(Contact* con)
{
//表头:姓名、性别、年龄、电话号码、地址
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话号码", "地址");
//展示数据,遍历通讯录,打印每个联系人数据
for (int i = 0; i < con->size; i++)
{
printf("%3s %3s %3d %3s %3s\n",
con->arr[i].name, \
con->arr[i].gender, \
con->arr[i].age, \
con->arr[i].tel, \
con->arr[i].addr
);
}
}
//通讯录的修改
void ContactModify(Contact* con)
{
//要修改的联系人数据存在
char name[NAME_MAX];
printf("请输入要修改的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(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 ContactFind(Contact* con)
{
char name[NAME_MAX];
printf("请输入要查找的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要查找的联系人数据不存在\n");
return;
}
//按照格式打印:
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话号码", "地址");
printf("%3s %3s %3d %3s %3s\n",
con->arr[find].name, \
con->arr[find].gender, \
con->arr[find].age, \
con->arr[find].tel, \
con->arr[find].addr
);
}
test.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include"Seqlist.h"
#include"contact.h"
//void SLTest01()
//{
// SL s1;
// SLInit(&s1);
// 测试尾插代码
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPushBack(&s1, 4);
// SLPrint(s1);
// SLPopBack(&s1);
// SLPrint(s1);
//
//
// //.....
// SLDestory(&s1);
//
//}
//
//void SLTest02()
//{
// SL s1;
// SLInit(&s1);
// 测试尾插代码
// SLPushBack(&s1, 1);
// SLPushBack(&s1, 2);
// SLPushBack(&s1, 3);
// SLPushBack(&s1, 4);
// SLPrint(s1);
// //测试删除指定位置数据
// SLErase(&s1, 3);
// //查找数组中的元素1的下标
// SLPrint(s1);
// int find = SLFind(&s1, 8);
// if (find < 0)
// {
// printf("没有找到\n");
// }
//
// else
// {
// printf("找到了,下表为%d\n", find);
// }
//
// SLDestory;
//
//
//}
//测试通讯录的方法
//void ContactTest01()
//{
// Contact con;
// ContactInit(&con);
// ContactAdd(&con);
// ContactAdd(&con);
// ContactShow(&con);
//
// /*ContactDel(&con);*/
// ContactModify(&con);
// ContactShow(&con);
// ContactFind(&con);
//
//
// ContactDesTory(&con);
//}
//
//
//int main()
//{
// ContactTest01();
// return 0;
//}
void menu()
{
printf("*************************通讯录***********************\n");
printf("***********1.增加联系人 2.删除联系人**********\n");
printf("***********3.修改联系人 4.查找联系人**********\n");
printf("***********5.展示联系人 0.退出此程序**********\n");
printf("******************************************************\n");
}
int main(void)
{
int op = -1;
Contact con;
ContactInit(&con);
do
{
menu();
printf("请选择您的操作:\n");
scanf("%d", &op);
//根据 op 来选择操作
switch (op)
{
case 1:
ContactAdd(&con);
break;
case 2:
ContactDel(&con);
break;
case 3:
ContactModify(&con);
break;
case 4:
ContactFind(&con);
break;
case 5:
ContactShow(&con);
break;
case 0:
printf("退出通讯录...\n");
break;
default:
printf("没有此操作,请重新选择\n");
break;
}
}while(op != 0);
ContactDesTory(&con);
return 0;
}
结尾
我们关于顺序表的应用--通讯录的所有内容到这里就结束了,仔细想想,通讯录的代码还有可以优化的空间--我们可以把通讯录与文件操作结合起来,保证在退出程序以后的联系人信息不丢失,具体操作请自己完成,谢谢您的浏览!!!