【c语言】通讯录的简单实现文件版本(动态开辟内存)

本文介绍了一个简单的通讯录管理系统的设计与实现,包括信息录入、查询、修改等功能,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、通讯录功能分为以下模块:

a)信息创建模块:对信息进行录入,通过进行相关操作,保存所需的文件;

b)信息查询:在信息载入和信息创建的前提下,对某人的信息进行查询;

c)信息修改:在信息载入和信息创建的前提下,对需更改信息的某人进行修改;

d)信息删除:在信息载入和信息创建的前提下,对某人的信息进行删除;

e)信息显示:在信息载入和信息创建的前提下,显示出系统所有人的信息;

f )信息排序:在信息载入和信息创建的前提下,根据姓名对通讯录排序;

g)清空信息:在信息载入和信息创建的前提下,清空通讯录;

h)保存信息:在信息载入和信息创建的前提下,对通讯录进行相关的编辑后,保存所需的文件;

i)退出程序:退出该程序,结束程序运行。


二、代码分为三部分:头文件、函数、测试函数

头文件:#contact.h

#ifndef __CONTACT_H__
#define __CONTACT_H__

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

//#define MAX 1000    //通讯录最大容量
#define NAMEMAX 10
#define TELE 12
#define ADDR 25
#define SEX 5
#define CAPACITY 3   //当前容量
#define FILENAME "daima.txt"

typedef struct Peoinfo
{
	char name[NAMEMAX];
	char sex[SEX];
	int age;
	char addr[ADDR];
	char tele[TELE];
}Pof;
typedef struct Contact
{
	Pof *data;   //信息储存的区域
	int sz;  //有效元素的个数
	int capacity;  //容量
	char filename[100];  //文件名
}Contact,*p;

void Init(p list);         //初始化函数
void Add(p pcon);          //录入函数
void Show(const p pcon);   //显示函数
void Delete(p pcon);       //删除函数
void Search(p pcon);      //寻找函数
void Modify(p pcon);     //修改函数
void Sort(p pcon);      //排序函数
void Clear(p pcon);     //清空函数
void Addcapacity(p pcon); //增容函数
void Save(p pcon);    //保存文件
void display(p pcon);  //文件读入函数
void Destory(p pcon); //释放内存函数

#endif


函数:#contact.c

#include"contact.h"
void display(p pcon)      //文件读入函数
{
	int i = 0;
	FILE*pfin = fopen(FILENAME, "r");
		if (pfin == NULL)
		{
			perror("fopen");
			exit(EXIT_FAILURE);
		}
		Pof tem = { 0 };
		while (fread(&tem, sizeof(Pof), 1, pfin) != 0)
		{
			Addcapacity(pcon);   //加载信息要先开辟空间
			pcon->data[i] = tem;
			i++;
			pcon->sz++;
		}
		printf("读入成功");
		fclose(pfin);
}
void Save(p pcon)   //数据写入文件函数
{
	int i = 0;
	FILE*pf = fopen(FILENAME, "w");
	if (pf == NULL)
	{
		perror("fopen");
		exit(EXIT_FAILURE);
	}
	for (i = 0; i < pcon->sz; i++)
	{
		fwrite(pcon->data+i, sizeof(Pof), 1, pf);
	}
	fclose(pf);
}

void Init(p list)  //初始化函数
{
	list->sz = 0;
	list->data = malloc(CAPACITY*sizeof(Pof));   //初始化函数memset
	if (list->data == NULL)
	{
		perror("use malloc fail!");
		exit(0);//正常退出
	}
	memset(list->data, 0, CAPACITY*sizeof(Pof));
	list->capacity = CAPACITY;
}

void Addcapacity(p pcon)     //增容函数
{
	if (pcon->sz == pcon->capacity)
	{
		//增容
		Pof *ptr = realloc(pcon->data, (pcon->capacity + 2)*sizeof(Pof));
		if (ptr == NULL)
		{
			perror("增容失败");
			exit(0);
		}
		else
		{
			pcon->data = ptr;
			pcon->capacity += 2;
		}
	}
}
void Destory(p pcon)  //释放内存
{
	free(pcon->data);
	pcon->data = NULL;
}


