C语言实现通讯录(动态内存开辟)

我猜点进来的要么是搞C语言大作业的,要么是在B站看了鹏哥视频的。
但是鹏哥实现的通讯录是静态版本的,我的是动态版本的。

不管咋样,我不会详细讲,我只给代码,有不回了的可以直接问我。

跟三子棋和扫雷一样,都是三个文件,两个.c 一个.h。

上代码:

contact.h

#pragma once

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

#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12

enum option
{
	EXIT,
	ADD,
	DELE,
	SEARCH,
	MODIFY,
	AGESORT,
	SHOW,
	NAMESORT
};

//人员信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
}PeoInfo;

//通讯录
typedef struct contact
{
	//动态开辟
	PeoInfo* data;
	//实际人数
	size_t sz;
	//容量
	size_t capacity;
}contact;

//菜单
void menu();

//初始化
void ContactInit(contact* pc);

//销毁
void ContactDestroy(contact* pc);

//增
void ContactAdd(contact* pc);

//删
void ContactDele(contact* pc);

//查
void ContactFind(contact* pc);

//改
void ContactModify(contact* pc);

//打印
void ContactPrint(contact* pc);

//年龄排序
void ContactSortByAge(contact* pc);

//名字排序
void ContactSortByName(contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS

#include"contact.h"

//菜单
void menu()
{
	printf("*******************************\n");
	printf("*****  1.add      2.dele   ****\n");
	printf("*****  3.search   4.modify ****\n");
	printf("*****  5.AgeSort  6.show   ****\n");
	printf("*****  7.NameSort 0.exit   ****\n");
	printf("*******************************\n");
}

//初始化
void ContactInit(contact* pc)
{
	assert(pc);

	pc->data = NULL;
	pc->capacity = pc->sz = 0;
}

//销毁
void ContactDestroy(contact* pc)
{
	assert(pc);

	free(pc->data);
	pc->capacity = pc->sz = 0;

}

//创建一个新的人员
static PeoInfo* BuyNewPeoInfo()
{
	PeoInfo* newPeo = (PeoInfo*)malloc(sizeof(PeoInfo));
	if (newPeo == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}

	printf("请输入姓名:>");
	scanf("%s", newPeo->name);
	printf("请输入年龄:>");
	scanf("%d", &(newPeo->age));
	printf("请输入性别:>");
	scanf("%s", newPeo->sex);
	printf("请输入电话:>");
	scanf("%s", newPeo->tele);

	return newPeo;
}

//检查是否要扩容
void CheckCapacity(contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		size_t newCapacity = pc->capacity == 0 ? 4 : pc->capacity * 2;
		PeoInfo* rePeo = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo) * newCapacity);
		if (rePeo == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}

		pc->data = rePeo;
		pc->capacity = newCapacity;
	}
}

//增
void ContactAdd(contact* pc)
{
	assert(pc);

	PeoInfo* newPeo = BuyNewPeoInfo();

	CheckCapacity(pc);

	pc->data[pc->sz].age = newPeo->age;
	strcpy(pc->data[pc->sz].name, newPeo->name);
	strcpy(pc->data[pc->sz].sex, newPeo->sex);
	strcpy(pc->data[pc->sz].tele, newPeo->tele);
	free(newPeo);
	pc->sz++;
}

//打印
void ContactPrint(contact* pc)
{
	assert(pc);

	printf("%-8s %-5s %-5s %-20s\n", "姓名", "年龄", "性别", "电话");

	for (size_t i = 0; i < pc->sz; i++)
	{
		printf("%-8s %-5d %-5s %-20s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele);
	}
}

//查询子函数
static int _search_by_name(contact* pc, char name[])
{
	size_t i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}

	return -1;
}

//查
void ContactFind(contact* pc)
{
	printf("请输入你要查找的人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);

	int pos = _search_by_name(pc, name);

	if (pos == -1)
	{
		printf("查无此人\n");
		return;
	}

	printf("%-8s %-5s %-5s %-20s\n", "姓名", "年龄", "性别", "电话");
	printf("%-8s %-5d %-5s %-20s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele);

}


//删
void ContactDele(contact* pc)
{
	assert(pc);

	if (pc->sz == 0)
	{
		printf("当前通讯录无人员\n");
		return;
	}

	printf("请输入你要删除的人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);

	int pos = _search_by_name(pc, name);

	if (pos == -1)
	{
		printf("查无此人\n");
		return;
	}

	for (size_t i = pos; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}

	pc->sz--;
	printf("删除成功\n");
}


//改
void ContactModify(contact* pc)
{
	assert(pc);

	printf("请输入你要修改的人的姓名:>");
	char name[MAX_NAME];
	scanf("%s", name);
	int pos = _search_by_name(pc, name);
	if (pos == -1)
	{
		printf("查无此人\n");
		return;
	}

	printf("请输入修改后的信息:\n");
	printf("年龄:");
	scanf("%d", &(pc->data[pos].age));
	printf("性别:");
	scanf("%s", pc->data[pos].sex);
	printf("电话:");
	scanf("%s", pc->data[pos].tele);

	printf("修改成功\n");
}

int AgeCmp(const void* prev,const void* next)
{
	return ((PeoInfo*)prev)->age - ((PeoInfo*)next)->age;
}

//排序
void ContactSortByAge(contact* pc)
{
	assert(pc);

	qsort(pc->data, pc->sz, sizeof(PeoInfo), AgeCmp);

	printf("将年龄按照升序排序后的结果为:\n");
	ContactPrint(pc);
}


int NameCmp(const void* prev, const void* next)
{
	return strcmp(((PeoInfo*)prev)->name, ((PeoInfo*)next)->name);
}

//名字排序
void ContactSortByName(contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(PeoInfo), NameCmp);

	printf("将名字按照升序排序后的结果为:\n");
	ContactPrint(pc);
}

test.c

#define _CRT_SECURE_NO_WARNINGS

#include"contact.h"

int main()
{
	int input = 0;
	contact con;
	ContactInit(&con);
	do
	{
		menu();
		printf("请选择你需要的功能:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			ContactAdd(&con);
			break;
		case DELE:
			ContactDele(&con);
			break;
		case SEARCH:
			ContactFind(&con);
			break;
		case MODIFY:
			ContactModify(&con);
			break;
		case AGESORT:
			ContactSortByAge(&con);
			break;
		case SHOW:
			ContactPrint(&con);
			break;
		case NAMESORT:
			ContactSortByName(&con);
			break;
		case EXIT:
			break;
		default:
			printf("选择错误,重新选择。\n");
		}

	} while (input);


	ContactDestroy(&con);
	return 0;
}

结束。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

先搞面包再谈爱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值