本次编译环境为VS2022
文章目录
前言
在上次博客中我们了解到动态顺序表的实现了 我们在此基础上应有应用
所以这次给大家带来一个 简单易懂的项目 包括代码的编写和理解
通讯录基于动态顺序表的前提要求和准备事项
1.创建文件
包括一个头文件和一个.c文件

这里给各位解释一下
SL.h SL.c test.c均为顺序表内容的掌握文件
头文件 实现文件 测试文件
同时我们看到有新加入的SXB.h文件 和SXB.c文件 这俩的作用就是在.h文件中书写定义通讯录的内容和方法.c文件则主要是实现方法
2.新定义结构体 和相关顺序表的改变
一. 定义新结构体在sxb.h中
#define Name_Max 20
#define Gender_Max 20
#define Tel_Max 100
#define Address_Max 100
//定义通讯录顺序表
typedef struct personInfo
{
char name[Name_Max];
char gender[Gender_Max];
int age;
char tel[Tel_Max];
char address[Address_Max];
}PeIn;
这里给到的新的结构体内容显而易见
给到宏定义也怕空间不够
二.前置声明和SL.C SL.H的修改
为了我们么方便使用结构体 以及顺序表的嵌套 我们是要给到原顺序表SL重新命名并且将其SLDateType
原来是int类型重新给个名 现在是将通讯录结构体类型赋给SLDatetype


