【C】动态内存开辟(2)——动态内存开辟实例!!!

本文介绍了一个简单的基于C语言实现的通讯录系统,包括添加、显示、删除、搜索、修改联系人等功能,并支持数据持久化存储。

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

      //contact.h文件

#ifndef __CONTACT_H__ 
#define __CONTACT_H__ 

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


//#define MAX 1000 
#define NAME_MAX 20 
#define SEX_MAX 5 
#define ADDR_MAX 30 
#define TELE_MAX 12 
#define CONTACT_ADD 2
#define CONTACT_MAX 3
#define FILE_NAME "contact.dat"

typedef struct PeoInfo             //定义一个通讯录结构体
{ 
	char name[NAME_MAX]; 
	int age; 
	char sex[SEX_MAX]; 
	char addr[ADDR_MAX]; 
	char tele[TELE_MAX]; 
}PeoInfo;	


typedef struct Contact         //维护通讯录的结构体
{ 
	PeoInfo *data; 
	int sz;                 //通讯录的上限
	int capacity;            //每次增容的个数
}Contact, *pContact; 

static CheckCapacity(pContact pcon);
void InitContact(pContact pcon); 
void AddContact(pContact pcon); 
void ShowContact(const pContact pcon); 
void DelContact(pContact pcon); 
void SearchContact(pContact pcon); 
void ModifyContact(pContact pcon); 
void SortContach(pContact pcon); 
void ClearContact(pContact pcon); 
void SaveContactData(pContact pcon);
void LoadContactData(pContact pcon);

#endif


//contact.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(pContact pcon)             //增容函数
{
	int i = 0;
	pcon->data = malloc(CONTACT_MAX*sizeof(PeoInfo));
	if (pcon->data == NULL)
	{
		printf("error malloc:\n");
		exit(EXIT_FAILURE);
	}
	pcon->sz = 0;
	for (i=0;i<pcon->sz;i++)
	{
		memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));
	}
	pcon->capacity = CONTACT_MAX;
	LoadContactData(pcon);
}


static CheckCapacity(pContact pcon)
{
	if (pcon->sz == pcon->capacity)
	{
		PeoInfo* ptr = realloc(pcon->data,(pcon->capacity+CONTACT_ADD)*sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("error realloc:\n");
			exit(EXIT_FAILURE);
		}
		else
		{
			pcon->data = ptr;
			pcon->capacity = pcon->capacity+CONTACT_ADD;
			printf("realloc success\n");
		}
	}
}


void AddContact(pContact pcon)
{
	CheckCapacity(pcon);
	printf("name:");
	scanf("%s",pcon->data[pcon->sz].name);
	printf("sex:");  
	scanf("%s",pcon->data[pcon->sz].sex);
	printf("addr:");
	scanf("%s",pcon->data[pcon->sz].addr);
	printf("age:");
	scanf("%d",&pcon->data[pcon->sz].age);
	printf("tele:");
	scanf("%s",pcon->data[pcon->sz].tele);
	printf("添加成功!!!\n");
	(pcon->sz)++;
}


void _Add(pContact pcon,PeoInfo *tmp)
{
	CheckCapacity(pcon);
	pcon->data[pcon->sz] = *tmp;
	pcon->sz++;
}


void LoadContactData(pContact pcon)
{
	FILE* pf = fopen(FILE_NAME, "r");
	PeoInfo tmp = {0};
	while(fread(&tmp, sizeof(PeoInfo), 1, pf))
	{
		_Add(pcon, &tmp);
	}
}


void SaveContactData(pContact pcon)
{
	int i = 0;
	FILE *fp = fopen(FILE_NAME,"w");
	if ((fp == NULL))
	{
		perror("Open file error!\n");
		exit(EXIT_FAILURE);
	}
	for (i=0;i<pcon->sz;i++)
	{
		fwrite(pcon->data+i, sizeof(PeoInfo), 1, fp);
	}
	fclose(fp);
}



