基于动态顺序表实现通讯录项目

通讯录在日常生活中十分常见,又叫做电话簿,用于存储联系人的姓名电话等信息,那么我们在学习了指针,结构体类型,数组,顺序表等知识之后就可以利用这些知识来实现基础的通讯录项目了。

功能要求

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;
}

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值