动态内存开辟实现通讯录

调试的主函数
test.h

#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "contant.h"
//#include "contant.c"

void menu()
{
	printf("******************************\n");
	printf("*****   1.add    2.del      **\n");
	printf("*****   3.search 4.modify   **\n");
	printf("*****   5.sort   6.print    **\n");
	printf("*****   0.exit   -1.enpty   **\n");
	printf("******************************\n");
}
enum Option
{
	EXIT = 0,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	PRINT,
	ENPTY=-1,

};
int main()
{	
	int input = -1;
	/*struct PeoInfo data[MAX_DATA];*/
	Contact Con;
	InitContact(&Con);
	do
	{
		menu();
		printf("请输入一个值:> >");
		scanf("%d", &input);
		switch (input)
		{
			case ADD:
				AddContact(&Con);
				break;
			case DEL:
				DelContact(&Con);
				break;
			case SEARCH:
				SearchContact(&Con);
				break;
			case MODIFY:
				ModifyContact(&Con);
				break;
			case SORT:
				SortContact(&Con);
				break;
			case PRINT:
				PrintContact(&Con);
				break;
			case EXIT:
				SaveContact(&Con);//保存数据
				DestoryContact(&Con);
				printf("退出!\n");
				break;
			case ENPTY:
				EnptyContact(&Con);
				break;
			default:
				printf("非法格式!请重新选择!\n");
				break;

		}
	} while (input);
	return 0;
}
`






声明的头文件

pragma once

include <stdio.h>

include <string.h>

include <stdlib.h>

define MAX_NAME 20

define MAX_SEX 10

define MAX_TELE 12

define MAX_ADDR 20

define MAX_DATA 1000

define DEFAULT_SZ 3

define INC_SZ 2

typedef struct PeoInfo
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
//静态增长版本
//typedef struct Contant
//{
// PeoInfo data[MAX_DATA];
// int sz;
//}Contact;
typedef struct Contant//定义通讯录
{
PeoInfo* data;
int sz;
int capacity;
}Contact;
void InitContact(Contact* pc);
void AddContact(Contact* pc);
void PrintContact(const Contact pc);
void DelContact(Contact pc);
void SearchContact(Contact
pc);
void ModifyContact(Contact
pc);
void SortContact(Contact* pc);
void DestoryContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadContact(Contact* pc);//加载文件
void CheckCapacity(Contact* pc);//增容函数
void EnptyContact(Contact* pc);//清空通讯录
`

功能函数实现

#define  _CRT_SECURE_NO_WARNINGS 1
#include "contant.h"
static int FindByName(Contact* pc,char name[])//查找
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
static int IsAdd(Contact*pc, char name[])//判断姓名是否重复
{

	int pos= FindByName(pc, name);
	if (pos != -1)
	{
		printf("该姓名在通讯录中已存在\n");
		printf("请重新命名:> ");
		return -1;
	}
	return 1;
}
//void InitContact(Contact* pc)//初始化通讯录//静态版本
//{
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//}
void LoadContact(Contact* pc);
void InitContact(Contact* pc)//初始化通讯录//动态版本
{
	pc->data = (PeoInfo*)malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContact");
		return;
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	//加载文件
	LoadContact(pc);
}
//void AddContact(Contact* pc)//添加联系人//静态版本
//{
//	if (pc->sz >= MAX_DATA)
//	{
//		printf("通讯录已存满!\n");
//		return;
//	}
//
//	printf("请输入姓名:> ");
//	while (1)
//	{
//		scanf("%s", (pc->data[pc->sz].name));
//		int Is = IsAdd(pc, (pc->data[pc->sz].name));
//		if (Is == 1)
//		{
//			break;
//		}
//	}
//	printf("请输入年龄:> ");
//	scanf("%d", &(pc->data[pc->sz].age));
//	printf("请输入性别:> ");
//	scanf("%s", (pc->data[pc->sz].sex));
//	printf("请输入电话:> ");
//	scanf("%s", (pc->data[pc->sz].tele));
//	printf("请输入地址:> ");
//	scanf("%s", (pc->data[pc->sz].addr));
//	printf("\n");
//	pc->sz++;
//	printf("存入成功!\n");
//
//}
void CheckCapacity(Contact* pc)
{
	if (pc->sz ==pc->capacity)
	{
		PeoInfo* ptr = realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功!\n");
		}
		else
		{
			perror("AddContact");
			printf("增容失败!\n");
			return;
		}
	}
}
void AddContact(Contact* pc)//添加联系人//动态版本
{
	CheckCapacity(pc);
	/*if (pc->sz ==pc->capacity)
	{
		PeoInfo* ptr = realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功!\n");
		}
		else
		{
			perror("AddContact");
			printf("增容失败!\n");
			return;
		}
	}*/

	printf("请输入姓名:> ");
	while (1)
	{
		scanf("%s", (pc->data[pc->sz].name));
		int Is = IsAdd(pc, (pc->data[pc->sz].name));
		if (Is == 1)
		{
			break;
		}
	}
	printf("请输入年龄:> ");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入性别:> ");
	scanf("%s", (pc->data[pc->sz].sex));
	printf("请输入电话:> ");
	scanf("%s", (pc->data[pc->sz].tele));
	printf("请输入地址:> ");
	scanf("%s", (pc->data[pc->sz].addr));
	printf("\n");
	pc->sz++;
	printf("存入成功!\n");

}
void PrintContact(const Contact* pc)//展示联系人
{
	printf("共%d位联系人\n", (pc->sz));
	printf("      %-5s\t %-5s\t %-3s\t %-12s\t %-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%4d)  %-5s\t %-5d\t %-3s\t %-12s\t %-20s\t\n",i+1, pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
		
	}
	
}

