【数据结构】c语言实现通讯录

利用线性表实现通讯录,实际上就是将线性表中数组的类型改成结构体

1、通讯录的创建

在通讯录中,依次放入姓名、年龄、性别、电话号码、地址,

size表示数组中实际元素的个数,capacity表示数组的容量。

#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100

//通讯录数据类型
typedef struct PersonInfo
{
	char name[NAME_MAX];
	int age;
	char gender[GENDER_MAX];
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}Info;
typedef Info SLDataType;
typedef struct Con
{
	SLDataType* a;
	int size;
	int capacity;
}Con;

2、通讯录的初始化

与线性表的初始化是一样的

void ContactInit(Con* pcon)
{
	pcon->a = (SLDataType*)malloc(4 * sizeof(SLDataType));
	if (pcon->a == NULL)
	{
		printf("内存申请失败\n");
		exit(-1);
	}
	pcon->size = 0;
	pcon->capacity = 4;
}

3、通讯录的销毁

与线性表的销毁是一样的

void ContactDesTroy(Con* pcon)
{
	if (pcon->a)
	{
		free(pcon->a);
	}
	pcon->a = NULL;
	pcon->size = pcon->capacity = 0;
}

4、增加联系人

依次输入结构体中的每个成员,如何放进结构体数组中

注意这里同样需要检查数组是否满了,满了则需要扩容

void ContactCheck(Con* pcon)//检查是否满了
{
	assert(pcon);
	if (pcon->size == pcon->capacity)
	{
		pcon->capacity *= 2;
		pcon->a = (SLDataType*)realloc(pcon->a, sizeof(SLDataType) * pcon->capacity);
		if (pcon->a == NULL)
		{
			printf("扩容失败\n");
			exit(-1);
		}
	}
}
void ContactAdd(Con* pcon)
{
	assert(pcon);
	ContactCheck(pcon);
	SLDataType inf;
	printf("请输入姓名:");
	scanf("%s", inf.name);
	printf("请输入年龄:");
	scanf("%d", &inf.age);
	printf("请输入性别:");
	scanf("%s", inf.gender);
	printf("请输入电话:");
	scanf("%s", inf.tel);
	printf("请输入住址:");
	scanf("%s", inf.addr);
	pcon->a[pcon->size] = inf;
	pcon->size++;
}

5、删除联系人

这里是根据联系人的姓名来删除,所以可以直接写一个函数来搜索联系人

int ContactSearchName(Con* pcon,char name[])
{
	int i = 0;
	for (i = 0; i < pcon->size; i++)
	{
		if (strcmp(pcon->a[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void ContactDel(Con* pcon)
{
	printf("请输入要删除的联系人姓名:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = ContactSearchName(pcon, name);
	if (ret == -1)
	{
		printf("未找到联系人\n");
	}
	else
	{
		for (int i = ret; i < pcon->size-1; i++)
		{
			pcon->a[i] = pcon->a[i + 1];
		}
		pcon->size--;
	}
}

6、修改联系人信息

这里也需要用到搜索联系人的函数

void ContactModify(Con* pcon)
{
	printf("请输入要修改的联系人姓名:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = ContactSearchName(pcon, name);
	if (ret == -1)
	{
		printf("未找到联系人\n");
	}
	else
	{
		SLDataType inf;
		printf("请输入姓名:");
		scanf("%s", inf.name);
		printf("请输入年龄:");
		scanf("%d", &inf.age);
		printf("请输入性别:");
		scanf("%s", inf.gender);
		printf("请输入电话:");
		scanf("%s", inf.tel);
		printf("请输入住址:");
		scanf("%s", inf.addr);
		pcon->a[ret] = inf;
	}
}

7、查找联系人

void ContactPrintOne(Con* pcon, int i)
{
	printf("%s ", pcon->a[i].name);
	printf("%d ", pcon->a[i].age);
	printf("%s ", pcon->a[i].gender);
	printf("%s ", pcon->a[i].tel);
	printf("%s\n", pcon->a[i].addr);
}
void ContactFind(Con* pcon)
{
	printf("请输入联系人姓名:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = ContactSearchName(pcon, name);
	if (ret == -1)
	{
		printf("未找到联系人\n");
	}
	else
	{
		ContactPrintOne(pcon, ret);
	}
}

8、查看通讯录

遍历数组,将里面的信息都打印出来

void ContactShow(Con* pcon)
{
	assert(pcon);
	int i = 0;
	for (i = 0; i < pcon->size; i++)
	{
		printf("%s ", pcon->a[i].name);
		printf("%d ", pcon->a[i].age);
		printf("%s ", pcon->a[i].gender);
		printf("%s ", pcon->a[i].tel);
		printf("%s\n", pcon->a[i].addr);
	}
}

你可能感兴趣的:(c语言,开发语言,数据结构)