C语言实现通讯录的实现(能动态增加内存)

目录

1、通讯录的目录

2、通讯录的基本外部框架

3、定义联系人的信息

4、定义数组存放联系人并定义变量来存放当前容量等

5、初始化4定义出来的各种变量

6、增加联系人

 7、删除联系人

 8、查找联系人

9、修改联系人

10、打印联系人

11、销毁通讯录并退出

12、完整代码

 

结束语


通讯录大家都知道吧,简单的说就是记录一些人的姓名、性别、年龄、地址等信息。

今天我们来用C语言来简单的实现一下通讯录,在这期间运用了指针、函数、malloc等动态开辟空间的库函数等等知识。

1、通讯录的目录

我们要写一个函数来打印一下通讯录的目录,方便用户实现对应功能!

代码如下:


void menu()
{
	printf("**********************************************\n");
	printf("*******       1.add    2.del           *******\n");
	printf("*******       3.find   4.modify        *******\n");
	printf("*******       5.print  0.exit          *******\n");
	printf("**********************************************\n");
}

只要在进入通讯录的程序前将此函数进行调用,就可以实现此代码。

2、通讯录的基本外部框架

通过我们的目录可以看出,用户可以选择1 2 3 4 等等来实现对应的功能,所以让我们不难想到用switch来实现此功能。

代码如下:

switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3 :
			break;
		case 4:
			break;
		case 5:
			break;
		case 0:
			break;
		default :
			printf("输入错误,请重新输入!\n");
			break;
		}

但是这里有一点不合理,当我们实现了某个功能之后,这个通讯录就会退出,那么就不能继续实现其他功能,因此我们需要一个循环来实现可以多次进入通讯录,而且当输入0时不进入循环!

代码如下:

do{
switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3 :
			break;
		case 4:
			break;
		case 5:
			break;
		case 0:
			break;
		default :
			printf("输入错误,请重新输入!\n");
			break;
		}

}while(input);

3、定义联系人的信息

我们用结构体来定义一下联系人的信息,代码如下:

typedef struct student
{
	char name[10];
	int age;
	char sex[5];
	char num[11];
	char adress[20];
}PeoInfo;

并且用 typedef 来将struct student 重新命名为 PeoInfo。

4、定义数组存放联系人并定义变量来存放当前容量等

代码如下:

typedef struct Contact
{
	PeoInfo* data;
	int sz;
	int capacity;
}Contact;

data为PeoInfo * 类型的指针变量,里面的每个元素存放的各个联系人的各种信息,sz为当前的有效个数,capacity为容量。

5、初始化4定义出来的各种变量

void InitContact(Contact* pc)
{
	pc->data = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
	pc->capacity = 3;
	pc->sz = 0;
}

6、增加联系人

因为我们要实现的是一个可以动态增长的通讯录,因此我们起初不用开辟很大的空间,当我们需要空间的时候可以临时增加!并且当我们的容量等于当前有效的联系人个数的时候我们就需要增加联系人!

代码如下:


void AddContact(Contact* pc)
{
	//增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* tmp = realloc(pc->data, (pc->capacity * 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc ->data= tmp;
			pc->capacity *= 2;
			printf("增容成功!\n");
		}
	}
	printf("请输入名字:>\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>\n");
	scanf("%d", &(pc->data[pc->sz]).age);//由于年龄不是数组 所以加上&符号
	printf("请输入性别:>\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话号:>\n");
	scanf("%s", pc->data[pc->sz].num);
	printf("请输入地址:>\n");
	scanf("%s", pc->data[pc->sz].adress);
	pc->sz++;
}

 7、删除联系人

此函数实现删除联系人,当我们要删除一个联系人的时候,首先要在通讯录里面查找需要删除的联系人,然后再将其删除!

