动态内存开辟实现通讯录
调试的主函数
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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」