运用动态内存管理编写通讯录(后附源码)

各位大佬,在上篇博客我完成了通讯录的编写。那么今天给大家带来运用动态内存管理版本的通讯录。

在上一篇博客中我们创造了一个可以容纳100人的数组来存放联系人,但只能存放100人。那么我们使用动态内存是可以存放更多人的。

因此我们先使用malloc函数创造可存放3个人的空间,如果还要存放可以再利用realloc再添加。

首先我们要先将struct contact改进原来的data数组改为指针他指向的是存放数据的空间。然后再加入一个变量capcity,用来表示容量。

struct contact
{
	struct peop* data;
	int sz;
	int capcity;

};

其次需要改进的是我们的初始化函数,在初始化函数中我们应该直接利用malloc开辟空间。而capcity我们直接初始化为3表示刚开始可以存放3个联系人的信息。

void initializecon(struct contact* pc)
{
	pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
	pc->sz = 0;
	pc->capcity = 3;
	
}

那么在我们添加完3个联系人之后,我们就需要用到realloc函数了,realloc函数需要两个参数分别为需要改变的内存地址和改变后的空间大小。改变后的空间大小这里很容易就写成要添加的空间大小了,希望大家可以多多留意,一定是改变后的空间大小!

int chack_peop(struct contact* pc)
{
	if(pc->sz == pc->capcity)
	{
		struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
		printf("增加空间成功!!\n");
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capcity += 2;
			printf("增容成功\n");
			return 1;
		}
		else
		{
			perror("AddContact()");
			return 0;
		}
	}
	else
		return 1;
	}

添加空间成功后就会返回1或者刚开始的空间没有占满也会返回1,如果开辟失败会返回0。

所以我们在添加联系人函数中需要改变一下,将原先的if else语句改为接受chack_peop函数值如果为零直接从函数退出,若不为零再进行联系人的信息输入。

void Addpeop(struct contact* pc)
{
		int ret = chack_peop(pc);
		if(ret == 0)
		{
			return;
		}
		
		printf("请输入联系人信息\n");
		printf("请输入性名:>");

		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->sz].phone_num);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->sz].home);

		
		printf("成功增加联系人\n");
	
	pc->sz++;

}

当然,malloc出来的空间是需要释放的,所以需要再加入一个退出函数quit,他的作用就是将创建出来的空间释放,再将sz和capcity置零。

void quit(struct contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->data = 0;
	pc->capcity = 0;
}

好了现在我们的通讯录就改进完成了。

下面是源码:

contact,h

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_PHONE_NUM 12
#define MAX_HOME 30



struct peop
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	char phone_num[MAX_PHONE_NUM];
	int age;
	char home[MAX_HOME];
};
struct contact
{
	struct peop* data;
	int sz;
	int capcity;

};
void initializecon(struct contact* pc);
void Addpeop(struct contact* pc);
void Cutpeop(struct contact* pc);
void Showpeop(const struct contact* pc);
void Findpeop(const struct contact* pc);
void Exchangepeop(struct contact* pc);
void Sortpeop(const struct contact* pc);
void quit(const struct contact* pc);





contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化
void initializecon(struct contact* pc)
{
	pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
	pc->sz = 0;
	pc->capcity = 3;
	
}
int chack_peop(struct contact* pc)
{
	if(pc->sz == pc->capcity)
	{
		struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
		printf("增加空间成功!!\n");
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capcity += 2;
			printf("增容成功\n");
			return 1;
		}
		else
		{
			perror("AddContact()");
			return 0;
		}
	}
	else
		return 1;
	}


void Addpeop(struct contact* pc)
{
		int ret = chack_peop(pc);
		if(ret == 0)
		{
			return;
		}
		
		printf("请输入联系人信息\n");
		printf("请输入性名:>");

		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->sz].phone_num);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->sz].home);

		
		printf("成功增加联系人\n");
	
	pc->sz++;

}
void Showpeop(const struct contact* pc)
{
	int i;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%s,%s,%d,%s,%s\n", pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].phone_num,
			pc->data[i].home);
	}

}

static int find_peop(struct contact* pc,char name[])
{
	int i = 0;
	int ret = 0;
	for(i;i<pc->sz;i++)
	{
		if(0 == strcmp(pc->data[i].name,name))
		{
			return i;
		}


	}
	return -1;
}

void Cutpeop(struct contact* pc)
{
	char cut_name[MAX_NAME];
	printf("请输入要删除的联系人");
	scanf("%s", &cut_name);
	int ret = find_peop(pc, cut_name);
	if(ret == -1)
	{
		printf("想要删除的联系人不存在!");
	}
	else
	{
		for(int i = ret;i<pc->sz-1;i++)
		{
			pc->data[i] = pc->data[i+1];
		}
		pc->sz--;
		printf("成功删除");
	}
		
}
void Findpeop(const struct contact* pc)
{
	char name[MAX_NAME];
	printf("请输入想要查找的人的名字");
	scanf("%s", &name);
	int ret = find_peop(pc, name);
	if (ret == -1)
	{
		printf("查找的联系人不存在!");

	}
	else
	{
		
		
			printf("%s,%s,%d,%s,%s\n", pc->data[ret].name,
				pc->data[ret].sex,
				pc->data[ret].age,
				pc->data[ret].phone_num,
				pc->data[ret].home);
		
	}
}
void Exchangepeop(struct contact* pc)
{
	char ex_name[MAX_NAME];
	printf("请输入想要修改的联系人姓名");
	scanf("%s", &ex_name);
	int ret = find_peop(pc, ex_name);
	if (ret == -1)
	{
		printf("想要修改的联系人不存在!");

	}
	else
	{
		printf("请输入性名:>");

		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别:>");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄:>");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话:>");
		scanf("%s", pc->data[pc->sz].phone_num);
		printf("请输入地址:>");
		scanf("%s", pc->data[pc->sz].home);
	}
}
int Cmpname(const void* e1, const void* e2)
{
	return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}

void Sortpeop(struct contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(struct peop), Cmpname);
}
void quit(struct contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->data = 0;
	pc->capcity = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
	printf("********************************\n");
	printf("******1.add    2.cut   *********\n");
	printf("******3.find   4.exchange*******\n");
	printf("******5.show   6.sort   ********\n");
	printf("******0.quit********************\n");
	printf("********************************\n");

	
}
int main()
{

	int a = 0;
	struct contact con;
	initializecon(&con);//初始化
	printf("请选择:\n");
	do
	{
		menu();
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			Addpeop(&con);
			break;
		case 2:
			Cutpeop(&con);
			break;
		case 3:
			Findpeop(&con);
			break;
		case 4:
			Exchangepeop(&con);
			break;
		case 5:
			Showpeop(&con);
			break;
		case 6:
			Sortpeop(&con);
			break;
		case 0:
			quit(&con);
			break;
		default:
			break;
		}
	} while (a);
	return 0;
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值