void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	else
	{
		printf("请输入你删除联系人的名字:>\n");
		char NAME[100] = { 0 };
		scanf("%s", NAME);
		int pos = FindByContact(pc, NAME);
		if (pos == -1)
		{
			printf("没有找到该联系人!\n");
		}
		else
		{
			for (int i = pos; i < pc->sz; i++)
			{
				pc->data[i] = pc->data[i + 1];
			}
			pc->sz--;
			printf("删除成功!\n");
		}
	}
}

不难发现里面有一个查找函数,并且可以将查找到的联系人的下标进行返回!

查找函数代码如下:


int  FindByContact(Contact* pc, char* NAME)
{
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(NAME, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;

}

 8、查找联系人

此查找非彼查找,此函数需要将查找到的联系人的信息进行打印一下!

代码如下:

void FindContact(Contact* pc)
{
	printf("请输入你删除联系人的名字:>\n");
	char NAME[100] = { 0 };
	scanf("%s", NAME);
	int pos = FindByContact(pc, NAME);
	if (pos == -1)
	{
		printf("查无此人!\n");
	}
	else
	{
		PrintContact(pc);
	}
}

9、修改联系人

同上边的删除联系人一样,当我们需要删除某个联系人的时候我们需要首先查找到该联系人!

代码如下:

void ModifyContact(Contact* pc)
{
	printf("请输入你要修改联系人的名字:>\n");
	char NAME[100] = { 0 };
	scanf("%s", NAME);
	int pos = FindByContact(pc, NAME);
	if (pos == -1)
	{
		printf("通讯录中没有该联系人!");
	}
	else
	{
		printf("请输入新的名字:>\n");
		scanf("%s", pc->data[pos].name);
		printf("请输入新的年龄:>\n");
		scanf("%d", &(pc->data[pos]).age);//由于年龄不是数组 所以加上&符号
		printf("请输入新的性别:>\n");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的电话号:>\n");
		scanf("%s", pc->data[pos].num);
		printf("请输入新的地址:>\n");
		scanf("%s", pc->data[pos].adress);
		printf("修改成功!");
	}

}

10、打印联系人

此函数实现的功能是将我们通讯录里面所存储的联系人的信息给逐个打印出来!

代码如下:


void PrintContact(Contact* pc)
{
	int i = 0;
	printf("%10s\t%5s\t%10s\t%15s\t%10s\n\n",
		"name", "age", "sex", "telephone", "adress");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%10s\t%5d\t%10s\t%15s\t%10s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].num,
			pc->data[i].adress);
	}
}

11、销毁通讯录并退出

因为我们是动态实现的通讯录,所以当我们用完之后要将其正确的销毁。

代码如下:

void DestroyContact(Contact* pc)
{
	pc->data = NULL;
	free(pc->data);
	pc->sz = 0;
	pc->capacity = 3;
}

12、完整代码

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"
void InitContact(Contact* pc)
{
	pc->data = (PeoInfo*)malloc(3 * sizeof(PeoInfo));
	pc->capacity = 3;
	pc->sz = 0;
}
void AddContact(Contact* pc)
{
	//增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* tmp = realloc(pc->data, (pc->capacity * 2) * sizeof(PeoInfo));
		if (tmp != NULL)
		{
			pc ->data= tmp;
			pc->capacity *= 2;
			printf("增容成功!\n");
		}
	}
	printf("请输入名字:>\n");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入年龄:>\n");
	scanf("%d", &(pc->data[pc->sz]).age);//由于年龄不是数组 所以加上&符号
	printf("请输入性别:>\n");
	scanf("%s", pc->data[pc->sz].sex);
	printf("请输入电话号:>\n");
	scanf("%s", pc->data[pc->sz].num);
	printf("请输入地址:>\n");
	scanf("%s", pc->data[pc->sz].adress);
	pc->sz++;
}