void ShowContact(const pContact pcon)
{
	int i = 0;
	for (i=0;i<pcon->sz;i++)
	{
		printf("name:%s\n",pcon->data[i].name);
		printf("sex:%s\n",pcon->data[i].sex);
		printf("age:%d\n",pcon->data[i].age);
		printf("addr:%s\n",pcon->data[i].addr);
		printf("tele:%s\n",pcon->data[i].tele);
	}
}


void ModifyContact(pContact pcon)
{
	int i = 0;
	char name[20] = { 0 };
	printf("请输入要修改的姓名:");
	scanf("%s",name);
	for (i=0;i<=pcon->sz;i++)
	{
		if (strcmp(name, pcon->data[i].name) == 0)
		{
			printf("name:");
			scanf("%s", pcon->data[i].name);
			printf("sex:");
			scanf("%s", pcon->data[i].sex);
			printf("age:");
			scanf("%d", &pcon->data[i].age);
			printf("addr:");
			scanf("%s", pcon->data[i].addr);
			printf("tele:");
			scanf("%s", pcon->data[i].tele);
			printf("修改成功!\n");
			break;
		}
	}
}



void DelContact(pContact pcon)
{
	char name1[20] = { 0 };
	int i = 0;
	int j = 0;
	printf("请输入要删除的姓名:");
	scanf("%s",name1);
	for (i=0;i<pcon->sz;i++)
	{
		if (strcmp(pcon->data[i].name,name1)==0)
		{
			for (j = i; j<pcon->sz; j++)
			{
				pcon->data[j] = pcon->data[j + 1];
			}
			pcon->sz--;
			printf("删除成功!!!");
			break;
		}
		else
		{
			printf("没有此联系人!!\n");
			break;
		}
	}
}





void SearchContact(pContact pcon)
{
	int i = 0;
	char name[20] = { 0 };
	printf("请输入要查找的姓名:");
	scanf("%s",name);
	for (i=0;i<pcon->sz;i++)
	{
		if (strcmp(name, pcon->data[i].name) == 0)
		{
			printf("%s\n", pcon->data[i].name);
			printf("%s\n", pcon->data[i].sex);
			printf("%s\n", pcon->data[i].addr);
			printf("%s\n", pcon->data[i].tele);
			printf("%d\n", pcon->data[i].age);
			break;
		}
		else
		{
			printf("没有找见!\n");
			break;
		}
	}
}






void SortContach(pContact pcon)
{
	int i = 0;
	int j = 0;
	char name[5] = {0};
	for (i=0;i<pcon->sz-1;i++)
	{
		for (j=i;j<pcon->sz-i-1;j++)
		{
			if(strcmp(pcon->data[j].name,pcon->data[j+1].name)>0)
			{
				PeoInfo tmp = pcon->data[j];
				pcon->data[j] = pcon->data[j + 1];

				pcon->data[j + 1] = tmp;
			}
		}
	}
	printf("排序成功!!!");
}




void ClearContact(pContact pcon)
{
	int i = 0;
	pcon->sz = 0;
	for (i=0;i<pcon->sz;i++)
	{
		memset(&(pcon->data[i]),0,sizeof(pcon->data[i]));
	}
	printf("清除成功!!!\n");
}





//test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

void menu()
{
	printf("***************************************************************\n");
	printf("*******   1.add               2.show                 **********\n");
	printf("*******   3.delete            4.search               **********\n");
	printf("*******   5.modify            6.sort                 **********\n");
	printf("*******   7.clear             0.exit                 **********\n");
	printf("***************************************************************\n");
}
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("输入序号:");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			ShowContact(&con);
			break;
		case 3:
			DelContact(&con);
			break;
		case 4:
			SearchContact(&con);
			break;
		case 5:
			ModifyContact(&con);
			break;
		case 6:
			SortContach(&con);
			break;
		case 7:
			ClearContact(&con);
			break;
		default:
			SaveContactData(&con);
			exit(EXIT_SUCCESS);
		}
	} while (1);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值