后续会出现报错后我们需要将
顺序表的打印函数和查找函数注释掉 其原因就是两个函数
打印函数就是因为其 ps->arr[i]打印
Find则是return i出现问题 就是因为SLDatetype类型的改变
3.通讯录的实现
一.定义和销毁
1.定义
我们仍然是给到头文件一个定义 来到.c文件进行实行
void ContactInit(Contact* con)
{
SLInit(con);
}
我们可以看到 通讯录的定义其实就是 引用了我们在顺序表的 定义 将其函数来进行调用即可 在此过程中 指针的传递切记不能忘记
2.销毁
有了定义自然我们是要free以下的
但销毁函数其实也是大差不差
void ContactDestory(Contact* con)
{
SLDestory(con);
}
同样是调用顺序表的销毁
二.通讯录的增加函数和删除函数的实现
1.增加函数的实现
在我们顺序表的使用时包含头插尾插 当然通讯录也是有信息要添加和删除的所以这部分必不可少
void ContactAdd(Contact* con)
{
PeIn pel;
printf("请输入联系人姓名\n");
scanf("%s", pel.name);
printf("请输入联系人性别\n");
scanf("%s", pel.gender);
printf("请输入联系人年龄\n");
scanf("%d", &pel.age); //age是int类型的
printf("请输入联系人电话\n");
scanf("%s", pel.tel);
printf("请输入联系人地址\n");
scanf("%s", pel.address);
SLPushBack(con, pel);
}
可以看到 我们首先是用PeIn这个在此之前被我们重新命名的结构体 定义了一个结构体类型 pel来让我们后续使用
后面就是我们要添加的信息 打印 输出的简单流程
最后我们利用了顺序表的尾插将其插入到通讯录结构体中
2.删除函数的实现
一.查找要删除的对象
我们在进行删除之前肯定要知道我们要删除的是哪个 所以这里我们要用到查找函数来进行查找方便我们进行下一步的删除
int FindName(Contact* con, char name[])
{
for(int i = 0;i<con->size;i++)
{
if (0 == strcmp(con->arr[i].name, name))
{
//找到了
return i;
}
}
return -1;
}
我们来看到这个代码 其中形参包括 con结构体 name我们要用名字来查找
进入到函数中 通过for循环 我们要比较我们要查找的name 与我们结构体中数组包含的name是否是相等的 如果是相等的 我们就找到了 返回下标i
没有则返回-1结束
在这个比较过程中我们知道字符串的比较是要通过strcmp函数将进行比较的
二.删除函数的实现
void ContactDel(Contact* con)
{
char name[Name_Max];
printf("请选择你要删除的联系人姓名\n");
scanf("%s", name);
int find = FindName(con, name);
if (find < 0)
{
printf("无法删除\n");
return;
}
//跳出if语句后 就执行删除操作
SLDelete(con, find);
printf("删除成功\n");
}
进入到函数中 我们首先定义了一个 char类型的name变量 让我们写入我们要删除的name
后面通过调用查找函数 用find接收返回值 然后通过find的大小来确定是否有这个name结构体
最后删除通过调用 顺序表的删除函数进行实现
三. 通讯录的修改和查找
1.修改函数的实现
void ContactModify(Contact* con)
{
char name[Name_Max];
printf("请选择你要修改的联系人姓名\n");
scanf("%s", name);
int find = FindName(con, name);
if (find < 0)
{
printf("没有该姓名,请重新选择");
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); //age是int类型的
printf("请输入新的联系人电话\n");
scanf("%s", con->arr[find].tel);
printf("请输乳新的联系人地址\n");
scanf("%s", con->arr[find].address);
printf("修改成功\n");
}
这是我们的修改函数 其本质上也是套用了删除函数的查找内容 并且给出了 增加函数的相似代码 来让我们修改函数 这个较为简单就不过多赘述
主要点还是下标是find不要忘记了
2.查找函数的实现
void ContactFind(Contact* con)
{
char name[Name_Max];
printf("请选择你要查找的联系人姓名\n");
scanf("%s", name);
//
int find = FindName(con, name);
if (find < 0)
{
printf("找不到");
return;
}
printf("%3s %3s %3s %3s %3s\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].address
);
}
查找函数代码也是相对比较简单的 这里就不过多赘述了
给到通讯录的头文件代码和.c文件代码
.h
#pragma once
#define Name_Max 20
#define Gender_Max 20
#define Tel_Max 100
#define Address_Max 100
//定义通讯录顺序表
//前置声明 struct Seqlist
typedef struct Seqlist Contact;
typedef struct PersonInfo
{
char name[Name_Max];
char gender[Gender_Max];
int age;
char tel[Tel_Max];
char address[Address_Max];
}PeIn;
//通讯录实现方法
//初始化
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 ContactPrint(Contact* con);
.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SXB.h"
#include "SL.h"
void ContactInit(Contact* con)
{
SLInit(con);
}
void ContactAdd(Contact* con)
{
PeIn pel;
printf("请输入联系人姓名\n");
scanf("%s", pel.name);
printf("请输入联系人性别\n");
scanf("%s", pel.gender);
printf("请输入联系人年龄\n");
scanf("%d", &pel.age); //age是int类型的
printf("请输入联系人电话\n");
scanf("%s", pel.tel);
printf("请输入联系人地址\n");
scanf("%s", pel.address);
SLPushBack(con, pel);
}
//删除之前要进行查找
//查找函数
int FindName(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 = FindName(con, name);
if (find < 0)
{
printf("无法删除\n");
return;
}
//跳出if语句后 就执行删除操作
SLDelete(con, find);
printf("删除成功\n");
}
//修改函数
void ContactModify(Contact* con)
{
char name[Name_Max];
printf("请选择你要修改的联系人姓名\n");
scanf("%s", name);
int find = FindName(con, name);
if (find < 0)
{
printf("没有该姓名,请重新选择");
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); //age是int类型的
printf("请输入新的联系人电话\n");
scanf("%s", con->arr[find].tel);
printf("请输乳新的联系人地址\n");
scanf("%s", con->arr[find].address);
printf("修改成功\n");
}
void ContactFind(Contact* con)
{
char name[Name_Max];
printf("请选择你要查找的联系人姓名\n");
scanf("%s", name);
//
int find = FindName(con, name);
if (find < 0)
{
printf("找不到");
return;
}
printf("%3s %3s %3s %3s %3s\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].address
);
}
void ContactPrint(Contact* con)
{
//先来个表头
printf("%3s %3s %3s %3s %3s\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].address);
}
}
void ContactDestory(Contact* con)
{
SLDestory(con);
}
总结
通讯录的实现 是需要我们在顺序表的基础上完成的 这里给到的函数大多都浅显易懂 并无过多难点 需要多加练习 方可掌握精髓
希望各位彦祖亦菲点点赞 笔芯!!!!
1292

被折叠的 条评论
为什么被折叠?