void Add(p pcon)    //录入信息函数
{
	char flat = 'Y';
	while(toupper(flat) == 'Y')
	{
		Addcapacity(pcon);
		int i = 0;
		i = pcon->sz;
		fflush(stdin);
		printf("请输入名字:");
		scanf("%s", pcon->data[i].name);
		printf("请输入性别:");
		scanf("%s", pcon->data[i].sex);
		printf("请输入年龄:");
		scanf("%d", &pcon->data[i].age);
		printf("请输入地址:");
		scanf("%s", pcon->data[i].addr);
		printf("请输入电话:");
		scanf("%s", pcon->data[i].tele);
		pcon->sz++;
		printf("录入成功!\n");
		printf("是否要继续录入信息,请选择(是y或否n):");
		fflush(stdin);
		scanf("%c", &flat);
		if (toupper(flat) != 'Y')
		{
			if (toupper(flat) == 'N')
				return;
			else
			{
				printf("输入错误,请重新输入:");
				fflush(stdin);
				scanf("%c", &flat);
			}
		}
	}
}
void Show(const p pcon)  // 显示函数
{
	int i = 0;
	printf("%6s%6s%5s%15s%15s\n", "姓名", "性别", "年龄", "地址", "电话");
	for (i = 0; i < pcon->sz; i++)
	{
		printf("%6s%6s%5d%15s%15s",
			pcon->data[i].name,
			pcon->data[i].sex,
			pcon->data[i].age,
			pcon->data[i].addr,
			pcon->data[i].tele);
		printf("\n");
	}
}
int find(char name[],p pcon )  //寻找函数
{
	int i = 0;
	for (i = 0; i <pcon->sz; i++)
	{
		if (strcmp(name, pcon->data[i].name) == 0)
			return i;
	}
		return -1;
}
void Delete(p pcon)    // 删除函数
{
	char name[NAMEMAX];
	printf("请输入要删除人的姓名:");
	scanf("%s", &name);
	int ret = find(name,pcon);
	if (ret == -1)
		printf("没找到要删除的人!");
	else
	{
		for (int i = ret; i < pcon->sz; i++)
			pcon->data[i] = pcon->data[i + 1];
		pcon->sz--;
		printf("删除成功!");
	}
}
void Search(p pcon)    //查找函数
{
	char name[NAMEMAX];
	printf("请输入要查找人的姓名:");
	scanf("%s", &name);
	int ret = find(name, pcon);
	if (ret == -1)
		printf("没找到要查找的人!");
	else
	{
		printf("%6s%6s%5d%15s%15s",
			pcon->data[ret].name,
			pcon->data[ret].sex,
			pcon->data[ret].age,
			pcon->data[ret].addr,
			pcon->data[ret].tele);
	}
}
void Modify(p pcon)    //修改函数
{
	char name[NAMEMAX];
	printf("请输入要修改人的姓名:");
	scanf("%s", &name);
	int ret = find(name, pcon);
	if (ret == -1)
		printf("没找到要修改的人!");
	else
	{
		printf("请输入名字:");
		scanf("%s", pcon->data[ret].name);
		printf("请输入性别:");
		scanf("%s", pcon->data[ret].sex);
		printf("请输入年龄:");
		scanf("%d", &pcon->data[ret].age);
		printf("请输入地址:");
		scanf("%s", pcon->data[ret].addr);
		printf("请输入电话:");
		scanf("%s", pcon->data[ret].tele);
		printf("修改成功!");
	}
}
void Sort(p pcon)      //排序函数
{
	int i=0, j = 0;
	for (i = 0; i < pcon->sz - 1;i++)
	for (j = 0; j < pcon->sz - 1 - i;j++)
	{
		if (strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
		{
			Pof tcmp = pcon->data[j];
			pcon->data[j] = pcon->data[j + 1];
			pcon->data[j + 1] = tcmp;
		}
	}
	printf("完成排序!");
}
void Clear(p pcon)   //清空函数
{
	pcon->sz = 0;
	printf("数据已清空");
}

测试函数:#test.c

#include"contact.h"
enum Choose
{
	EXIT,     //退出
	ADD,      //录入信息
	SHOW,     //显示信息
	DELETE,	  //删除信息
	SEARCH,   //查找信息
	MODIFY,   //修改函数
	SORT,     //排序
	CLEAR,    //清空
	DISPLAY   //读入文件
};
void my_enum()
{
	printf("\n\n\t\t\t【通讯录】\n");
	printf("\n\t\t1.录入信息    2.显示信息\n");
	printf("\t\t3.删除信息    4.查找信息\n");
	printf("\t\t5.修改信息    6.信息排序\n");
	printf("\t\t7.清空信息    8.读入文件\n");

	printf("\t请输入数字(1--7),【0退出程序】:");
}

int main()
{
	Contact list;
	Init(&list);
	int i = 0;
	do
	{
		my_enum();
		scanf("%d", &i);
		switch (i)
		{
		case ADD:
			Add(&list);
			break;
		case SHOW:
			Show(&list);
			break;
		case DELETE:
			Delete(&list);
			break;
		case SEARCH:
			Search(&list);
			break;
		case MODIFY:
			Modify(&list);
			break;
		case SORT:
			Sort(&list);
			break;
		case CLEAR:
			Clear(&list);
			break;
		case EXIT:
			Save(&list);
			Destory(&list);
			printf("退出系统");
			break;
		case DISPLAY:
			display(&list);  //文件读入
			break;
		default:
			printf("输入数字有错,请重新输入!");
			break;
		}
	} while (i);
	return 0;
}

运行:



代码里的每个功能我都运行过了,是可以运行的,图片就不放了,好奇的小伙伴可以自己运行下。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值