模拟实现通讯录-静态的方法

实现一个通讯录:通讯录可以用力存储1000个人的信息

每个人的信息包括:姓名,性别,年龄,电话,住址,

提供方法:

1.添加联系人信息

2.删除指定联系人信息

3.查找指定联系人信息

4.修改指定联系人信息

5.显示所有联系人信息

6.清空所有联系人

7.以名字排序所有联系人

     【题目分析】:
      1.如何将通讯录中联系人的基本信息(姓名,性别,年龄,电话,住址)在内存中存储起来呢?当然首先想到的就是利用结构体这个类型,它包括的成员类型可以是不同类型的。让我们先来实现这部分功能的代码:
      
typedef struct PerInfo
{
	char name[NAME_MAXNUM];
	int age;
	char sex[SEX_MAXNUM];
	char tele[TELE_MAXNUM];
	char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{
	PerInfo data[MAX];  //存储所有联系人的所有信息
	int size;              //记录联系人的个数
}Contact,*Pcon;

     2.将信息存储起来之后最重要的就是如何去实现它所给出的7个函数功能了,下面且听我一一道来:
      添加联系人信息: 在这里我提供的是静态的方法,就是再定义一个结构体,它包括两个成员,一个数组包括联系人的所有信息,一个整形的变量记录联系人个数,当你添加完成一个联系人的所有信息之后,这个整形的变量就加1知道达到最大存储个数1000就停止添加;
      
void Add(Pcon pcon)      //添加联系人
{
	int i=0;
	printf("请输入你要添加的联系人个数:");
	scanf("%d",&(pcon->size));
	if(pcon->size >= MAX)
	{
		printf("通讯录已满\n");
	}
	else
	{
		printf("请输入你要添加的联系人的所有信息:(姓名 年龄 性别 联系电话 家庭住址)\n");
		for(i=0;i<pcon->size;i++)
		{
		    scanf("%s",pcon->data[i].name);
		    scanf("%d",&(pcon->data[i].age));
		    scanf("%s",pcon->data[i].sex);
		    scanf("%s",pcon->data[i].tele);
		    scanf("%s",pcon->data[i].addr);
		}
	}
}
      那仫结果是不是我们想要的呢?请读者继续向后看: 吐舌头
      
     删除指定联系人信息: 如何删除呢?我们可以根据名字找到该联系人,把要删除的元素删除之后,此时这个位置是空的并没有存储任何信息,那仫是不是就浪费了这个空间呢?试想一下,这个通讯录原本就存储了1000个联系人,删除了一个联系人之后,如果我们想要再添加一个联系人,此时存储信息数组的下标已经指向最大,如果继续向后添加是不是就越界了呢?那是当然的啦!如何去解决这个问题呢?当然我们只要每次删除一个元素后就将该元素之后的元素往前挪,补上这个空位就可以了。这就像我们站队一样,排在队列前面的人走了我们还会站在原地吗?当然不会了,接下来就让我们去实现这个功能的代码吧!
      
int Find_position(Pcon pcon,char *str)
{
	int i=0;
	for(i=0;i<pcon->size;i++)
	{
		if(strcmp(pcon->data[i].name,str) == 0)  //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标
		{
			return i;
		}
	}
	return -1;
}

void Del(Pcon pcon)  //删除指定联系人
{
	int ret=0;
	int i=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要删除的联系人姓名:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		for(i=ret;i<pcon->size;i++)
		{
			pcon->data[i]=pcon->data[i+1];  //删除的元素之后的元素往前挪一个位置
		}
		pcon->size--;
	}
	else
	{
		printf("通讯录里没有此联系人\n");
		return ;
	}
}
      
     查找指定联系人,修改指定联系人:
     这一部分是最容易实现的,它的思路和上面删除指定联系人的思路一致都是调用查找函数,找到就返回对应下标,代码实现如下:
      
void Search(Pcon pcon)  //查找指定联系人
{
	int ret=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要查找的联系人的名字:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		printf("查找成功\n");
	}
	else
	{
		printf("通讯录里无此人\n");
		return ;
	}
}

void Revise(Pcon pcon)  //修改指定联系人
{
	int ret=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要修改的联系人的姓名:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		printf("请输入你修改后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");
		scanf("%s %d %s %s %s",pcon->data[ret].name,&(pcon->data[ret].age),pcon->data[ret].sex,\
			                     pcon->data[ret].tele,pcon->data[ret].addr);
	    printf("修改成功\n");
	}
	else
	{
		printf("通讯录里无此人\n");
		return ;
	}
}

       以名字排序所有联系人:思路是冒泡排序字符串
     
        
void Sort_name(Pcon pcon)  //以名字排序联系人
{
	int flag=0;
	int i=0;
	int j=0;
	for(i=0;i<pcon->size-1;i++)
	{
		flag=0;   //对冒泡排序的优化
		for(j=0;j<pcon->size-1-i;j++)
		{
			if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列
			{
				PerInfo tmp=pcon->data[j];
				pcon->data[j]=pcon->data[j+1];
				pcon->data[j+1]=tmp;
				flag=1;
			}
		}
		if(flag == 0)
			break;
	}
}
        
       在这里附上程序源代码,方便读者理解:
     
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME_MAXNUM 20
#define SEX_MAXNUM 5
#define TELE_MAXNUM 12
#define ADDR_MAXNUM 10
#define MAX 1000
enum OP
{
	EXIT, 
	ADD,
	DEL,
	SEARCH,
	REVISE,
	DISPLAY,
	EMPTY,
	SORT
};
typedef struct PerInfo
{
	char name[NAME_MAXNUM];
	int age;
	char sex[SEX_MAXNUM];
	char tele[TELE_MAXNUM];
	char addr[ADDR_MAXNUM];
}PerInfo;
typedef struct Contact
{
	PerInfo data[MAX];  //存储所有联系人的所有信息
	int size;              //记录联系人的个数
}Contact,*Pcon;

