C语言实现动态通讯录版本一

本文介绍了一个简单的通讯录系统的实现过程,包括使用C语言动态分配内存实现通讯录的增删改查等功能。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在我们的生活中,与人交流必不可少,而在今天这个信息时代,人与人之间联系更加方便,我们有了电话,邮箱等等,所以通讯录这个玩意儿也就应运而生


一、通讯录是什么

通讯录是记录联系人姓名、移动电话、传真号、电子邮件、QQ,地址等等的媒介

二、通讯录的实现

1.通讯录需要的库函数以及各种功能的自定义函数声明(contact.h)

代码如下:

#pragma once

#define DEFAULT_SZ 3
#define INC_SZ 2
#define NAME 20
#define SEX 5
#define BIRTHDAY 9
#define PHONE 11
#define ADDRESS 20

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>


//通讯录成员信息结构体
typedef struct Peo {
	char name[NAME];
	char sex[SEX];
	char birthday[BIRTHDAY];
	char phone[PHONE];
	char address[ADDRESS];
}Peo_inma;

//通讯录结构体静态版本
//typedef struct Contact {
//	Peo_inma data[MAX_COUNT];
//	int count;
//}Contact;

//通讯录结构体动态版本
typedef struct Contact {
	Peo_inma* data;
	int count;
	int MAX;
}Contact;

//打印菜单
void menu();

//通讯录的初始化
int InitContact(Contact* p);

//增加联系人
void AddContact(Contact* p);

//删除联系人
void DelContact(Contact* p);


//查找当前联系人
void FindContact(Contact* p);

//修改联系人
void ModifyContact(Contact* p);

//显示当前通讯录信息
void ShowContact(Contact* p);

//对当前通讯录信息进行升序排序
void SortContact(Contact* p);

2.自定义函数实现模块(contact.c)

代码如下:

#define _CRT_SECURE_NO_WARNINGS

#include "contact.h"

//打印菜单
void menu() {
	printf("**************************************\n");
	printf("****  1.add           2.del    *******\n");
	printf("****  3.search        4.modify *******\n");
	printf("****  5.show          6.sort   *******\n");
	printf("****  0.exit                   *******\n");
	printf("**************************************\n");
}

//通讯录的初始化
int InitContact(Contact* p) {
	assert(p);
	p->count = 0;
	p->data = (Peo_inma*)calloc(DEFAULT_SZ, sizeof(Peo_inma));
	if (p->data == NULL) {
		printf("InitContact : %s\n", strerror(errno));
		return 1;
	}
	p->MAX = DEFAULT_SZ;
}


//增加联系人
void AddContact(Contact* p) {
	assert(p);
	//增容
	if (p->count == p->MAX) {
		Peo_inma* ptr = NULL;
		ptr = realloc(p->data, (p->MAX + INC_SZ) * sizeof(Peo_inma));
		if (ptr == NULL) {
			printf("AddContact : %s\n", strerror(errno));
			return;
		}
		else {
			p->data = ptr;
			ptr = NULL;
			p->MAX += INC_SZ;
			printf("扩容成功\n");
		}
	}
	printf("请输入姓名:>");
	scanf("%s", p->data[p->count].name);
	printf("请输入性别:>");
	scanf("%s", p->data[p->count].sex);
	printf("请输入年龄:>");
	scanf("%s", p->data[p->count].birthday);
	printf("请输入电话:>");
	scanf("%s", p->data[p->count].phone);
	printf("请输入地址:>");
	scanf("%s", p->data[p->count].address);
	p->count++;
}

//删除联系人
void DelContact(Contact* p) {
	assert(p);
	if (p->count == 0) {
		printf("通讯录为空,删除失败\n");
		return;
	}
	int i = 0;
	char str[NAME] = { 0 };
	int peo = 0;
	int sz = 0;
	int j = 0;
	sz = sizeof(p->data[0]);
	char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };
	printf("0.姓名, 1.性别, 2.生日, 3.联系电话, 4.地址\n");
	printf("请选择属性编号来删除联系人:>");
	scanf("%d", &peo);
	printf("请输入被删除人信息:");
	scanf("%s", str);
	printf("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
	for (i = 0; i < p->count; i++) {
		if (strcmp(Peo[peo] + (i * sz), str) == 0) {
			printf("%-12s%-12s%-12s%-12s%-12s\n", p->data[i].name,
				p->data[i].sex,
				p->data[i].birthday,
				p->data[i].phone,
				p->data[i].address);
			for (j = i; j < p->count - 1; j++) {
				p->data[j] = p->data[j + 1];
			}
			i--;
			p->count--;
		}
	}
	printf("以上联系人信息均被删除\n");
}

