栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言用动态内存管理实现一个可以扩容的通讯录

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言用动态内存管理实现一个可以扩容的通讯录

前言

​ 要实现一个通讯录,通讯录可以用来存储人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址,可能我们在实现时,首先想到的是将这些信息储存在一个结构体中,用一个结构体数组来存储每个人的信息。然而我们如果用静态的数组,会有很多不合适的地方。如果需要存放的人的信息很多,我们的数组小而不够了怎么办?如果存放的信息少我们数组太大了浪费空间怎么办?这里就需要用到动态内存开辟的方法讲数组进行灵活的扩容,本文代码分为Contact.h存放头文件宏定义结构体数组以及函数头,Contact.c存放函数详细内容,test.c构建通讯录以及对通讯录测试。通讯录中函数功能有:添加,删除,查找,修改联系人信息,显示清空联系人信息,以名字排序所有联系人,以下是代码。

Contact.h
#include
#include
#include
#define Name_Max 20
#define Sex_Max 6
#define Tele_Max 12
#define Address_Max 30
#pragma once
struct PeoInfo
{
	char name[Name_Max];
	char sex[Sex_Max];
	int age;
	char tele[Tele_Max];
	char address[Address_Max];
};
typedef struct Contact
{
	struct PeoInfo* data;
	int capacity;
	int size;
}Contact;
void InitContact(Contact*ps);
void AddPeoInfo(Contact* ps);
void DelPeoInfo(Contact* ps);
void SearchPeoInfo(Contact* ps);
void ModifyPeoInfo(Contact* ps);
void ShowPeoInfo(Contact* ps);
void DestoryContact(Contact* ps);
void SortPeoInfo(Contact* ps);
Contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void InitContact(Contact* ps)
{
	ps->data = (struct PeoInfo*)malloc(5 * sizeof(struct PeoInfo));
	ps->size = 0;
	ps->capacity = 5;
}
void AddPeoInfo(Contact* ps)
{
	if (ps->size == ps->capacity)
	{
		struct PeoInfo* tmp = (struct PeoInfo*)realloc(ps->data, (ps->capacity + 5) * sizeof(struct PeoInfo));
		if (tmp != NULL)
		{
			ps->data = tmp;
			ps->capacity += 5;
			printf("增容成功n");
		}
		else
		{
			printf("malloc fail");
			return;
		}
	}
	printf("请输入姓名n");
	scanf("%s", ps->data[ps->size].name);
	printf("请输入性别n");
	scanf("%s", ps->data[ps->size].sex);
	printf("请输入年龄n");
	scanf("%d", &(ps->data[ps->size].age));
	printf("请输入电话n");
	scanf("%s", ps->data[ps->size].tele);
	printf("请输入住址n");
	scanf("%s", ps->data[ps->size].address);
	printf("添加成功");
	ps->size++;
}
int FindPeoInfo(Contact* ps,const char*name)
{
	for (int i = 0; i < ps->size; i++)
	{
		if (strcmp(ps->data[i].name, name) == 0)
		{
			return i;
		}
		else
		{
			return -1;
		}
	}
}
void DelPeoInfo(Contact* ps)
{
	if (ps->size == 0)
	{
		printf("已经没有联系人了");
		return;
	}
	char name[Name_Max] = { 0 };
	printf("请输入需要删除的人的名字");
	scanf("%s", name);
	int res=FindPeoInfo(ps, name);
	if (res == -1)
	{
		printf("没找到");
		return;
	}
	else
	{
		for (int i = res; i < ps->size - 1; i++)
		{
			ps->data[i] = ps->data[i + 1];
		}
		ps->size--;
		printf("删除成功!n");
	}

}
void SearchPeoInfo(Contact* ps)
{
	char name[Name_Max] = { 0 };
	printf("输入要查找人的名字n");
	scanf("%s", name);
	int res = FindPeoInfo(ps, name);
	if (res == -1)
	{
		printf("搜索不到联系人n");
		return;
	}
	else
	{
		printf("%15s %15s %3d %15s %15s", ps->data[res].name, ps->data[res].sex, ps->data[res].age, ps->data[res].tele, ps->data[res].address);

	}

}
void ModifyPeoInfo(Contact* ps)
{
	char name[Name_Max] = { 0 };
	printf("输入要修改人的名字n");
	scanf("%s", name);
	int res = FindPeoInfo(ps, name);
	if (res == -1)
	{
		printf("搜索不到联系人n");
		return;
	}
	else
	{
		printf("请输入姓名n");
		scanf("%s", ps->data[res].name);
		printf("请输入性别n");
		scanf("%s", ps->data[res].sex);
		printf("请输入年龄n");
		scanf("%d", &(ps->data[res].age));
		printf("请输入电话n");
		scanf("%s", ps->data[res].tele);
		printf("请输入住址n");
		scanf("%s", ps->data[res].address);
		printf("修改成功");
	}
}
void ShowPeoInfo(Contact* ps)
{
	if (ps->size == 0)
	{
		printf("没有人啊还n");
		return;
	}
	for (int i = 0; i < ps->size; i++)
	{
		printf("%15s %15s %3d %15s %15sn",
			ps->data[i].name, ps->data[i].sex, ps->data[i].age, ps->data[i].tele, ps->data[i].address);
	}
}
void DestoryContact(Contact* ps)
{
	free(ps->data);
	ps->data = NULL;
	ps->capacity = 0;
	ps->size = 0;
}
int cmp_name(const void* elem1,const void *elem2)
{
	return strcmp(((struct PeoInfo*)elem1)->name, ((struct PeoInfo*)elem2)->name);
}
void SortPeoInfo(Contact* ps)
{
	qsort(ps->data, ps->size, sizeof(ps->data[0]), cmp_name);
}

test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void menu()
{
	printf("************************************n");
	printf("************************************n");
	printf("**** 0.Exit             1.Add ******n");
	printf("**** 2.Del              3.Search ***n");
	printf("**** 4.Modify           5.Show *****n");
	printf("**** 6.Destory          7.Sort *****n");
	printf("************************************n");
	printf("************************************n");
}
enum Myoption
{
	Exit,
	Add,
	Del,
	Search,
	Modify,
	Show,
	Destory,
	Sort
};
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请选择");
		scanf("%d", &input);
		//void InitContact(Contact * ps);
		//void AddPeoInfo(Contact * ps);
		//void DelPeoInfo(Contact * ps);
		//void SearchPeoInfo(Contact * ps);
		//void ModifyPeoInfo(Contact * ps);
		//void ShowPeoInfo(Contact * ps);
		//void DestoryContact(Contact * ps);
		//void SortPeoInfo(Contact * ps);
		switch (input)
		{
		case Exit:
			break;
		case Add:
			printf("添加联系人n");
			AddPeoInfo(&con);
			break;
		case Del:
			printf("删除指定联系人n");
			DelPeoInfo(&con);
			break;
		case Search:
			printf("寻找指定联系人n");
			SearchPeoInfo(&con);
			break;
		case Modify:
			printf("修改指定联系人n");
			ModifyPeoInfo(&con);
			break;
		case Show:
			printf("展示所有联系人n");
				ShowPeoInfo(&con);
			break;
		case Destory:
			printf("清空通讯录n");
			DestoryContact(&con);
			break;
		case Sort:
			printf("对联系人按名字排序n");
			SortPeoInfo(&con);
			break;
		default:
			break;
		}

	} while (input);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290013.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号