void menu()
{
	printf("***************简易通讯录***************\n");
	printf("****1.添加联系人*******2.删除联系人****\n");
	printf("****3.查找联系人*******4.修改联系人****\n");
	printf("****5.显示联系人*******6.清空联系人****\n");
	printf("****7.以名字排序联系人*0.退出**********\n");
	printf("***************************************\n");
}

void Add(Pcon pcon)      //添加联系人
{
	int i=0;
	printf("请输入你要添加的联系人个数:");
	scanf("%d",&(pcon->size));
	if(pcon->size >= MAX)
	{
		printf("通讯录已满\n");
	}
	else
	{
		printf("请输入你要添加的联系人的所有信息:(姓名 年龄 性别 联系电话 家庭住址)\n");
		for(i=0;i<pcon->size;i++)
		{
		    scanf("%s",pcon->data[i].name);
		    scanf("%d",&(pcon->data[i].age));
		    scanf("%s",pcon->data[i].sex);
		    scanf("%s",pcon->data[i].tele);
		    scanf("%s",pcon->data[i].addr);
		}
	}
}

int Find_position(Pcon pcon,char *str)
{
	int i=0;
	for(i=0;i<pcon->size;i++)
	{
		if(strcmp(pcon->data[i].name,str) == 0)  //将要查找的姓名与通讯录里的联系人匹配,找到就返回下标
		{
			return i;
		}
	}
	return -1;
}

void Del(Pcon pcon)  //删除指定联系人
{
	int ret=0;
	int i=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要删除的联系人姓名:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		for(i=ret;i<pcon->size;i++)
		{
			pcon->data[i]=pcon->data[i+1];  //删除的元素之后的元素往前挪一个位置
		}
		pcon->size--;
	}
	else
	{
		printf("通讯录里没有此联系人\n");
		return ;
	}
}

void Search(Pcon pcon)  //查找指定联系人
{
	int ret=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要查找的联系人的名字:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		printf("查找成功\n");
	}
	else
	{
		printf("通讯录里无此人\n");
		return ;
	}
}

void Revise(Pcon pcon)  //修改指定联系人
{
	int ret=0;
	char str[NAME_MAXNUM]={0};
	printf("请输入你要修改的联系人的姓名:");
	scanf("%s",str);
	ret=Find_position(pcon,str);
	if(ret != -1)
	{
		printf("请输入你修改后的联系人信息:(姓名 年龄 性别 联系电话 住址):\n");
		scanf("%s %d %s %s %s",pcon->data[ret].name,&(pcon->data[ret].age),pcon->data[ret].sex,\
			                     pcon->data[ret].tele,pcon->data[ret].addr);
	    printf("修改成功\n");
	}
	else
	{
		printf("通讯录里无此人\n");
		return ;
	}
}

void Display(Pcon pcon)  //显示联系人信息
{
	int i=0;
	for(i=0;i<pcon->size;i++)
	{
		printf("%s %d %s %s %s\n",pcon->data[i].name,pcon->data[i].age,pcon->data[i].sex,\
			                      pcon->data[i].tele,pcon->data[i].addr);
	}
}

void Empty(Pcon pcon)   //清空联系人
{
	pcon->size=0;
}

void Sort_name(Pcon pcon)  //以名字排序联系人
{
	int flag=0;
	int i=0;
	int j=0;
	for(i=0;i<pcon->size-1;i++)
	{
		flag=0;   //对冒泡排序的优化
		for(j=0;j<pcon->size-1-i;j++)
		{
			if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0) //默认升序排列
			{
				PerInfo tmp=pcon->data[j];
				pcon->data[j]=pcon->data[j+1];
				pcon->data[j+1]=tmp;
				flag=1;
			}
		}
		if(flag == 0)
			break;
	}
}

int main()
{
	Contact pcon;
	int intput=1;
	memset(pcon.data,0,MAX*sizeof(PerInfo));  //把联系人的所有信息置成0
	pcon.size=0;
	while(intput)
	{
		menu();
		printf("请输入一个你要选择的操作:");
		scanf("%d",&intput);
		if(intput >= 0 && intput <= 7)
		{
				switch(intput)
				{
				case ADD:
					Add(&pcon);
					break;
				case DEL:Del(&pcon);
					break;
				case SEARCH:Search(&pcon);
					break;
				case REVISE:Revise(&pcon);
					break;
				case DISPLAY:Display(&pcon);
					break;
				case EMPTY:Empty(&pcon);
					break;
				case SORT:Sort_name(&pcon);
					break;
				case EXIT:
					break;
				}
		}
	}
	system("pause");
	return 0;
}
       在最后用一句话勉励自己:不到最后关头永远不要轻言放弃,因为前方或许就是坦途
          
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值