C语言进阶通讯录(静态/动态)

Posted Huang_ZhenSheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶通讯录(静态/动态)相关的知识,希望对你有一定的参考价值。

目录

通讯录总体思路及要求:

静态版本:

Contact.h:

头文件声明

联系人类型和通讯录的定义

功能函数的声明

test.c文件: 

打印一个菜单

contact.c文件:

初始化通讯录

增加人的信息

打印人的信息

删除人的信息

查找人的信息

修改人的信息

排序通讯录的信息(这里按名字排序)

动态版本:

通讯录初始化

增加人的信息 

销毁通讯录


通讯录总体思路及要求:

静态版本:

1.通讯录中能够存放1000个人的信息,输入每个人的信息:名字+年龄+性别+电话+地址

2.增加指定人的信息

3.删除指定人的信息

4.修改指定人的信息

5.查找指定人的信息

6.排序通讯录的信息

程序名test.ccontact.hcontact.c
功能测试通讯录的模块

类型定义函数声明

函数的实现

Contact.h:

头文件声明

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 20
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000

联系人类型和通讯录的定义

//类型的定义
typedef struct PeoInfo
{
	char name[MAX_NAME];//姓名
	char sex[MAX_SEX];//性别
	int age;//年龄
	char tele[MAX_TELE];//电话
	char addr[MAX_ADDR];//地址
}PeoInfo;

//通讯录
typedef struct Contact
{
	PeoInfo data[MAX];//存放添加进来的人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
}Contact;

功能函数的声明

//初始化通讯录
void InitContact(Contact* pc);

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

//打印人的信息
void PrintContact(const Contact* pc);

//删除人的信息
void DelContact(Contact* pc);

//查找人的信息
void SearchContact(Contact* pc);

//修改人的信息
void ModifyContact(Contact* pc);

//排序通讯录的信息
void SortContact(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.search 4.modify*****\\n");
	printf("***** 5.sort   6.print *****\\n");
	printf("*****      0.exit      *****\\n");
	printf("****************************\\n");
}
enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SORT,//5
	PRINT,//6
};


int main()
{
	int input = 0;
	//创建通讯录

	//PeoInfo data[MAX];//此通讯录能够放1000个人的信息
	通讯录中当前总共有几个元素
	//int sz = 0;
	
	Contact con;//通讯录
	//初始化通讯录
	InitContact(&con);
	do
	{
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{
		case ADD:
			//增加人的信息
			AddContact(&con);
			break;
		case DEL:
			//删除人的信息
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			//查找人的信息 
			break;
		case MODIFY:
			ModifyContact(&con);
			//修改人的信息
			break;
		case SORT:
			//排序人的信息
			SortContact(&con);
			break;
		case PRINT:
			//打印人的信息
			PrintContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\\n");
			break;
		default:
			printf("选择错误,重新选择\\n");
			break;
		}
	} while (input);
	return 0;
}

contact.c文件:

初始化通讯录

void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data)); 
}

增加人的信息

//增加人的信息
void AddContact(Contact* pc)
{
	if (pc->sz == MAX)
	{
		printf("通讯录已满,无法添加\\n");
		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("%s", pc->data[pc->sz].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[pc->sz].addr);
	pc->sz++;
	printf("增加成功");
}

打印人的信息

//打印人的信息
void PrintContact(const Contact* pc)
{
	//打印标题
	printf("%-20s\\t%-5s\\t%-5s\\t%-12s\\t%-20s\\n","名字","年龄","性别","电话","地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\\t%-5d\\t%-5s\\t%-12s\\t%-20s\\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

删除人的信息

//删除人的信息
static int FindByName(Contact*pc , char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无需返回\\n" );
		return;
	}
	//1.查找要删除的人
	//有/没有
	char name[MAX_NAME] = {0};
	printf("请输入要删除人的名字:");
	scanf("%s",name);
	int pos = FindByName(pc,name);
	if (pos == -1)
	{
		printf("要删除的人不存在\\n");
		return;
	}
	//删除
	int i = 0;
	for (i = pos; i < pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i+1];
	}
	pc->sz--;
	printf("删除成功\\n");
}

查找人的信息

//查找人的信息
void SearchContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要查找人的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\\n");
		return;
	}
	else
	{
		printf("%-20s\\t%-5s\\t%-5s\\t%-12s\\t%-20s\\n", "名字", "年龄", "性别", "电话", "地址");
			printf("%-20s\\t%-5d\\t%-5s\\t%-12s\\t%-20s\\n",
				pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
	}
}

修改人的信息

//修改人的信息
void ModifyContact(Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入要修改人的名字:");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在\\n");
		return;
	}
	else
	{
		printf("请输入名字:");
		scanf("%s", pc->data[pos].name);
		printf("请输入年龄:");
		scanf("%d", &(pc->data[pos].age));
		printf("请输入性别:");
		scanf("%s", pc->data[pos].sex);
		printf("请输入电话:");
		scanf("%s", pc->data[pos].tele);
		printf("请输入地址:");
		scanf("%s", pc->data[pos].addr);
		printf("修改成功\\n");
	}
}

排序通讯录的信息(这里按名字排序)

//排序通讯录的信息
int sort_by_name(const void*e1,const void*e2)
{
	return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}
void SortContact(Contact* pc)
{
	qsort(pc->data,pc->sz,sizeof(pc->data[0]),sort_by_name);
	printf("%-20s\\t%-5s\\t%-5s\\t%-12s\\t%-20s\\n", "名字", "年龄", "性别", "电话", "地址");
	for (int i = 0; i < pc->sz; i++)
	{
		printf("%-20s\\t%-5d\\t%-5s\\t%-12s\\t%-20s\\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

动态版本:

动态增长的版本

1.通讯里初始化后,能存放3个人的信息

2.当我们的空间存放满的时候,增加2个信息

静态版本:

//通讯录
typedef struct Contact
{
	PeoInfo data[MAX];//存放添加进来的人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
}Contact;

 动态版本:

PeoInfo* data= malloc(3*sizeof(PeoInfo))

//通讯录
typedef struct Contact
{
	PeoInfo* data[MAX];//指向动态申请的空间,用来存放联系人的信息
	int sz;//记录的是当前通讯录中有效信息的个数
    int capscity;//记录当前通讯录的最大容量
}Contact;

通讯录初始化

void InitContact(Contact* pc)
{
	pc->data = (PeoInfo*)malloc(DEFAULT_SZ*sizeof(PeoInfo));
	if (pc->data == NULL)
	{
		perror("InitContac");
		return;
	}
	pc->sz = 0;//初始化后默认值为0
	pc->capacity = DEFAULT_SZ;
}

增加人的信息 

//增加联系人(动态版本)
void AddContact(Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		//考虑增容
		PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ)*sizeof(PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity = pc->capacity + INC_SZ;
			printf("增容成功\\n");
		}
		else
		{
			perror("AddContact");
			printf("增加联系人失败\\n");
			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("%s", pc->data[pc->sz].tele);
		printf("请输入地址:");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("增加成功");
}

销毁通讯录

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

以上是关于C语言进阶通讯录(静态/动态)的主要内容,如果未能解决你的问题,请参考以下文章

C语言手撕通讯录(静态动态双版本)——万字实战详解

我们天天在使用的通讯录原来是这样实现的呀!——C语言实现简单静态通讯录和动态通讯录(基于顺序表)

C语言进阶四.动态内存管理

我的C语言学习进阶之旅介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

我的C语言学习进阶之旅介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册

C语言进阶文件操作