void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	else
	{
		printf("请输入你删除联系人的名字:>\n");
		char NAME[100] = { 0 };
		scanf("%s", NAME);
		int pos = FindByContact(pc, NAME);
		if (pos == -1)
		{
			printf("没有找到该联系人!\n");
		}
		else
		{
			for (int i = pos; i < pc->sz; i++)
			{
				pc->data[i] = pc->data[i + 1];
			}
			pc->sz--;
			printf("删除成功!\n");
		}
	}
}

int  FindByContact(Contact* pc, char* NAME)
{
	/*char NAME[] = { 0 };*/
	//printf("请输入你要查找联系人的姓名:>\n");
	/*scanf("%d", NAME);*/
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(NAME, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void FindContact(Contact* pc)
{
	printf("请输入你删除联系人的名字:>\n");
	char NAME[100] = { 0 };
	scanf("%s", NAME);
	int pos = FindByContact(pc, NAME);
	if (pos == -1)
	{
		printf("查无此人!\n");
	}
	else
	{
		PrintContact(pc);
	}
}

void ModifyContact(Contact* pc)
{
	printf("请输入你要修改联系人的名字:>\n");
	char NAME[100] = { 0 };
	scanf("%s", NAME);
	int pos = FindByContact(pc, NAME);
	if (pos == -1)
	{
		printf("通讯录中没有该联系人!");
	}
	else
	{
		printf("请输入新的名字:>\n");
		scanf("%s", pc->data[pos].name);
		printf("请输入新的年龄:>\n");
		scanf("%d", &(pc->data[pos]).age);//由于年龄不是数组 所以加上&符号
		printf("请输入新的性别:>\n");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的电话号:>\n");
		scanf("%s", pc->data[pos].num);
		printf("请输入新的地址:>\n");
		scanf("%s", pc->data[pos].adress);
		printf("修改成功!");
	}

}

void PrintContact(Contact* pc)
{
	int i = 0;
	printf("%10s\t%5s\t%10s\t%15s\t%10s\n\n",
		"name", "age", "sex", "telephone", "adress");
	for (i = 0; i < pc->sz; i++)
	{
		printf("%10s\t%5d\t%10s\t%15s\t%10s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].num,
			pc->data[i].adress);
	}
}

void DestroyContact(Contact* pc)
{
	pc->data = NULL;
	free(pc->data);
	pc->sz = 0;
	pc->capacity = 3;
}
****************************************************************************************
Contact.h

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

typedef struct student
{
	char name[10];
	int age;
	char sex[5];
	char num[11];
	char adress[20];
}PeoInfo;
//动态通讯录
typedef struct Contact
{
	PeoInfo* data;
	int sz;
	int capacity;
}Contact;


//增加联系人
void AddContact(Contact* pc);

//删除联系人
 void DelContact(Contact *pc);

 //查找联系人
 void FindContact(Contact* pc);
 int  FindByContact(Contact* pc, char* NAME);

 //修改联系人
 void ModifyContact(Contact *pc);


//打印联系人
void PrintContact(Contact* pc);

//销毁通讯录
void DestroyContact(Contact* pc);


***********************************************************************************
test.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"Contact.h"

void menu()
{
	printf("**********************************************\n");
	printf("*******       1.add    2.del           *******\n");
	printf("*******       3.find   4.modify        *******\n");
	printf("*******       5.print  0.exit          *******\n");
	printf("**********************************************\n");
}
int main()
{
	int input = 0;
	Contact con;
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你要选择的选项:>\n");
		scanf("%d", &input);
		//初始化通讯录
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DelContact(&con);
			break;
		case 3 :
			FindContact(&con);
			break;
		case 4:
			ModifyContact(&con);
			break;
		case 5:
			PrintContact(&con);
			break;
		case 0:
			DestroyContact(&con);
			break;
		default :
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);

}

结束语

若有错误欢迎各位老铁指出,也感谢您的观看,下期见哈!

猜你喜欢

转载自blog.csdn.net/m0_57249790/article/details/123807826
今日推荐