通讯录(动态开辟)

目录

1.主函数部分(躯干)

2.各个函数的实现(枝叶)

3.总代码


近期刚学习了动态内存开辟,浅浅写一下通讯录练练手😝😁😁😁

1.主函数部分(躯干)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct eachperson//每一个人信息
{
	char name[20];
	char sex[10];
	int age;
	char telephone[20];
	char address[100];
};


struct list//通讯录
{
	int number;//当前联系人的个数
	int capacity;//通讯录总容量
	struct eachperson* data;//每个联系人的信息
}list;



int main()
{

	list.number = 0;
	list.capacity = 4;
	struct eachperson* tem1 = (struct eachperson*)malloc(list.capacity * (sizeof(struct eachperson)));
	if (tem1 == NULL)
	{
		printf("初始化空间失败,程序退出");
		return 0;
	}
	list.data = tem1;//进行空间的初始化,起始空间总容量为四个练习人的信息

	int n;
	do
	{
		printf("*************请输入012345**************\n");
		printf("*************0.退出********************\n");
		printf("*************1.添加信息****************\n");
		printf("*************2.删除信息****************\n");
		printf("*************3.打印信息****************\n");
		printf("*************4.查找信息****************\n");
		printf("*************5.修改信息****************\n");//打印菜单

		scanf("%d", &n);
		switch (n)
		{
		case 1:
			addlist(&list);//添加联系人的信息
			break;
		case 2:
			dellist(&list);//删除指定联系人的信息
			break;
		case 3:
			printlist(&list);//打印通讯录
			break;
		case 4:
			searchlist(&list);//查看指定联系人的信息
			break;
		case 5:
			modifylist(&list);//修改指定联系人的信息
			break;
		case 0:
			printf("退出成功!!!");
			break;
		default:
			printf("无该选项,请重新选择\n\n\n");
			break;
		}
	} while (n);
     
	 free(list.data);//释放空间
	return 0;
}


注:函数传参时,需传递通讯录的地址,方可进行原通讯录的修改

2.各个函数的实现(枝叶)

void printlist(struct list* p)//打印通讯录
{
	printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < p->number; i++)
	{
		printf("%-10s\t", p->data[i].name);
		printf("%-7s\t", p->data[i].sex);
		printf("%-7d\t", p->data[i].age);
		printf("%-15s\t", p->data[i].telephone);
		printf("%-15s\t", p->data[i].address);
		printf("\n");
	}
	printf("\n\n\n");
}


int findname(struct list* p, char* m)//查找联系人,若存在返回对应序号;不存在,返回-1
{
	for (int i = 0; i < p->number; i++)
	{
		if (strcmp(p->data[i].name, m) == 0)
			return i;
	}
	return -1;
}


void addlist(struct list* p)//添加联系人的信息
{

	char pname[20];
	int newcapacity;
	if (p->number == p->capacity)//判断是否通讯录已满,需要扩容
	{
		newcapacity = 2 + p->capacity;//若通讯录已满,则再增加两个联系人的容量

		struct eachperson* tem = (struct eachperson*)realloc(p->data, newcapacity * sizeof(struct eachperson));
		if (tem == NULL)
		{
			printf("通讯录扩容失败,请重新添加联系人\n\n\n");
			return;
		}

		p->data = tem;
		p->capacity = newcapacity;
		printf("通讯录已扩容\n");//提示信息
	}

	printf("请输入所添加人的信息>\n");
	printf("请输入姓名> \n ");
	scanf("%s", p->data[p->number].name);
	printf("请输入性别> \n ");
	scanf("%s", p->data[p->number].sex);
	printf("请输入年龄> \n ");
	scanf("%d", &p->data[p->number].age);
	printf("请输入电话> \n ");
	scanf("%s", p->data[p->number].telephone);
	printf("请输入地址> \n ");
	scanf("%s", p->data[p->number].address);
	printf("添加成功\n");
	p->number++;


	printf("\n\n\n");
	return;
}


