使用结构体类型实现一个静态通讯录,可以存储1000个人的信息,包括姓名,性别,年龄,电话号码,地址。
主要实现功能有:1、添加联系人信息 2、删除指定联系人信息 3、查找指定联系人 4、修改指定联系人信息 5、显示所有联系人 6、清空所有联系人 7、以名字排序所有联系人
需要提前说的是,一个人的地址,电话号码一般不固定,性别的话,只有男和女,没有特别容易区分多个人中的一个,就好比,说是查找一个指定联系人,我不能通过她是性别找到他,我们只能说是缩小了查找的范围,年龄也是同理,故而,在下面的代码中,删除、查找和修改的选择中,我只写根据通过姓名来锁定指定联系人。
代码分为两部分:头文件(Contact.h)和源文件(Contact.c 和 test.c),完整代码如下:
Contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H___
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum Option1
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT,
EMPTY
};
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_ADDR 30
#define MAX 1000
typedef struct PeoInfo
{
char name[MAX_NAME];
char sex[MAX_SEX];
char addr[MAX_ADDR];
short age;
int tel;
}PeoInfo;
typedef struct Contact
{
struct PeoInfo data[MAX];
unsigned int sz;
}Contact, *pContact;
void InitContact(pContact pc);
void AddContact(pContact pc);
void ShowContact(pContact pc);
void DelContact(pContact pc);
void SearchContact(pContact pc);
void ModifyContact(pContact pc);
void SortContact(pContact pc);
void EmptyContact(pContact pc);
#endif //__CONTACT_H__
Contact.c
#include "Contact.h"
void InitContact(pContact pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(pContact pc)
{
//判满
if (pc->sz == MAX)
{
printf("通讯录已满\n");
return;
}
//不满就输入信息内容
printf("请输入名字:");
scanf_s("%s", (pc->data[pc->sz].name),MAX_NAME);
printf("请输入年龄:");
scanf_s("%hd", &(pc->data[pc->sz].age));
printf("请输入性别:");
scanf_s("%s", pc->data[pc->sz].sex,MAX_SEX);
printf("请输入地址:");
scanf_s("%s", pc->data[pc->sz].addr,MAX_ADDR);
printf("请输入电话号码:");
scanf_s("%d", &(pc->data[pc->sz].tel));
pc->sz++;
printf("添加成功\n");
}
void ShowContact(pContact pc)
{
unsigned int i = 0;
printf("%-10s\t%-5s\t%-5s\t%-10s\t%-5s\n", "name", "age", "sex", "addr", "tel");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-5d\t%-5s\t%-10s\t%-5d\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].tel);
}
}
static void DelNameEntry(pContact* ppc)
{
char name1[MAX_NAME] = { 0 };
unsigned int i = 0;
scanf_s("%s", name1, MAX_NAME);
//遍历查找
for (i = 0; i < (*ppc)->sz; i++)
{
if (strcmp((*ppc)->data[i].name, name1) == 0)
{
strcpy_s((*ppc)->data[i].addr, MAX_ADDR, (*ppc)->data[i + 1].addr);
strcpy_s((*ppc)->data[i].name, MAX_NAME, (*ppc)->data[i + 1].name);
strcpy_s((*ppc)->data[i].sex, MAX_SEX, (*ppc)->data[i + 1].sex);
(*ppc)->data[i].age = (*ppc)->data[i + 1].age;
(*ppc)->data[i].tel = (*ppc)->data[i + 1].tel;
}
}
if (i == (*ppc)->sz + 1)
{
printf("要删除的联系人不存在\n");
}
else
{
(*ppc)->sz--;
}
}
void DelContact(pContact pc)
{
char name[MAX_NAME] = { 0 };
int input = 0;
if (pc->sz == 0)
{
printf("通讯录没有可以删除的联系人\n");
return;
}
DelNameEntry(&pc);
}
static unsigned int SearchNameEntry(pContact* ppc)
{
char name1[MAX_NAME] = { 0 };
unsigned int i = 0;
scanf_s("%s", name1, MAX_NAME);
if ((*ppc)->sz == 0)
{
printf("通讯录无可查找的联系人\n");
return MAX;
}
for (i = 0; i < (*ppc)->sz; i++)
{
if (strcmp((*ppc)->data[i].name, name1) == 0)
{
return i;
}
}
return MAX;
}
static void PrintCon(pContact pc, unsigned int pos)
{
if (pos < 0 || pos >= pc->sz)
{
printf("位置错误\n");
}
printf("%-10s\t%-5s\t%-5s\t%-10s\t%-5s\n", "name", "age", "sex", "addr", "id");
printf("%-10s\t%-5d\t%-5s\t%-10s\t%-5d\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].addr,
pc->data[pos].tel);
}
void SearchContact(pContact pc)
{
int input = 0;
int pos = 0;
if (pc->sz == 0)
{
printf("通讯录无可查找的联系人\n");
return;
}
pos = SearchNameEntry(&pc);
if (pos != MAX)
{
PrintCon(pc, pos);
}
else
{
printf("未找到\n");
}
}
static void ModifyContent(pContact* ppc, unsigned int pos)
{
printf("请输入修改后的名字:");
scanf_s("%s", ((*ppc)->data[pos].name), MAX_NAME);
printf("请输入修改后的年龄:");
scanf_s("%hd", &((*ppc)->data[pos].age));
printf("请输入修改后的性别:");
scanf_s("%s", (*ppc)->data[pos].sex, MAX_SEX);
printf("请输入修改后的地址:");
scanf_s("%s", (*ppc)->data[pos].addr, MAX_ADDR);
printf("请输入修改后的电话号码:");
scanf_s("%d", &((*ppc)->data[pos].tel));
}
void ModifyContact(pContact pc)
{
int input = 0;
unsigned int pos = 0;
if (pc->sz == 0)
{
printf("通讯录无可修改的联系人\n");
return;
}
pos = SearchNameEntry(&pc);
if (pos != MAX)
{
ModifyContent(&pc, pos);
PrintCon(pc, pos);
}
}
void SortContact(pContact pc)
{
pContact tmp = NULL;
unsigned int i = 0;
unsigned int j = 0;
if (0 == pc->sz)
{
printf("通讯录为空\n");
return;
}
for (i = 0; i < pc->sz - 1; i++)
{
for (j = 0; j < pc->sz - i - 1; j++)
{
if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
{
PeoInfo peo = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = peo;
}
}
}
}
void EmptyContact(pContact pc)
{
InitContact(pc);
}
test.c
#include "Contact.h"
void menu()
{
printf("**************************************\n");
printf("*** 1、Add 2、Del ***\n");
printf("*** 3、Search 4、Modify ***\n");
printf("*** 5、Show 6、Sort ***\n");
printf("*** 7、Empty 0、Exit ***\n");
printf("**************************************\n");
}
int main()
{
int input = 0;
Contact my_con;
InitContact(&my_con);
do
{
menu();
printf("请选择:>");
scanf_s("%d", &input);
switch(input)
{
case ADD:
AddContact(&my_con);
break;
case DEL:
DelContact(&my_con);
break;
case SEARCH:
SearchContact(&my_con);
break;
case MODIFY:
ModifyContact(&my_con);
break;
case SHOW:
ShowContact(&my_con);
break;
case SORT:
SortContact(&my_con);
break;
case EMPTY:
EmptyContact(&my_con);
break;
case EXIT:
printf("退出\n");
break;
default:
printf("输入不合法,请重新输入\n");
break;
}
} while (input);
return 0;
}