c通讯录 :动态申请内存版本

//1.contect.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contect.h"
#include<assert.h>
void InitContect(Contect* pc)
{
	pc->sz = 0;
	//memset(pc->data, 0, sizeof(pc->data));
	//新增
	pc->data = (PeoInfo*)calloc(DEFAULT, sizeof(PeoInfo));//1000个PeoInfo结构体大小字节内存
	if (pc->data == NULL)
	{
		printf("%s\n", strerror(errno));
		return;
	}
	pc->captity = DEFAULT;
}
int FindByName(const Contect* pc,char*name)
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;
}
void Search(Contect* pc)
{
	assert(pc);
	int i = 0;
	printf("请输入查找人的名字:");
	char name[100] = { 0 };
	int pos = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			pos = i;
		}
	}
	printf("%-20s %-3d %-5s %-11d %-5s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-3d %-5s %-11d %-5s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
enum
{
	NAME,
	AGE,
	SEX,
	TEL,
	ADDR,
	EXIT
};
void Modify(Contect* pc)
{
	printf("请输入要修改的名字:");
	char name[100] = { 0 };
	char temp_name[100] = { 0 }; char temp_sex[100] = { 0 }; long long temp_tel=0; char temp_addr[100] = { 0 };
	int temp_age=0;
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
		return;
	int i = 0;
	int input = 1;
	printf("请选择要修改的项:0 姓名 1 年龄 2 性别 3 电话 4 地址 5 停止修改");
	while (input)
	{
		scanf("%d", &i);
		switch (i)
		{
		case NAME:
			printf("请选择要修改的内容:");
			scanf("%s", temp_name);
			memcpy(pc->data[pos].name, temp_name, sizeof(temp_name));
			break;
		case AGE:
			printf("请选择要修改的内容:");
			scanf("%d", &temp_age);
			pc->data[pos].age = temp_age;
			break;
		case SEX:
			printf("请选择要修改的内容:");
			scanf("%s", temp_sex);
			memcpy(pc->data[pos].sex, temp_sex, sizeof(temp_sex));
			break;
		case TEL:
			printf("请选择要修改的内容:");
			scanf("%lld", &temp_tel);
		    pc->data[pos].tele = temp_tel;
			break;
		case ADDR:
			printf("请选择要修改的内容:");
			scanf("%s", temp_addr);
			memcpy(pc->data[pos].addr, temp_addr, sizeof(temp_addr));
			break;
		case EXIT:
			free(pc->data);
			pc->data = NULL;
			pc->captity = 0;
			pc->sz = 0;
			return;
	    default:
			break;
		}
	}
	printf("修改完毕");
}
void DelContect(Contect* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空");
		return;
	}
	char name[100] = { 0 };
	printf("请输入要删除的人的名字:");
	scanf("%s", name);
	//找到
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		return;
	}
	//删除
	for (int i = pos; i < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功");
}
void CheckCapacity(Contect* pc)
{
	if (pc->sz == pc->captity)
	{
		//reaclloc(char*,size_t)
		PeoInfo* ptr = realloc(pc->data, (pc->captity * 2) * sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->captity *= 2;
		}
	}
}


void AddContect(Contect* pc)
{
	CheckCapacity(pc);
	//if (pc->sz > 1000)
	//{
	//	printf("通讯录已满");
	//	return;
	//}


	printf("输入名字:");
	scanf("%s", pc->data[pc->sz].name);
	printf("输入年龄:");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("输入性别:");
	scanf("%s", pc->data[pc->sz].sex);
	printf("输入电话:");
	scanf("%lld", &(pc->data[pc->sz].tele));
	printf("输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
}
void PrintContect(Contect* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%s %d %s %lld %s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//2 contect.h
#pragma once
#include<string.h>
#include<stdio.h>
#define DEFAULT 1000


typedef struct PeoInfo
{
	char name[20];
	char sex[5];
	int age;
	long long tele;
	char addr[30];
}PeoInfo;


typedef struct Contect
{
	PeoInfo* data;
	int captity;
	//PeoInfo data[DEFAULT];//存放1000人信息
	int sz;//已经保存的信息个数
}Contect;
void CheckCapacity(Contect* pc);
void InitContect(Contect* pc);
void AddContect(Contect* pc);
void PrintContect(Contect* pc);
int FindByName(const Contect* pc, char*name);
void DelContect(Contect* pc);
void Search(Contect* pc);
void Modify(Contect* pc);

//3.test.c
#define _CRT_SECURE_NO_WARNINGS 1


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


void test()
{
	int input = 0;
	Contect con;//通讯录
    //初始化
	InitContect(&con);
	char name[100] = { 0 };
	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContect(&con);
			break;
		case DEL:
			DelContect(&con);
			break;
		case SEARCH:
			Search(&con);
			break;
		case MODIFY:
			Modify(&con);
			break;
		case SORT:
			break;
		case PRINT:
			PrintContect(&con);
			break;
		default:
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

1.其中主要是realloc和calloc函数的使用:realloc(char*p,SIZE)其中p是原内存地址,如果扩容的内存以原内存为起始地址,则返回源地址;否则将申请新内存,新的地址

 (PeoInfo*)calloc(DEFAULT, sizeof(PeoInfo));//1000个PeoInfo结构体大小字节内存  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老赵的博客

叮咚,你的赏钱已到账,嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值