void dellist(struct list* p)//删除指定联系人的信息
{
	printf("请输入需删除联系人的姓名\n");
	while (1)
	{
		char pname[20];
		scanf("%s", pname);
		int k = findname(&list, pname);
		if (k == -1)
		{
			printf("所选联系人不存在,请重新输入");
		}
		else
		{
			for (int i = k; i < p->number - 1; i++)
			{
				p->data[i] = p->data[i + 1];
			}
			p->number--;
			break;
		}
	}
	printf("\n\n\n");
}


void searchlist(struct list* p)//查看指定联系人的信息
{
	printf("请输入所查询联系人的姓名\n");
	char pname[20];
	scanf("%s", pname);
	int k = findname(&list, pname);
	if (k == -1)
	{
		printf("所查询联系人不存在\n");
	}
	else
	{
		printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s\t", p->data[k].name);
		printf("%-7s\t", p->data[k].sex);
		printf("%-7d\t", p->data[k].age);
		printf("%-15s\t", p->data[k].telephone);
		printf("%-15s\t", p->data[k].address);
		printf("\n\n\n");
	}

}


void modifylist(struct list* p)//修改指定联系人的信息
{
	printf("请输入需修改联系人的姓名\n");
	char pname[20];
	scanf("%s", pname);
	int k = findname(&list, pname);
	if (k == -1)
	{
		printf("需修改联系人不存在\n");
	}
	else
	{
		int d;
		printf("请输入所需修改的信息\n1.姓名\n2.性别\n3.年龄\n4.电话\n5.地址\n");
		scanf("%d", &d);
		printf("\n");
		if (d == 1)
		{
			scanf("%s", p->data[k].name);
		}
		if (d == 2)
		{
			scanf("%s", p->data[k].sex);
		}
		if (d == 4)
		{
			scanf("%s", p->data[k].telephone);
		}
		if (d == 5)
		{
			scanf("%s", p->data[k].address);
		}
		if (d == 3)
		{
			scanf("%d", &p->data[k].age);
		}
	}
}

3.总代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct eachperson//每一个人信息
{
	char name[20];
	char sex[10];
	int age;
	char telephone[20];
	char address[100];
};


struct list//通讯录
{
	int number;//当前联系人的个数
	int capacity;//通讯录总容量
	struct eachperson* data;//每个联系人的信息
}list;


void printlist(struct list* p)//打印通讯录
{
	printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < p->number; i++)
	{
		printf("%-10s\t", p->data[i].name);
		printf("%-7s\t", p->data[i].sex);
		printf("%-7d\t", p->data[i].age);
		printf("%-15s\t", p->data[i].telephone);
		printf("%-15s\t", p->data[i].address);
		printf("\n");
	}
	printf("\n\n\n");
}


int findname(struct list* p, char* m)//查找联系人,若存在返回对应序号;不存在,返回-1
{
	for (int i = 0; i < p->number; i++)
	{
		if (strcmp(p->data[i].name, m) == 0)
			return i;
	}
	return -1;
}


void addlist(struct list* p)//添加联系人的信息
{

	char pname[20];
	int newcapacity;
	if (p->number == p->capacity)//判断是否通讯录已满,需要扩容
	{
		newcapacity = 2 + p->capacity;//若通讯录已满,则再增加两个联系人的容量

		struct eachperson* tem = (struct eachperson*)realloc(p->data, newcapacity * sizeof(struct eachperson));
		if (tem == NULL)
		{
			printf("通讯录扩容失败,请重新添加联系人\n\n\n");
			return;
		}

		p->data = tem;
		p->capacity = newcapacity;
		printf("通讯录已扩容\n");//提示信息
	}

	printf("请输入所添加人的信息>\n");
	printf("请输入姓名> \n ");
	scanf("%s", p->data[p->number].name);
	printf("请输入性别> \n ");
	scanf("%s", p->data[p->number].sex);
	printf("请输入年龄> \n ");
	scanf("%d", &p->data[p->number].age);
	printf("请输入电话> \n ");
	scanf("%s", p->data[p->number].telephone);
	printf("请输入地址> \n ");
	scanf("%s", p->data[p->number].address);
	printf("添加成功\n");
	p->number++;


	printf("\n\n\n");
	return;
}