//void DelContact(Contact* pc)//删除联系人//静态版本
//{
//	char name[MAX_NAME] = { 0 };
//	if (pc->sz == 0)
//	{
//		printf("通讯录为空!\n");
//		return;
//	}
//	printf("请输入要删除的名字:> ");
//	scanf("%s", name);
//	int pos = FindByName(pc, name);
//	if (pos == -1)
//	{
//		printf("无法找到对应姓名\n");
//		return;
//	}
//	//删除
//	/*printf("确认要删除该联系")*/
//	int i = 0;
//	for (i = pos; i <= (pc->sz - 1); i++)
//	{
//		pc->data[i] = pc->data[i + 1];
//	}
//	pc->sz--;
//	printf("\n");
//	printf("删除成功!\n");
//	
//}
void DelContact(Contact* pc)//删除联系人//动态版本
{
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要删除的名字:> ");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("无法找到对应姓名\n");
		return;
	}
	//删除
	/*printf("确认要删除该联系")*/
	int i = 0;
	for (i = pos; i <= (pc->sz - 1); i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("\n");
	printf("删除成功!\n");
	if ((pc->capacity - pc->sz) == INC_SZ&&pc->capacity>=DEFAULT_SZ)
	{
		PeoInfo* ptr = realloc(pc->data, (pc->capacity - INC_SZ) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity -= INC_SZ;
			printf("减容成功!\n");
		}
		else
		{
			perror("AddContact");
			printf("减容失败!\n");
			return;
		}

	}
}
void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要查询的名字:> ");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("无法找到对应姓名\n");
		return;
	}
	printf("      %-5s\t %-5s\t %-3s\t %-12s\t %-20s\t\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%4d)  %-5s\t %-5d\t %-3s\t %-12s\t %-20s\t\n",pos+1, pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].tele,
		pc->data[pos].addr);
	printf("\n");
	printf("查询成功!\n");
}
void ModifyContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	printf("请输入要修改的名字:> ");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("无法找到对应姓名\n");
		return;
	}
	int x = 0;
	while (x==0)
	{
		printf("请开始修改!\n");
		printf("请输入姓名:> ");
		scanf("%s", (pc->data[pos].name));
		int i = 0;
		for (i = 0; i < pc->sz; i++)
		{
			if (i == pos)
			{
				;
			}
			else if (strcmp(pc->data[i].name, pc->data[pos].name) == 0)
			{
				printf("重复姓名!");
				x = 0;
				break;
			}
			else
			{
				x = -1;
			}
			
		}
		/*printf("%d", x);*/
		if (x == -1)
		{
			break;
		}
	}
	
	printf("请输入年龄:> ");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:> ");
	scanf("%s", (pc->data[pos].sex));
	printf("请输入电话:> ");
	scanf("%s", (pc->data[pos].tele));
	printf("请输入地址:> ");
	scanf("%s", (pc->data[pos].addr));
	printf("\n");
	/*pc->sz++;*/
	printf("修改成功!\n");
}
void SortContact(Contact* pc)//排序
{
	char name[MAX_NAME] = { 0 };
	int pos2 = 0;
	printf("请选择要排序的姓名");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("无法找到对应姓名\n");
		return;
	}
	int pos3 = pos2 - 1;
	printf("pos= %d\n", pos + 1);
	printf("请选择要修改到的位置(请输入数字)!\n");
	/*printf("pos= %d\n", pos+1);*/
	scanf("%d", &pos3);//忘了写&了
	pos2 = pos3 - 1;
	int i = 0;
	/*Contact tmp = { 0 };
	tmp.data[0] = (pc->data[pos]);*/
	/*if (pos2 >= 0 && pos2 <= pc->sz - 1)
	{
		printf("输入错误\n");
	}
	for (i = pos; i >=pos2+1; i--)
	{
		pc->data[i] = pc->data[i - 1];
	}*/

	while(pos3<0 || pos3>(pc->sz) - 1 || pos3 == pos)
	{
		printf("输入错误!\n");
		printf("pos= %d\n", pos + 1);
		printf("请重新选择要修改到的位置(请输入数字)!\n");
		/*printf("pos= %d\n", pos+1);*/
		scanf("%d", &pos3);
		pos2 = pos3 - 1;
	}
	PeoInfo data2[1] = { 0 };
	data2[0] = pc->data[pos];

	if (pos2 > pos)
	{
		for (i = pos; i <= pos2 ; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->data[pos2] = data2[0];
	}
	if (pos2 < pos)
	{
		for (i = pos; i >= pos2; i--)
		{
			pc->data[i] = pc->data[i - 1];
		}
		pc->data[pos2] = data2[0];
	}
	/*pc->data[pos2] = tmp.data[0];*/
	printf("\n");
	printf("修改排序完成!\n");
}
void DestoryContact(Contact* pc)//清除内存
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
	
}
void SaveContact(Contact* pc)//保存数据
{
	FILE* pf = fopen("contact.dat", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	int i =0 ;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	printf("保存成功!");
}
void LoadContact(Contact* pc)
{
	FILE* pf = fopen("contact.dat", "r");
	if (pf ==NULL )
	{
		perror("fopen");
		return;
	}
	//读取数据
	PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(PeoInfo), 1, pf))//先将数据存入tmp中,再转存到data
	{
		CheckCapacity(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	printf("加载完成!\n");

}
void EnptyContact(Contact* pc)//清空通讯录
{
	FILE* pf = fopen("contact.dat", "w");//利用w打开即清空的特点清空通讯录
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_SZ;
	fclose(pf);
	pf = NULL;
	
	printf("清空完成!\n");
}
`
ending.
posted @   辰末之星  阅读(3)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示