【数据结构】通讯录管理,项目实战(附:全部码源)

🔥 博客主页🔥 :【 坊钰_CSDN博客

欢迎各位点赞👍 评论**✍收藏⭐**

目录

[1. 功能实现](#1. 功能实现)

[2. 前置准备](#2. 前置准备)

[2.1 文件调整](#2.1 文件调整)

[2.2 定义通讯录结构](#2.2 定义通讯录结构)

[2.3 更改自定义类型和更改名字](#2.3 更改自定义类型和更改名字)

[3. 代码实现](#3. 代码实现)

[3.1 通讯录初始化和销毁](#3.1 通讯录初始化和销毁)

[3.1.1 初始化](#3.1.1 初始化)

[3.1.2 销毁](#3.1.2 销毁)

[3.2 通讯录名字查找和打印](#3.2 通讯录名字查找和打印)

[3.2.1 通讯录名字查找](#3.2.1 通讯录名字查找)

[3.2.2 通讯录打印](#3.2.2 通讯录打印)

[3.3 通讯录添加联系人和删除](#3.3 通讯录添加联系人和删除)

[3.3.1 添加联系人](#3.3.1 添加联系人)

[3.3.2 通讯录删除联系人](#3.3.2 通讯录删除联系人)

[3.4 通讯录修改和查找联系人](#3.4 通讯录修改和查找联系人)

[3.4.1 通讯录修改](#3.4.1 通讯录修改)

[3.4.2 通讯录查找联系人](#3.4.2 通讯录查找联系人)

[3.5 通讯录菜单](#3.5 通讯录菜单)

[4. 全部码源](#4. 全部码源)

[4.1 文件](#4.1 文件)

[4.2 文件](#4.2 文件)

[4.3 文件](#4.3 文件)

[4.4 文件](#4.4 文件)

[4.5 文件](#4.5 文件)

[5. 运行结果](#5. 运行结果)

6.小结


1. 功能实现

  1. 至少能够存储100个⼈的通讯信息
  2. 能够保存⽤⼾信息:名字、性别、年龄、电话、地址等
  3. 增加联系⼈信息
  4. 删除指定联系⼈
  5. 查找制定联系⼈
  6. 修改指定联系⼈
  7. 显⽰联系⼈信息

2. 前置准备

基于上一篇博客-->点击这里(顺序表专题)

2.1 文件调整

我们在这里有增添两个文件

<Contact.h> ----> 通讯录结构声明

<Contact.c> ----> 通讯录函数实现

2.2 定义通讯录结构

cs 复制代码
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 20
//定义通讯录结构
//姓名  性别  年龄  电话  住址
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char gender[GENDER_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

2.3 更改自定义类型和更改名字

cs 复制代码
typedef PeoInfo SLDataType;
cs 复制代码
typedef struct SeqList Contact;

3. 代码实现

3.1 通讯录初始化和销毁

3.1.1 初始化

cs 复制代码
//通讯录初始化
void ContactInit(Contact* con);
cs 复制代码
//通讯录初始化实现
void ContactInit(Contact* con)
{
	SLInit(con);
}

3.1.2 销毁

cs 复制代码
//通讯录的销毁
void ContactDesTroy(Contact* con);
cs 复制代码
//通讯录的销毁实现
void ContactDesTroy(Contact* con)
{
	SLDestroy(con);
}

3.2 通讯录名字查找和打印

3.2.1 通讯录名字查找

cs 复制代码
//通讯录名字查找
int Findbyname(Contact* con, char name[]);
cs 复制代码
//通讯录名字查找实现
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;
}

3.2.2 通讯录打印

cs 复制代码
//通讯录打印
void ContactShow(Contact* con);
cs 复制代码
//通讯录打印实现
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     );
	}
}

3.3 通讯录添加联系人和删除

3.3.1 添加联系人

cs 复制代码
//通讯录添加
void ContactAdd(Contact* con);
cs 复制代码
//通讯录添加实现
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);   //插入通讯录中
}

3.3.2 通讯录删除联系人

cs 复制代码
//通讯录删除数据实现
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");
}

3.4 通讯录修改和查找联系人

3.4.1 通讯录修改

cs 复制代码
//通讯录的修改
void ContactModify(Contact* con);
cs 复制代码
//通讯录的修改
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");
}

3.4.2 通讯录查找联系人

cs 复制代码
//通讯录查找
void ContactFind(Contact* con);
cs 复制代码
//通讯录查找
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("%s   %s   %d   %s   %s\n", con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

3.5 通讯录菜单

cs 复制代码
void menu()
{
	printf("******************通讯录******************\n");
	printf("*******1.增加联系人   2.删除联系人********\n");
	printf("*******3.修改联系人   4.查找联系人********\n");
	printf("*******5.展示联系人   0.   退出  *********\n");
	printf("******************************************\n");
}

int main()
{
	int input = 0;
	do
	{
    menu();
	printf("请选择你的操作:\n");
	scanf("%d", &input);
	switch (input)
	{
	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 (input);
	
	ContactDesTroy(&con);
	
	return 0;
}

4. 全部码源

有5个文件

4.1 <SeqList.h>文件

<SeqList.h>文件

cs 复制代码
#pragma once
#include "Contact.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS 1
//定义类型
typedef PeoInfo SLDataType;

//定义动态顺序表结构
typedef struct SeqList
{
	SLDataType* arr;   //指针
	int size;    //有效个数
	int capacity;   //空间容量
}SL;

//动态顺序表初始化
void SLInit(SL* ps);

//动态顺序表的销毁
void SLDestroy(SL* ps);

//判断容量空间是否足够
void SLCheckCapacity(SL* ps);

//动态顺序表插入(尾部)
void SLPushBack(SL* ps,SLDataType x);

//动态顺序表插入(头部)
void SLPushFront(SL* ps);

//指定位置插入(之前)
void SLInsret(SL* ps, int pos, SLDataType x);   //pos-->代表数组的下标

//打印顺序表
void SLPrint(SL s);

//动态顺序表删除(尾部)
void SLPopBack(SL* ps);

//动态顺序表删除(头部)
void SLPopFront(SL* ps);

//指定位置删除
void SLErase(SL* ps, int pos);

4.2 <SeqList.c>文件

<SeqList.c>文件

cs 复制代码
#include "SeqList.h"

//动态顺序表初始化的实现
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//动态顺序表销毁的实现
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//判断容量空间是否足够
void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)
	{
		int newcapacity = (ps->capacity == 0 ? 4 : ps->capacity * 2);
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
		assert(tmp);
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}

//动态顺序表插入(尾部)实现
void SLPushBack(SL* ps,SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
}

//动态顺序表插入(头部)实现
void SLPushFront(SL* ps,SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size;i>0; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	ps->arr[0] = x;
	ps->size++;
}

//指定位置插入(之前)实现
void SLInsret(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	for (int i = ps->size;i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = 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)
{
	ps->size--;
}

//动态顺序表删除(头部)实现
void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0;i<ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	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--;
}

4.3 <Contact.h>文件

<Contact.h>文件

cs 复制代码
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define NAME_MAX 20
#define GENDER_MAX 20
#define TEL_MAX 20
#define ADDR_MAX 20
//定义通讯录结构
//姓名  性别  年龄  电话  住址
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 ContactDesTroy(Contact* con);

//通讯录添加
void ContactAdd(Contact* con);

//通讯录打印
void ContactShow(Contact* con);

//通讯录名字查找
int Findbyname(Contact* con, char name[]);

//通讯录删除数据
void ContactDel(Contact* con);

//通讯录的修改
void ContactModify(Contact* con);

//通讯录查找
void ContactFind(Contact* con);

4.4 <Contact.c>文件

<Contact.c>文件

cs 复制代码
#include "Contact.h"
#include "SeqList.h"
#define _CRT_SECURE_NO_WARNINGS 1
//通讯录初始化实现
void ContactInit(Contact* con)
{
	SLInit(con);
}

//通讯录的销毁实现
void ContactDesTroy(Contact* con)
{
	SLDestroy(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);
}


//通讯录打印实现
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     );
	}
}

//通讯录名字查找实现
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 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("%s   %s   %d   %s   %s\n", con->arr[find].name,
		con->arr[find].gender,
		con->arr[find].age,
		con->arr[find].tel,
		con->arr[find].addr);
}

4.5 <test.c>文件

<test_测试通讯录_.c>文件

cs 复制代码
#include "SeqList.h"
#include "Contact.h"
#define _CRT_SECURE_NO_WARNINGS 1


Contact con;

void ContactCheck01()
{
	Contact con;
	//初始化
	ContactInit(&con);
	
	//添加
	ContactAdd(&con);
	ContactAdd(&con);

	//删除
	ContactDel(&con);

	//修改
	ContactModify(&con);

	//查找
	ContactFind(&con);

	//打印
	ContactShow(&con);

	//销毁
	ContactDesTroy(&con);

}


void menu()
{
	printf("******************通讯录******************\n");
	printf("*******1.增加联系人   2.删除联系人********\n");
	printf("*******3.修改联系人   4.查找联系人********\n");
	printf("*******5.展示联系人   0.   退出  *********\n");
	printf("******************************************\n");
}



int main()
{
	int input = 0;
	do
	{
    menu();
	printf("请选择你的操作:\n");
	scanf("%d", &input);
	switch (input)
	{
	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 (input);
	
	ContactDesTroy(&con);
	
	return 0;
}

5. 运行结果

添加

删除

打印

6.小结

以上就是关于通讯录的内容了,具体还需宝子们去实践,如果觉得该博客对你有用的话,希望一键三连,点个关注不迷路,谢谢支持!

相关推荐
Мартин.5 分钟前
[Meachines] [Easy] Sea WonderCMS-XSS-RCE+System Monitor 命令注入
前端·xss
Miqiuha8 分钟前
lock_guard和unique_lock学习总结
java·数据库·学习
嵌入式AI的盲1 小时前
数组指针和指针数组
数据结构·算法
一 乐1 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
不知所云,1 小时前
qt cmake自定义资源目录,手动加载资源(图片, qss文件)
开发语言·qt
昨天;明天。今天。2 小时前
案例-表白墙简单实现
前端·javascript·css
数云界2 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
风清扬_jd2 小时前
Chromium 如何定义一个chrome.settingsPrivate接口给前端调用c++
前端·c++·chrome
安冬的码畜日常2 小时前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine
阑梦清川2 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言