C语言通讯录—简单模拟实现

1.基本功能

我的通讯录实现的几个功能
1.增加通讯录成员
2.动态扩容
3.通过名字搜索通讯录成员
4.展示通讯录
5.删除通讯录成员
6.修改学生信息
7.按照名字进行排序

2.源码部分

①contact.h代码

在这里插入代码片
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<errno.h>
#include<stdlib.h>

#define MAX 1000
#define NAME_MAX 20
#define TELE_MAX 13
#define ADDR_MAX 20
#define SEX_MAX 10
#define DEFAULT_SZ 3

//定义每个成员数据的结构体                        
typedef struct PeoInfo
{
	char name[NAME_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
	char sex[SEX_MAX];
}PeoInfo;


//定义通讯录结构体                           
typedef struct Contact
{
	PeoInfo* data;
	int sz;      //表示当前通讯录的名字
	int capacity;//表示最大容量
}Contact;

//初始化结构体                             
void Init(Contact* pc);

//增加通讯录成员信息                           
void Add(Contact* pc);

//扩容
void CheckCapacity(Contact* pc);

//搜素学生                               
int SearchByName(Contact* pc);

//展示数据                               
void Show( Contact* pc);

//删除                                 
void Delete(Contact* pc);

//修改通讯录信息
void Modify(Contact* pc);

//按照名字排序                              
void SortByName(Contact* pc);

//销毁动态内存分配所申请到的空间                        
void DestroyContact(Contact* pc);

②contact.c源码

初始化

void Init(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	PeoInfo* temp = (PeoInfo*)malloc(pc->capacity * sizeof(PeoInfo));
	if (temp != NULL)
	{
		pc->data = temp;
	}
	else
	{
		printf("Init():%s\n", strerror(errno));
	}
	memset(pc->data, 0, sizeof(pc->data));  //直接硬核初始化
	return;
}

扩容

void CheckCapacity(Contact* pc)
{
	assert(pc);
	if (pc->sz == pc->capacity)
	{
		PeoInfo* temp = (PeoInfo*)realloc(pc->data,(pc->capacity + 2) * sizeof(PeoInfo));
		if (temp != NULL)
		{
			pc->data = temp;
			pc->capacity += 2;
			printf("扩容成功!\n");
			return;
		}
		else
		{
			printf("CheckCapacity():%s\n", strerror(errno));
		}
	}
	return;
}

增加通讯录成员

void Add(Contact* pc)
{
	assert(pc);
	
	CheckCapacity(pc);

	printf("请输入姓名:\n");
	//注意这个地方姓名输入的形式
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:\n");
	scanf("%d", &pc->data[pc->sz].age);
	printf("请输入性别:\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话:\n");
	scanf("%s", &pc->data[pc->sz].tele);
	printf("请输入地址:\n");
	scanf("%s", &pc->data[pc->sz].addr);
	pc->sz++;
	printf("增加成功!\n");
}

通过姓名查找成员

int SearchByName(Contact* pc)
{
	int i = 0;
	char name[NAME_MAX] = { 0 };
	printf("请输入要查询的姓名\n");
	scanf("%s", name);
	assert(pc && name);
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
			return i;      //如果找到了,那就返回它的下标
	}
	printf("搜索不到这个目标\n"); 
	return -1;
}

展示通讯录

void Show( Contact* pc)
{
	int i = 0;
	assert(pc);
	printf("%-20s\t%-5s\t%-10s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-5d\t%-10s\t%-15s\t%-20s\n", pc->data[i].name, pc->data[i].age, 
													 pc->data[i].sex, pc->data[i].tele, 
													 pc->data[i].addr);
	}
}

删除通讯录成员

void Delete(Contact* pc)
{
	int ret = 0;
	int i = 0;
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录人数太少,无法删除!\n");
		return;
	}
	ret = SearchByName(pc);
	if (!ret)
	{
		printf("查找不到这个目标!\n");
	}
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除指定联系人成功!\n");
	return;
}

修改学生信息

void Modify(Contact* pc)
{
	int index = 0;
	assert(pc);
	index = SearchByName(pc);
	if (index==-1)
	{
		printf("输入错误,找不到该通讯录成员!\n");
		return;
	}
	Show(pc);
	printf("查找成功!请依次重新输入每项信息:\n");
	printf("请输入姓名:\n");
	scanf("%s", pc->data[index].name);
	printf("请输入年龄:\n");
	scanf("%d", &pc->data[index].age);
	printf("请输入性别:\n");
	scanf("%s", pc->data[index].sex);
	printf("请输入电话:\n");
	scanf("%s", &pc->data[index].tele);
	printf("请输入地址:\n");
	scanf("%s", &pc->data[index].addr);
	return;
}

根据姓名进行排序

int cmp(const void* e1,const void* e2)
{
	//这里注意要转化成结构体指针,再指向姓名
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}              
           
void SortByName(Contact* pc)
{
	int i = 0, j = 0;
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp);
	/*for (i = 0; i < pc->sz - 1; i++)
	{
		for (j = 0; j < pc->sz - i - 1; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				PeoInfo temp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = temp;
			}
		}
	}*/
	printf("排序成功!\n");
	return;
}

销毁动态内存申请的空间

void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}

③test.c

#include"contact.h"

enum Oprion
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};


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 main()
{
	int input = 0;
	//PeoInfo* data=(PeoInfo*)calloc(MAX,sizeof(pc->data[0]);
	Contact con ;
	//先初始化这个结构体的数据
	Init(&con);
	do
	{		
		menu();
		printf("请输入:\n");
		scanf("%d", &input);
		switch (input)
		{
			case ADD: Add(&con);
					break;
			case DEL: Delete(&con);
					break;
			case SEARCH:SearchByName(&con);
					break;
			case MODIFY:Modify(&con);
					break;
			case SHOW: Show(&con);
					break;
			case SORT: SortByName(&con);
					break;
			case EXIT: printf("退出程序\n");
					DestroyContact(&con);
					break;
			default: printf("输入数字无效!\n");
					break;
		}
	} while (input);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

答辣喇叭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值