通讯录在日常生活中十分常见,又叫做电话簿,用于存储联系人的姓名电话等信息,那么我们在学习了指针,结构体类型,数组,顺序表等知识之后就可以利用这些知识来实现基础的通讯录项目了。
功能要求
1、至少存储100个联系人的信息
2、可以保存联系人的姓名、电话、年龄、性别、家庭住址等基础信息
3、实现增删查改联系人的信息以及查看联系人信息等
思路分析:
1、首先,我们要明确的是通讯录的底层逻辑是单向链表即顺序表,那么我们的程序就可以划分为三个模块:
1)、对顺序表和通讯录功能的设计(SeqList.c Contact.c)
2)、在头文件中声明我们所设计的函数(SeqList.h Contact.h)
3)、在主程序中引用头文件,调用所设计的函数以实现测试通讯录项目(test.c)
1、Seqlist.h
#pragma once
#include"Contact.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//动态顺序表
//typedef char SLDataType;
//
//更改数据类型为通讯录数据类型
//以下的方式任意选择即可
typedef struct ContactInfo SLDataType;
//typedef CInfo SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size; //顺序表中有效的数据个数
int capacity; //顺序表当前的空间大小
}SL;
//typedef struct SeqList SL;
//对顺序表进行初始化
void SLInit(SL* ps);
void SLDestroy(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* ps);
bool SLIsEmpty(SL* ps);
//在任意位置插入删除
//在指定的位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* ps, int pos);
bool SLFind(SL* ps, SLDataType x);
2、Contact.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//创建保存联系人数据的结构
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 15
#define ADDR_MAX 100
struct ContactInfo
{
char name[NAME_MAX];//使用定长数组还是动态数组呢?,字符数组,数组名就是数组的地址
char sex[SEX_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
};
typedef struct ContactInfo CInfo;
//通讯录底层是顺序表来实现
typedef struct SeqList contact;
//通讯录的初始化和销毁
void ContactInit(contact* pcon);
void ContactDestroy(contact* pcon);
//添加联系人
void ContactAdd(contact* pcon);
//删除联系人
void ContactDel(contact* pcon);
//修改联系人
void ContactModify(contact* pcon);
//查看通讯录
void ContactShow(contact* pcon);
//查找指定联系人
void ContactFind(contact* pcon);
3、SeqList.c
#pragma once
#include"Contact.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//动态顺序表
//typedef char SLDataType;
//
//更改数据类型为通讯录数据类型
//以下的方式任意选择即可
typedef struct ContactInfo SLDataType;
//typedef CInfo SLDataType;
typedef struct SeqList
{
SLDataType* a;
int size; //顺序表中有效的数据个数
int capacity; //顺序表当前的空间大小
}SL;
//typedef struct SeqList SL;
//对顺序表进行初始化
void SLInit(SL* ps);
void SLDestroy(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* ps);
bool SLIsEmpty(SL* ps);
//在任意位置插入删除
//在指定的位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* ps, int pos);
bool SLFind(SL* ps, SLDataType x);
4、Contact.h
#include"Contact.h"
#include"SeqList.h"
void ContactInit(contact* pcon) {
SLInit(pcon);
}
void ContactDestroy(contact* pcon) {
SLDestroy(pcon);
}
//添加联系人
void ContactAdd(contact* pcon) {
//接下来要获取的信息都是CInfo结构体里要求的数据
CInfo info;
printf("请输入联系人姓名:\n");
scanf("%s", info.name);
printf("请输入联系人的性别:\n");
scanf("%s", info.sex);
printf("请输入联系人的年龄:\n");
scanf("%d", &info.age);
printf("请输入联系人的电话:\n");
scanf("%s", info.tel);
printf("请输入联系人的住址:\n");
scanf("%s", info.addr);
//联系人数据都获取到了,并保存到了结构体info中
//往通讯录(顺序表)中插入数据
SLPushBack(pcon, info);
}
int FindByName(contact* pcon, char name[]) {
for (int i = 0; i < pcon->size; i++)
{
if (strcmp(pcon->a[i].name, name) == 0) {
return i;
}
}
return -1;
}
//删除联系人
void ContactDel(contact* pcon) {
//直接强制要求用户使用联系人名称来查找
printf("请输入要删除的用户名称:\n");
char name[NAME_MAX];
scanf("%s", name);
int findidex = FindByName(pcon, name);
if (findidex < 0) {
printf("要删除的联系人不存在!\n");
return;
}
//找到了,要删除findidx位置的数据
SLErase(pcon, findidex);
}
//修改联系人
void ContactModify(contact* pcon) {
char name[NAME_MAX];
printf("请输入要修改的用户名称:\n");
scanf("%s", name);
//获取到的通讯录(顺序表)下标的位置
int find = FindByName(pcon, name);
if (find < 0) {
printf("要修改的用户不存在!\n");
return;
}
printf("请输入新的用户名称:\n");
scanf("%s", pcon->a[find].name);
printf("请输入新的用户性别:\n");
scanf("%s", pcon->a[find].sex);
printf("请输入新的用户年龄:\n");
scanf("%d", &pcon->a[find].age);
printf("请输入新的用户电话:\n");
scanf("%s", pcon->a[find].tel);
printf("请输入新的用户地址:\n");
scanf("%s", pcon->a[find].addr);
printf("修改成功!\n");
}
//查看通讯录
void ContactShow(contact* pcon) {
//打印通讯录所有的数据
//先打印表头文字
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "住址");
for (int i = 0; i < pcon->size; i++)
{
printf("%-4s %-4s %-4d %-4s %-4s\n",
pcon->a[i].name,
pcon->a[i].sex,
pcon->a[i].age,
pcon->a[i].tel,
pcon->a[i].addr
);
}
}
//查找指定联系人
void ContactFind(contact* pcon) {
char name[NAME_MAX];
printf("请输入要查找的用户名称:\n");
scanf("%s", name);
int find = FindByName(pcon, name);
if (find < 0) {
printf("该联系人不存在!\n");
return;
}
//打印下当前的联系人
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "住址");
printf("%-4s %-4s %-4d %-4s %-4s\n",
pcon->a[find].name,
pcon->a[find].sex,
pcon->a[find].age,
pcon->a[find].tel,
pcon->a[find].addr
);
}
5、text.c
#include"SeqList.h"
#include"Contact.h"
//void SLtest() {
// SL sl;
// SLInit(&sl);
// //顺序表的具体操作
// //SLPushBack(&sl, 1);
// //SLPushBack(&sl, 2);
// //SLPushBack(&sl, 3);
// //SLPushBack(&sl, 4);//1 2 3 4
// //SLPrint(&sl);
// 头插
// //SLPushFront(&sl, 5);//5 1 2 3 4
// //SLPushFront(&sl, 6);//6 5 1 2 3 4
// //SLPushFront(&sl, 7);//7 6 5 1 2 3 4
// //SLPrint(&sl);
// //尾删
// SLPopBack(&sl);
// SLPrint(&sl);
// SLPopBack(&sl);
// SLPrint(&sl);
// SLDestroy(&sl);
//}
//
//void SLtest02() {
// SL sl;
// SLInit(&sl);
// SLPushBack(&sl, 1);
// SLPushBack(&sl, 2);
// SLPushBack(&sl, 3);
// SLPushBack(&sl, 4);
// SLPrint(&sl);
void menu() {
printf("****************通讯录********************\n");
printf("******1、添加联系人 2、删除联系人********\n");
printf("******3、修改联系人 4、查找联系人********\n");
printf("******5、查看通讯录 0、 退 出 ********\n");
printf("****************************************\n");
}
int main() {
int op = -1;
//定义一个通讯录
contact con;
ContactInit(&con);
do {
menu();
printf("请选择您的操作:\n");
scanf("%d", &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("goodbye~\n");
break;
default:
printf("您的输入有误,请重新输入\n");
break;
}
} while (op != 0);
ContactDestroy(&con);
return 0;
}