题目要求:
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
typedef struct book_t
{
char name[10];
char sex[4];
int age;
char tel[20];
char address[50];
}book;
typedef struct node_t
{
book data[1000];
int count;
}node;
void init(node *pnode);//初始化通讯录
void add(node *pnode);//添加联系人信息
void delete(node *pnode);//删除指定联系人信息
void search(node *pnode);//查找指定联系人信息
void change(node *pnode);//修改指定联系人信息
void show(node *pnode);//显示所有联系人信息
void clear(node *pnode);//清空所有联系人
void sort(node *pnode);//以名字排序所有联系人
static int findName(node *pnode, char name[]);// 查找指定条目下标
void main()
{
int choice = 1;
node n;
init(&n);
while (choice)
{
printf("***********通讯录***********\n");
printf("【1】add 【2】delete\n");
printf("【3】search 【4】change\n");
printf("【5】show 【6】clear\n");
printf("【7】sort 【0】exit \n");
printf("****************************\n");
printf("功能选择>> ");
scanf("%d", &choice);
switch (choice)
{
case 1:
add(&n); break;
case 2:
delete(&n); break;
case 3:
search(&n); break;
case 4:
change(&n); break;
case 5:
show(&n); break;
case 6:
clear(&n); break;
case 7:
sort(&n); break;
case 0:
system(exit); break;
default:
printf("输入有误,请重新输入!");
}
}
return 0;
}
void init(node *pnode)//初始化通讯录
{
assert(pnode != NULL);
pnode->count = 0;
memset(pnode->data, 0, sizeof(pnode->data));
}
void add(node *pnode)//添加联系人信息
{
assert(pnode != NULL);
printf("姓名:");
scanf("%s", pnode->data[pnode->count].name);
printf("性别:");
scanf("%s", pnode->data[pnode->count].sex);
printf("年龄:");
scanf("%d", &pnode->data[pnode->count].age);
printf("电话:");
scanf("%s", pnode->data[pnode->count].tel);
printf("住址:");
scanf("%s", pnode->data[pnode->count].address);
pnode->count++;
printf("联系人成功添加:\n", pnode->count);
}
static int findName(node *pnode, char name[])// 查找指定条目下标
{
assert(pnode != NULL);
int i = 0;
for (i = 0; i < pnode->count; i++)
{
if (strcmp(pnode->data[i].name, name) == 0)
{
return i;
}
}
return -1;//没找到
}
void delete(node *pnode)//删除指定联系人信息
{
assert(pnode != NULL);
node *p = pnode;
char name[10];
if (p->count == 0)
{
printf("通讯录为空!");
return 0;
}
printf("请输入删除对象:");
scanf("%s", name);
int tmp=findName(p, name);
if (tmp == -1)
{
printf("删除目标不存在!\n");
return 0;
}
for (int i = tmp; i < p->count; i++)
{
p->data[i] = p->data[i + 1];
}
printf("删除成功!\n");
pnode->count--;
}
void search(node *pnode)//查找指定联系人信息
{
assert(pnode != NULL);
node *p = pnode;
if (p->count == 0)
{
printf("通讯录为空!");
return 0;
}
char name[10];
int i = 0;
printf("查找对象:");
scanf("%s", name);
int tmp=findName(p,name);
if (tmp != -1)
{
printf("姓名:%s\n", p->data[tmp].name);
printf("性别:%s\n", p->data[tmp].sex);
printf("年龄:%d\n", p->data[tmp].age);
printf("电话:%s\n", p->data[tmp].tel);
printf("住址:%s\n", p->data[tmp].address);
}
if (tmp==-1)
{
printf("联系人不存在,查找失败!\n");
return 0;
}
}
void change(node *pnode)//修改指定联系人信息
{
assert(pnode != NULL);
node *p = pnode;
int i = 0;
char name[10] = { 0 };
if (p->count == 0)
{
printf("通讯录为空!\n");
return 0;
}
printf("请输入要修改联系人的姓名:>");
scanf("%s", name);
int tmp= findName(p, name);
if (tmp != -1)
{
printf("修改内容:1-名字,2-性别,3-年龄,4-电话,5-住址");
int c;
scanf("%d", &c);
switch (c)
{
case 1:
printf("请输入新的姓名:");
scanf("%s", p->data[tmp].name);
break;
case 2:
printf("请输入新的性别:");
scanf("%s", &p->data[tmp].sex);
break;
case 3:
printf("请输入新的年龄:");
scanf("%d", &p->data[tmp].age);
break;
case 4:
printf("请输入新的电话:");
scanf("%s", p->data[tmp].tel);
break;
case 5:
printf("请输入新的地址:");
scanf("%s", p->data[tmp].address);
break;
default:
printf("输入有误,修改失败\n");
}
printf("修改成功\n");
}
if (tmp == -1)
{
printf("联系人不存在,查找失败!\n");
return 0;
}
}
void show(node *pnode)//显示所有联系人信息
{
assert(pnode != NULL);
node *p = pnode;
int i = 0;
for (i = 0; i < p->count; i++)
{
printf("联系人%d\n", i);
printf("姓名:%s\n", p->data[i].name);
printf("性别:%s\n", p->data[i].sex);
printf("年龄:%d\n", p->data[i].age);
printf("电话:%s\n", p->data[i].tel);
printf("住址:%s\n", p->data[i].address);
printf("\n");
}
}
void clear(node *pnode)//清空所有联系人
{
init(pnode);
}
void sort(node *pnode)//以名字排序所有联系人
{
int i, j;
node *p = pnode;
book tmp;
for (i = 0; i < p->count - 1; i++)
{
for (j = 0; j < p->count - 1 - i; j++)
{
if (strcmp(p->data[j].name, p->data[j + 1].name) < 0)
{
tmp = p->data[j];
p->data[j] = p->data[j + 1];
p->data[j + 1] = tmp;
}
}
}
}