0
点赞
收藏
分享

微信扫一扫

通讯录(动态与静态)实现 w字 C语言进阶

目录

1. 序言

2. 静态实现

2.1. 效果展示图

2.2. 接口实现

2.2.01. 首先是我们的框架

2.2.02. 要实现的接口

2.2.03. 初始化

2.2.04. 增加联系人

2.2.05. 删除

2.2.06. 查找 

2.2.07. 改成员数据

2.02.08. 显示成员

2.02.09.  排序

2.3. 源代码

test.c

Contact.h 

Contact.c

3. 动态版

3.1. 通讯录的创建

3.2. 初始化

3.3. 增加数据

动态版源代码

test.c

Contact.h 

Contact.c


1. 序言

2. 静态实现

2.1. 效果展示图

2.2. 接口实现

2.2.01. 首先是我们的框架

int main()
{
	do
	{
		menu();

		switch ()
		{
		case:
		default:
		}
	} while ();
	return 0;
}

2.2.02. 要实现的接口

2.2.03. 初始化

2.2.04. 增加联系人

2.2.05. 删除

2.2.06. 查找 

2.2.07. 改成员数据

2.02.08. 显示成员

2.02.09.  排序

2.3. 源代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"


void menu()
{
	printf("**************************************************************\n");
	printf("******************** 1.Add    2.Delet  ***********************\n");
	printf("******************** 3.Search 4.Modify ***********************\n");
	printf("******************** 5.Show   6.Sort   ***********************\n");
	printf("******************** 0.exitcontact     ***********************\n");
	printf("**************************************************************\n");
}

int main()
{
	int input=0;
	Contact con;
	char name[10] = { 0 };
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你要选择的选项:\n");
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			printf("增加通讯录成员:\n");
			AddContact(&con);
			break;
		case Delet:
			printf("删除通讯录成员:\n");
			printf("请输入要删除人员姓名:");
			char name[NAME_MAX] = { 0 };
			scanf("%s", name);
			DeletContact(&con, name);
			break;
		case Search:
			printf("查找通讯录成员:\n");
			printf("请输入要查找人员姓名:");
			scanf("%s", name);
			SearchContact(&con, name);
			break;
		case Modify:
			printf("更改通讯录成员信息:\n");
			printf("请输入要查找人员姓名:");
			scanf("%s", name);
			ModifyContact(&con, name);
			break;
		case Show:
			printf("显示通讯录成员:\n");
			ShowContact(&con);
			break;
		case Sort:
			printf("排序通讯录成员:\n");
			SortContact(&con);
			break;
		case exitcontact:
			//DestoryContact(&con);
			printf("退出通讯录:\n");
			break;
		default:
			printf("输入错误,请重新输入:");
			break;
		}
	} while (input);
	return 0;
}

Contact.h 

#pragma once

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>

#define CONTACT_MAX 1000
#define NAME_MAX 10
#define SEX_MAX 5
#define TELEP_MAX 13
#define ADDRESS_MAX 20

typedef struct Student
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char telep[TELEP_MAX];
	char address[ADDRESS_MAX];
}Student;

typedef struct Contact
{
	Student date[CONTACT_MAX];
	int sz;
}Contact;

enum contactmenu
{
	exitcontact,
    Add,
	Delet,
	Search,
	Modify,
	Show,
	Sort,
};

//初始化
void InitContact(Contact* pc);
//增加
void AddContact(Contact* pc);
//删除
void DeletContact(Contact* pc, char name[]);
//查找
void SearchContact(Contact* pc, char name[]);
//修改
void ModifyContact(Contact* pc, char name[]);
//显示
void ShowContact(Contact* pc);
//排序
void SortContact(Contact* pc);
//void DestoryContact(Contact* pc);
int FindContact(Contact* pc, char name[]);


Contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

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

void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == CONTACT_MAX)
	{
		printf("通讯录满了,无法添加\n");
		return;
	}
	printf("输入要添加联系人的姓名:");
	scanf("%s", pc->date[pc->sz].name);
	printf("输入要添加联系人的性别:");
	scanf("%s", pc->date[pc->sz].sex);
	printf("输入要添加联系人的年龄:");
	scanf("%d", &(pc->date[pc->sz].age));
	printf("输入要添加联系人的电话:");
	scanf("%s", pc->date[pc->sz].telep);
	printf("输入要添加联系人的地址:");
	scanf("%s", pc->date[pc->sz].address);

	pc->sz++;
	printf("添加联系人成功\n");
}

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n", 
			pc->date[i].name,pc->date[i].sex,pc->date[i].age,pc->date[i].telep,pc->date[i].address);
	}
}

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