//查询联系人
void FindContact(Contact* p) {
	assert(p);
	if (p->count == 0) {
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	char str[NAME] = { 0 };
	int peo = 0;
	int sz = 0;
	sz = sizeof(p->data[0]);
	char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };
	printf("0.姓名, 1.性别, 2.生日, 3.联系电话, 4.地址\n");
	printf("请选择属性编号来查找联系人:>");
	scanf("%d", &peo);
	printf("请输入被搜索人信息:");
	scanf("%s", str);
	printf("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
	for (i = 0; i < p->count; i++) {
		if (strcmp(Peo[peo] + (i * sz), str) == 0) {
			printf("%-12s%-12s%-12s%-12s%-12s\n", p->data[i].name,
				p->data[i].sex,
				p->data[i].birthday,
				p->data[i].phone,
				p->data[i].address);
		}
	}
	//Search(p,Peo[peo],sizeof(p->data[0]));
}

//修改联系人信息
void ModifyContact(Contact* p) {
	assert(p);
	if (p->count == 0) {
		printf("通讯录为空\n");
		return;
	}
	int i = 0;
	char str[NAME] = { 0 };
	int peo = 0;
	int sz = 0;
	int input = 0;
	sz = sizeof(p->data[0]);
	char* Peo[5] = { p->data[0].name,p->data[0].sex,p->data[0].birthday,p->data[0].phone,p->data[0].address };
	printf("0.姓名, 1.性别, 2.生日, 3.联系电话, 4.地址\n");
	printf("请选择属性编号来修改联系人:>");
	scanf("%d", &peo);
	printf("请输入被修改人原信息:");
	scanf("%s", str);
	printf("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
	for (i = 0; i < p->count; i++) {
		if (strcmp(Peo[peo] + (i * sz), str) == 0) {
			printf("%-12s%-12s%-12s%-12s%-12s\n", p->data[i].name,
				p->data[i].sex,
				p->data[i].birthday,
				p->data[i].phone,
				p->data[i].address);
			printf("请选择是否修改: 1.是 0.否  :>");
			scanf("%d", &input);
			if (input) {
				printf("请输入姓名:>");
				scanf("%s", p->data[i].name);
				printf("请输入性别:>");
				scanf("%s", p->data[i].sex);
				printf("请输入年龄:>");
				scanf("%s", p->data[i].birthday);
				printf("请输入电话:>");
				scanf("%s", p->data[i].phone);
				printf("请输入地址:>");
				scanf("%s", p->data[i].address);
			}
		}
	}
}

//显示当前通讯录信息
void ShowContact(Contact* p) {
	assert(p);
	printf("\n");
	printf("%-12s%-12s%-12s%-12s%-12s\n", "姓名", "性别", "生日", "联系电话", "地址");
	int i = 0;
	for (i = 0; i < p->count; i++) {
		printf("%-12s%-12s%-12s%-12s%-12s\n", p->data[i].name,
			p->data[i].sex,
			p->data[i].birthday,
			p->data[i].phone,
			p->data[i].address);
	}
	printf("\n");
}

int compar(const void* e1, const void* e2) {
	return strcmp((char*)e1, (char*)e2);
}

//对当前通讯录进行升序排序
void SortContact(Contact* p) {
	assert(p);
	qsort(p->data, p->count, sizeof(p->data[0]), compar);
	printf("升序排序完成\n");
}

2.通讯录测试模块(text.c)

#define _CRT_SECURE_NO_WARNINGS

#include "contact.h"

//枚举
enum Peo_con_option {
	Exit,
	Add,    //增加
	DEL,    //删除
	SEARCH, //搜索
	MODIFY, //修改
	SHOW,   //打印
	SORT    //排序
};

int main() {
	int input = 0;
	Contact Con;
	if (InitContact(&Con) == 1)
		return 0;
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input) {
		case Add:
			AddContact(&Con);
			break;
		case DEL:
			DelContact(&Con);
			break;
		case SEARCH:
			FindContact(&Con);
			break;
		case MODIFY:
			ModifyContact(&Con);
			break;
		case SHOW:
			ShowContact(&Con);
			break;
		case SORT:
			SortContact(&Con);
			break;
		case Exit:
			printf("退出\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	} while (input);
	free(Con.data);
	Con.data = NULL;
	return 0;
}

总结

该版本仅仅通过动态分配内存的方法在调试控制台简单实现通讯录的增删改查,显示,退出的功能,但是无法将调试窗口的数据移到硬盘文件进行长期存储,在后续作者学习了C语言文件相关的知识之后将对该通讯录方法进行改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

求索1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值