通讯录

c语言的经典题目 通讯录的实现

要求

通讯录可以用来存储个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:

1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

上代码 代码中包含注释 读者可以通过注释理解学习
1.头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//结构体的声明
typedef struct PeoInfo //存放用户数据的结构体
{
	char name[20];
	char sex[10];
	int age;
	char tele[20];
	char address[20];
	/*char *name;
	char *sex;
	int age;
	char *tel;
	char *address;*/
}PeoInfo;
//常用的一种定义方法  PenInfo 相当于stuct PenInfo

typedef struct Contact //存放创立的结构体的结构体 
{
	PeoInfo* sizeIt;//静态建立结构体数组
	int culCount;//当前个数
	int capacity;//保存最大容量  
}Contact, *pContact;
//第一个是 起了一个别名  第二个是 直接定义了一个指针 指向结构体
//对调用函数的声明
//pContact pc  是自己创立的结构体的类型
void initContact(pContact pc);//初始化
void addContact(pContact pc);//增加联系人
void deletContact(pContact pc);//删除联系人
int findContact(pContact pc,char* name);//查找联系人是否存在
void searchContact(pContact pc);//查找联系人信息
void movContact(pContact pc);//修改联系人信息
void showAllContact(pContact pc);//显示所有联系人
void sortContact(pContact pc);//按照名字进行排序
void resetContact(pContact pc);//销毁所有联系人
void dilataionContact(pContact pc);//动态扩容

2.函数实现 将函数实现存放在另一个文件当中 便于修改与理解

#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"
void initContact(pContact pc)//初始化
{
	pc->capacity = 1;
	pc->sizeIt=(PeoInfo*)malloc(pc->capacity*sizeof(PeoInfo));
	pc->culCount = 0;//count为当前个数
}

void addContact(pContact pc)//增加联系人
{
	if (pc->culCount == pc->capacity)
	{
		printf("存不下来啦 已经存满了\n");
		printf("。。。。。。。。。。\n");
		printf("扩容成功\n");
		dilataionContact(pc);
	}
	printf("name\n");
	scanf("%s", pc->sizeIt[pc->culCount].name);
	printf("sex\n");
	scanf("%s", pc->sizeIt[pc->culCount].sex);
	printf("age\n");
	scanf("%d", &(pc->sizeIt[pc->culCount].age));
	printf("tele\n");
	scanf("%s", pc->sizeIt[pc->culCount].tele);
	printf("address\n");
	scanf("%s", pc->sizeIt[pc->culCount].address);
	(pc->culCount)++;
}
void deletContact(pContact pc)//删除联系人
{
	printf("输入姓名\n");
	char name[20];                                     //此处的初始化听该如何初始化
	scanf("%s", name);
	int ret = findContact(pc, name);
	if (ret == -1)
	{
		printf("不存在\n");
	}
	else
	{
		for (int i = ret; i < pc->culCount; i++)                  
		{
			pc->sizeIt[i] = pc->sizeIt[i + 1];                //此处是否越界

		}
		pc->culCount--;
		printf("删除成功");
	}
}
int findContact(pContact pc, char* name)//查找联系人是否存在
{
	for (int i=0;i<pc->culCount;i++)
	{
		if (strcmp(pc->sizeIt[i].name,name)==0)
		{
			printf("这是%d个元素\n", i);
			return i;//存在直接返回下标
		}
	}
	return -1;
}
void movContact(pContact pc)//修改联系人信息
{
	printf("输入姓名\n");
	char name[20];
	scanf("%s", name);
	int ret=findContact(pc, name);
	if (ret==-1)
	{
		printf("不存在哦\n");
	}
	else
	{
		printf("请输入修改内容\n");
		printf("name\n");
		scanf("%s", pc->sizeIt[pc->culCount].name);
		printf("sex\n");
		scanf("%s", pc->sizeIt[pc->culCount].sex);
		printf("age\n");
		scanf("%d", &(pc->sizeIt[pc->culCount].age));
		printf("tele\n");
		scanf("%s", pc->sizeIt[pc->culCount].tele);
		printf("address\n");
		scanf("%s", pc->sizeIt[pc->culCount].address);
		printf("修改成功\n");
	}
}
void showAllContact(pContact pc)//显示所有联系人
{

	for (int i=0;i<pc->culCount;i++)
	{
		printf("%s\t",pc->sizeIt[i].name);
		printf("%s\t", pc->sizeIt[i].sex);
		printf("%d\t", pc->sizeIt[i].age);
		printf("%s\t", pc->sizeIt[i].tele);
		printf("%s\t", pc->sizeIt[i].address);
		printf("\n");
	}
	printf("输出完毕\n");
}
void sortContact(pContact pc)//按照名字进行排序
{//由大到小
	for (int i=0;i<pc->culCount;i++)
	{
		for (int j=i;j<pc->culCount-1;j++)
		{
			if (strcmp(pc->sizeIt[j].name,pc->sizeIt[j+1].name)==-1)
			{
				//交换
				PeoInfo tme = pc->sizeIt[j];
				pc->sizeIt[j] = pc->sizeIt[j + 1];
				pc->sizeIt[j + 1] = tme;
			}
		}
	}
	printf("排序成功\n");
}
void resetContact(pContact pc)//销毁所有联系人
{
	pc->culCount = 0;         //静态销毁
}
void searchContact(pContact pc)
{
	printf("请输入姓名\n");
	char name[20];
	scanf("%s", name);
	int ret=findContact(pc, name);
	if (ret==-1)
	{
		printf("no one\n");
	}
	else
	{
		printf("%s\n",pc->sizeIt->name);
		printf("%s\n", pc->sizeIt->sex);
		printf("%d\n", pc->sizeIt->age);
		printf("%s\n", pc->sizeIt->tele);
		printf("%s\n", pc->sizeIt->address);
	}
}
void dilataionContact(pContact pc)
{
	if (pc->culCount==pc->capacity)
	{
		pc->sizeIt = (PeoInfo*)realloc(pc->sizeIt, 2 * pc->capacity);
		pc->capacity = 2 * pc->capacity;
		printf("当前容量为%d\n",pc->capacity);
	}
}