void DeletContact(Contact* pc, char name[])
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("已经没有联系人,不可删除\n");
		return;
	}
	int i = FindContact(pc, name);
	if (i != -1)
	{
		int j = 0;
		for (j=i; j < pc->sz-1; j++)
		{
			pc->date[j] = pc->date[j + 1];
		}
		pc->sz--;
		printf("删除成功!\n");  
	}
	else
	{
		printf("查无此人\n");
	}
}

void SearchContact(Contact* pc, char name[])
{
	assert(pc);
	int ret=FindContact(pc, name);
	if (ret != -1)
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
	}
	else
	{
		printf("没有找到\n");
	}
	
}


void ModifyContact(Contact* pc, char name[])
{
	assert(pc);
	int ret=FindContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
		printf("请修改:\n");
		printf("输入要添加联系人的姓名:");
		scanf("%s", pc->date[ret].name);
		printf("输入要添加联系人的性别:");
		scanf("%s", pc->date[ret].sex);
		printf("输入要添加联系人的年龄:");
		scanf("%d", &(pc->date[ret].age));
		printf("输入要添加联系人的电话:");
		scanf("%s", pc->date[ret].telep);
		printf("输入要添加联系人的地址:");
		scanf("%s", pc->date[ret].address);
		printf("修改成功!\n");
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
}

void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

3. 动态版

3.1. 通讯录的创建

3.2. 初始化

3.3. 增加数据

动态版源代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"


void menu()
{
	printf("**************************************************************\n");
	printf("******************** 1.Add    2.Delet  ***********************\n");
	printf("******************** 3.Search 4.Modify ***********************\n");
	printf("******************** 5.Show   6.Sort   ***********************\n");
	printf("******************** 0.exitcontact     ***********************\n");
	printf("**************************************************************\n");
}

int main()
{
	int input = 0;
	Contact con;
	char name[10] = { 0 };
	InitContact(&con);
	do
	{
		menu();
		printf("请输入你要选择的选项:\n");
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			printf("增加通讯录成员:\n");
			AddContact(&con);
			break;
		case Delet:
			printf("删除通讯录成员:\n");
			printf("请输入要删除人员姓名:");
			char name[NAME_MAX] = { 0 };
			scanf("%s", name);
			DeletContact(&con, name);
			break;
		case Search:
			printf("查找通讯录成员:\n");
			printf("请输入要查找人员姓名:");
			scanf("%s", name);
			SearchContact(&con, name);
			break;
		case Modify:
			printf("更改通讯录成员信息:\n");
			printf("请输入要查找人员姓名:");
			scanf("%s", name);
			ModifyContact(&con, name);
			break;
		case Show:
			printf("显示通讯录成员:\n");
			ShowContact(&con);
			break;
		case Sort:
			printf("排序通讯录成员:\n");
			SortContact(&con);
			break;
		case exitcontact:
			DestoryContact(&con);
			printf("退出通讯录:\n");
			break;
		default:
			printf("输入错误,请重新输入:");
			break;
		}
	} while (input);
	return 0;
}


Contact.h 

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(Contact* pc)
{
	assert(pc);
	Student* new = (Student*)malloc(DEFAULT_SIZE * sizeof(Student));
	if (new != NULL)
	{
		pc->date = new;
		pc->sz = 0;
		pc->capacity = DEFAULT_SIZE;
	}
	else
	{
		printf("InitContact:%s\n", strerror(errno));
		return;
	}
}

void Add_Capacity(Contact* pc)
{
	Student* new = (Student*)realloc(pc->date, sizeof(Student) * (pc->capacity + 2));
	if (new != NULL)
	{
		pc->date = new;
		pc->capacity += 2;
		printf("增容成功!\n");
	}
	else
	{
		printf("Add_Capccity():%s\n", strerror(errno));
		return;
	}
}

void AddContact(Contact* pc)
{
	assert(pc);

	if (pc->capacity == pc->sz)
	{
		Add_Capacity(pc);
	}

	printf("输入要添加联系人的姓名:");
	scanf("%s", pc->date[pc->sz].name);
	printf("输入要添加联系人的性别:");
	scanf("%s", pc->date[pc->sz].sex);
	printf("输入要添加联系人的年龄:");
	scanf("%d", &(pc->date[pc->sz].age));
	printf("输入要添加联系人的电话:");
	scanf("%s", pc->date[pc->sz].telep);
	printf("输入要添加联系人的地址:");
	scanf("%s", pc->date[pc->sz].address);

	pc->sz++;
	printf("添加联系人成功\n");
}

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].telep, pc->date[i].address);
	}
}

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