void dellist(struct list* p)//删除指定联系人的信息
{
	printf("请输入需删除联系人的姓名\n");
	while (1)
	{
		char pname[20];
		scanf("%s", pname);
		int k = findname(&list, pname);
		if (k == -1)
		{
			printf("所选联系人不存在,请重新输入");
		}
		else
		{
			for (int i = k; i < p->number - 1; i++)
			{
				p->data[i] = p->data[i + 1];
			}
			p->number--;
			break;
		}
	}
	printf("\n\n\n");
}


void searchlist(struct list* p)//查看指定联系人的信息
{
	printf("请输入所查询联系人的姓名\n");
	char pname[20];
	scanf("%s", pname);
	int k = findname(&list, pname);
	if (k == -1)
	{
		printf("所查询联系人不存在\n");
	}
	else
	{
		printf("%-10s\t%-7s\t%-7s\t%-15s\t%-15s\n", "姓名", "性别", "年龄", "电话", "地址");
		printf("%-10s\t", p->data[k].name);
		printf("%-7s\t", p->data[k].sex);
		printf("%-7d\t", p->data[k].age);
		printf("%-15s\t", p->data[k].telephone);
		printf("%-15s\t", p->data[k].address);
		printf("\n\n\n");
	}

}


void modifylist(struct list* p)//修改指定联系人的信息
{
	printf("请输入需修改联系人的姓名\n");
	char pname[20];
	scanf("%s", pname);
	int k = findname(&list, pname);
	if (k == -1)
	{
		printf("需修改联系人不存在\n");
	}
	else
	{
		int d;
		printf("请输入所需修改的信息\n1.姓名\n2.性别\n3.年龄\n4.电话\n5.地址\n");
		scanf("%d", &d);
		printf("\n");
		if (d == 1)
		{
			scanf("%s", p->data[k].name);
		}
		if (d == 2)
		{
			scanf("%s", p->data[k].sex);
		}
		if (d == 4)
		{
			scanf("%s", p->data[k].telephone);
		}
		if (d == 5)
		{
			scanf("%s", p->data[k].address);
		}
		if (d == 3)
		{
			scanf("%d", &p->data[k].age);
		}
	}
}



int main()
{

	list.number = 0;
	list.capacity = 4;
	struct eachperson* tem1 = (struct eachperson*)malloc(list.capacity * (sizeof(struct eachperson)));
	if (tem1 == NULL)
	{
		printf("初始化空间失败,程序退出");
		return 0;
	}
	list.data = tem1;//进行空间的初始化,起始空间总容量为四个练习人的信息

	int n;
	do
	{
		printf("*************请输入012345**************\n");
		printf("*************0.退出********************\n");
		printf("*************1.添加信息****************\n");
		printf("*************2.删除信息****************\n");
		printf("*************3.打印信息****************\n");
		printf("*************4.查找信息****************\n");
		printf("*************5.修改信息****************\n");//打印菜单

		scanf("%d", &n);
		switch (n)
		{
		case 1:
			addlist(&list);//添加联系人的信息
			break;
		case 2:
			dellist(&list);//删除指定联系人的信息
			break;
		case 3:
			printlist(&list);//打印通讯录
			break;
		case 4:
			searchlist(&list);//查看指定联系人的信息
			break;
		case 5:
			modifylist(&list);//修改指定联系人的信息
			break;
		case 0:
			printf("退出成功!!!");
			break;
		default:
			printf("无该选项,请重新选择\n\n\n");
			break;
		}
	} while (n);
     
	 free(list.data);//释放空间
	return 0;
}


代码自行取用,错误欢迎指出,😝😝😝🐻

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值