3.主函数
主函数中对于通讯录的增加 删除 等函数的调用有两种方式
swich case 语句
函数指针的调用
在这里我采用了第二种方式 也是我更加倾向的一种方式
第一种方式以注释形式存放在了代码中

#define _CRT_SECURE_NO_WARNINGS 1
#include"contacts.h"
enum menuIt
{
	ADD = 0,
	DELET,
	SEARCH,
	MOV,
	SHOW,
	SORT,
	RESET,
	EXIT,
};
void menu()
{
	printf("6666666666666666请输入操作6666666666666666666666\n");
	printf("666666666666666666666666666666666666666666666666\n");
	printf("0 ADD,1 DELET,2 FIND,3 MOV,4 SHOW,5 SORT,6 RESET,7 EXIT\n");
	printf("666666666666666666666666666666666666666666666666\n");
	printf("请输入您的操作6666666666666666666666666666666666\n");
}//菜单输出



typedef void(*functionS)(pContact);//此处声明一个函数指针类型

typedef struct simpleit            //定义了一个结构体类型  成员含有函数指针类型
{
	int a;                         
	functionS b;                   //函数指针
}simpleit;
simpleit fun[10];                  //结构体数组存放指针函数
int main()                      
{
	fun[0].a = ADD;
	fun[1].a = DELET;
	fun[2].a = SEARCH;
	fun[3].a = MOV;
	fun[4].a = SHOW;
	fun[5].a = SORT;
	fun[6].a = RESET;

	fun[0].b = addContact;
	fun[1].b = deletContact;
	fun[2].b = searchContact;
	fun[3].b = movContact;
	fun[4].b = showAllContact;
	fun[5].b = sortContact;
	fun[6].b = resetContact;

	Contact allIt;//创建空间
	initContact(&allIt);
	int opNum;//操作数定义
	while (1)
	{
		menu();
		scanf("%d", &opNum);
		for (int i=0;i<6;i++)
		{
			if (opNum==i)
			{
				fun[opNum].b(&allIt);
			}
			if(opNum==7)
			{
				return 0;
			}
		}
		/*switch (opNum)
		{
		case ADD:addContact(&allIt);
			break;
		case DELET:deletContact(&allIt);
			break;
		case SEARCH:
			searchContact(&allIt);
			break;
		case MOV:movContact(&allIt);
			break;
		case SHOW:showAllContact(&allIt);
			break;
		case SORT:sortContact(&allIt);
			break;
		case RESET:resetContact(&allIt);
			break;
		case EXIT: return 0;
			break;
		default:printf("输入有误\n");
			break;
		}*/
	}

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值