void DeletContact(Contact* pc, char name[])
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("已经没有联系人,不可删除\n");
		return;
	}
	int i = FindContact(pc, name);
	if (i != -1)
	{
		int j = 0;
		for (j = i; j < pc->sz - 1; j++)
		{
			pc->date[j] = pc->date[j + 1];
		}
		pc->sz--;
		printf("删除成功!\n");
	}
	else
	{
		printf("查无此人\n");
	}
}

void SearchContact(Contact* pc, char name[])
{
	assert(pc);
	int ret = FindContact(pc, name);
	if (ret != -1)
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
	}
	else
	{
		printf("没有找到\n");
	}

}


void ModifyContact(Contact* pc, char name[])
{
	assert(pc);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
		printf("请修改:\n");
		printf("输入要添加联系人的姓名:");
		scanf("%s", pc->date[ret].name);
		printf("输入要添加联系人的性别:");
		scanf("%s", pc->date[ret].sex);
		printf("输入要添加联系人的年龄:");
		scanf("%d", &(pc->date[ret].age));
		printf("输入要添加联系人的电话:");
		scanf("%s", pc->date[ret].telep);
		printf("输入要添加联系人的地址:");
		scanf("%s", pc->date[ret].address);
		printf("修改成功!\n");
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
	// return strcmp(((Contact*)e1)->date->name, ((Student*)e2)->date->name);
}

void SortContact(Contact* pc)
{
	assert(pc);

	qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

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

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(Contact* pc)
{
	assert(pc);
	Student* new = (Student*)malloc(DEFAULT_SIZE * sizeof(Student));
	if (new != NULL)
	{
		pc->date = new;
		pc->sz = 0;
		pc->capacity = DEFAULT_SIZE;
	}
	else
	{
		printf("InitContact:%s\n", strerror(errno));
		return;
	}
}

void Add_Capacity(Contact* pc)
{
	Student* new = (Student*)realloc(pc->date, sizeof(Student) * (pc->capacity + 2));
	if (new != NULL)
	{
		pc->date = new;
		pc->capacity += 2;
		printf("增容成功!\n");
	}
	else
	{
		printf("Add_Capccity():%s\n", strerror(errno));
		return;
	}
}

void AddContact(Contact* pc)
{
	assert(pc);

	if (pc->capacity == pc->sz)
	{
		Add_Capacity(pc);
	}

	printf("输入要添加联系人的姓名:");
	scanf("%s", pc->date[pc->sz].name);
	printf("输入要添加联系人的性别:");
	scanf("%s", pc->date[pc->sz].sex);
	printf("输入要添加联系人的年龄:");
	scanf("%d", &(pc->date[pc->sz].age));
	printf("输入要添加联系人的电话:");
	scanf("%s", pc->date[pc->sz].telep);
	printf("输入要添加联系人的地址:");
	scanf("%s", pc->date[pc->sz].address);

	pc->sz++;
	printf("添加联系人成功\n");
}

void ShowContact(Contact* pc)
{
	assert(pc);
	printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].telep, pc->date[i].address);
	}
}

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

void DeletContact(Contact* pc, char name[])
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("已经没有联系人,不可删除\n");
		return;
	}
	int i = FindContact(pc, name);
	if (i != -1)
	{
		int j = 0;
		for (j = i; j < pc->sz - 1; j++)
		{
			pc->date[j] = pc->date[j + 1];
		}
		pc->sz--;
		printf("删除成功!\n");
	}
	else
	{
		printf("查无此人\n");
	}
}

void SearchContact(Contact* pc, char name[])
{
	assert(pc);
	int ret = FindContact(pc, name);
	if (ret != -1)
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
	}
	else
	{
		printf("没有找到\n");
	}

}


void ModifyContact(Contact* pc, char name[])
{
	assert(pc);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("查无此人\n");
	}
	else
	{
		printf("找到了!\n");
		printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
			pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
		printf("请修改:\n");
		printf("输入要添加联系人的姓名:");
		scanf("%s", pc->date[ret].name);
		printf("输入要添加联系人的性别:");
		scanf("%s", pc->date[ret].sex);
		printf("输入要添加联系人的年龄:");
		scanf("%d", &(pc->date[ret].age));
		printf("输入要添加联系人的电话:");
		scanf("%s", pc->date[ret].telep);
		printf("输入要添加联系人的地址:");
		scanf("%s", pc->date[ret].address);
		printf("修改成功!\n");
	}
}

int cmp_name(const void* e1, const void* e2)
{
	return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
	// return strcmp(((Contact*)e1)->date->name, ((Student*)e2)->date->name);
}

void SortContact(Contact* pc)
{
	assert(pc);

	qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

void DestoryContact(Contact* pc)
{
	assert(pc);
	free(pc->date);
	pc->date = NULL;
	pc->capacity = 0;
	pc->sz = 0;
}
举报

相关推荐

0 条评论