测试环境:vs2013
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
思路:利用结构体数组,定义一个全局变量count用来统计联系人个数,删除时,将要删的那个与末尾的进行交换,然后count–。清空时,将count置零。
//test.c
#include
#include
#include "address.h"
#pragma warning(disable:4996)
//extern int count;
//extern struct adress list[1000];
int main()
{
int num = 0;
do
{
menu();
printf("请选择-->(1-8):");
scanf("%d", &num);
fflush(stdin); //清除
switch (num)
{
case 1:
add_people(list); //添加
break;
case 2:
delet_people(list); //删除
break;
case 3:
find_people(list); //查找
break;
case 4:
alter_people(list); //更改
break;
case 5:
show_people(list);
break;
case 6:
empty_people(list);
break;
case 7:
sort_people(list);
break;
case 8:
break;
default:
printf("选择错误,请重新选择\n");
break;
}
if (num == 8)break;
} while (num);
system("pause");
return 0;
}
//address.h
#ifndef __ADDRESS_H__
#define __ADDRESS_H__
struct adress
{
char name[10];
char sex[1];
char age[2];
char tel[12]; //电话用字符串来存
char adress[50];
}list[1000];
void menu(void);
void add_people(struct adress* list); //添加联系人
int find_people(struct adress* list); //查找联系人
void alter_people(struct adress* list); //更改联系人
void delet_people(struct adress* list); //删除联系人
void show_people(struct adress* list); //显示联系人
void sort_people(struct adress* list); //排序联系人
void empty_people(struct adress* list); //清空联系人
#endif
//address.c
#include
#include
#include
#include "address.h"
#pragma warning(disable:4996)
int count = 0;
//菜单
void menu(void)
{
printf("***********************************************************\n");
printf("****1. 添加联系人信息 2. 删除指定联系人信息******\n");
printf("****3. 查找指定联系人信息 4. 修改指定联系人信息******\n");
printf("****5. 显示所有联系人信息 6. 清空所有联系人 ******\n");
printf("****7. 以名字排序所有联系人 8.退出 ******\n");
printf("***********************************************************\n");
}
//添加联系人
void add_people(struct adress* list)
{
assert(list);
if (1000 == count)
{
printf("人已满!!!\n");
}
else
{
printf("name:");
scanf("%s", (list + count)->name);
printf("sex(1or2):");
scanf("%s", (list + count)->sex);
printf("age:");
scanf("%s", (list + count)->age);
printf("tel:");
scanf("%s", (list + count)->tel);
printf("adress:");
scanf("%s", (list + count)->adress);
count++;
printf("添加完成!\n");
}
}
//查找联系人
int find_people(struct adress* list)
{
assert(list);
if (0 == count)
{
printf("没有联系人\n");
}
else{
int i = 0;
char name[20] = "";
printf("请输入名字:");
scanf("%s", name);
for (i = 0; i < count; i++)
{
if (strcmp(name, (list + i)->name) == 0)
{
printf("name:%s ", (list + i)->name);
printf("sex:%s ", (list + i)->sex);
printf("age:%s ", (list + i)->age);
printf("tel:%s ", (list + i)->tel);
printf("adress:%s ", (list + i)->adress);
putchar('\n');
return i;
}
}
printf("没有此人\n");
}
return -1;
}
//更改联系人
void alter_people(struct adress* list)
{
assert(list);
if (0 == count)
{
printf("没有联系人\n");
}
else{
int ret = find_people(list);
if (-1 != ret)
{
printf("name:");
scanf("%s", (list + ret)->name);
printf("sex(1or2):");
scanf("%s", (list + ret)->sex);
printf("age:");
scanf("%s", (list + ret)->age);
printf("tel:");
scanf("%s", (list + ret)->tel);
printf("adress:");
scanf("%s", (list + ret)->adress);
printf("修改完成\n");
}
else
{
NULL;
}
}
}
//删除联系人
void delet_people(struct adress* list) //删除联系人时,将最后一个联系人和这个调换
{
assert(list);
if (0 == count)
{
printf("没有联系人\n");
}
else
{
int ret = find_people(list);
int tmp = count-1; //需要减1
if (-1 != ret)
{
struct adress t = *(list + ret);
*(list + ret) = *(list + tmp);
*(list + tmp) = t;
printf("已删除\n");
count--;
}
else
{
NULL;
}
}
}
//显示联系人
void show_people(struct adress* list)
{
assert(list);
if (0 == count)
{
printf("没有成员\n");
}
else
{
int i = 0;
for (i = 0; i < count; i++)
{
printf("name:%s ", (list + i)->name);
printf("sex:%s ", (list + i)->sex);
printf("age:%s ", (list + i)->age);
printf("tel:%s ", (list + i)->tel);
printf("adress:%s ", (list + i)->adress);
putchar('\n');
}
}
}
//排序联系人
void sort_people(struct adress* list)
{
assert(list);
if (0 == count)
{
printf("没有联系人,不能排序\n");
}
else
{
int i = 0;
int j = 0;
for (i = 0; i < count - 1; i++)
{
for (j = 0; j1 - i; j++)
{
if (strcmp((list + j)->name, (list + j + 1)->name) > 0) //从小到大排序
{
struct adress t = *(list + j); //交换两个结构体
*(list + j) = *(list + j + 1);
*(list + j + 1) = t;
}
}
}
}
}
//清空联系人
void empty_people(struct adress* list)
{
count = 0;
printf("已清空\n");
}
在调试时碰到bug,sex和age设置为整型时,在排序时会出错,删数据时,也会出错。而设置成数组时,则无问题。