void print()
{
printf("****************************************\n");
printf("*****1.增加联系人 2.删除联系人*****\n");
printf("*****3.查找联系人 4.信息变更 *****\n");
printf("*****5.显示信息 6.清空通讯录*****\n");
printf("*****7.排序 0.退出*****\n");
printf("****************************************\n");
}
void add(contact* con)
{
assert(con);
if (con->count > 1000)
{
printf("通讯录已满!\n");
return;
}
printf("请输入联系人姓名:>\n");
scanf("%s", con->data[con->count].name);
printf("请输入联系人性别:>\n");
scanf("%s", con->data[con->count].sex);
printf("请输入联系人年龄:>\n");
scanf("%d", &(con->data[con->count].age));
printf("请输入联系人电话:>\n");
scanf("%s", con->data[con->count].tele);
printf("请输入联系人地址:>\n");
scanf("%s", con->data[con->count].addr);
con->count++;
}
这里增加联系人就是输入联系人的信息,同时让结构体的计数次数+1.
void del(contact* con)
{
char name[20] = { 0 };
printf("请输入要删除的联系人名字:>\n");
scanf("%s", name);
int s = search(con,name);
int i = 0;
for (i = s; i < con->count - 1; i++)
{
con->data[i] = con->data[i + 1];
}
con->count--;
printf("删除成功!\n");
}
删除联系人很简单,我这里是通过查找联系人的方法来删除联系人,如果你们自己写,可以通过电话号码或者其他别的方法来
int search(contact* con,char name[])
{
assert(con);
int i = 0;
for (i = 0; i < con->count; i++)
{
if ((strcmp(name, con->data[i].name))==0)
{
return i;
}
}
return -1;
}
查找联系人这个函数很简单,就是输入名字,然后让输入的名字和已有的联系人的名字相比较即可
//菜单选项
void menu1()
{
printf("*************************************\n");
printf("*********1.姓名 2.性别*********\n");
printf("*********3.年龄 4.电话号码*****\n");
printf("*********5.地址 0.不做修改*****\n");
printf("*************************************\n");
}
//修改联系人信息
void modify(contact* con)
{
char name[max_name] = { 0 };
int choice = 0;
printf("请输入要修改的联系人姓名:>\n");
scanf("%s", name);
int s = search(con, name);
if (s != -1)
{
do
{
printf("请根据您的需要修改联系人信息!\n");
menu1();
printf("请输入您要修改的联系人信息的选项:>\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请修改联系人姓名:>\n");
scanf("%s", con->data[s].name);
break;
case 2:
printf("请修改联系人性别:>\n");
scanf("%s", con->data[s].sex);
break;
case 3:
printf("请修改联系人年龄:>\n");
scanf("%d", &(con->data[s].age));
break;
case 4:
printf("请修改联系人电话号码:>\n");
scanf("%s", con->data[s].tele);
break;
case 5:
printf("请修改联系人地址:>\n");
scanf("%s", con->data[s].addr);
break;
default:
printf("没有该选项,请重新选择:>\n");
break;
}
} while (choice);
}
else
{
printf("你要修改的联系人信息不存在!\n");
return ;
}
}
也是通过调用查找函数,然后根据自己的需要修改联系人信息
void show(contact* con)
{
int i = 0;
printf("%-10s%-5s%-6s%-15s%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址");
for (i = 0; i < con->count; i++)
{
printf("%-10s%-5s%-6d%-15s%-20s\n", con->data[i].name,
con->data[i].sex,
con->data[i].age,
con->data[i].tele,
con->data[i].addr);
}
}
遍历这个结构体中的联系人的数据,然后一一打印
//清空通讯录
void clear(contact* con)
{
con->count = 0;
printf("清除成功!\n");
}
这个函数最简单,就让通讯录的次数变成0,无法读取通讯录信息。
//比较函数
int cmp(void* e1, void* e2)
{
return (strcmp(((info*)e1)->name ,((info*)e2)->name));
}
//交换函数
void Swap(char* e1, char* e2, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
//基于冒泡排序思想的排序函数
void bubble_sort(void* base,
size_t num,
size_t size,
int(*cmp)(void* e1, void* e2))
{
int i = 0;
int j = 0;
for (i = 0; i < num - 1; i++)
{
for (j = 0; j < num - 1 - i; j++)
{
int sz = cmp(((char*)base + j * size), ((char*)base + (j + 1) * size));
if (sz>0)
{
Swap(((char*)base + j * size), ((char*)base + (j + 1) * size), size);
}
}
}
}
//排序通讯录
void sort(contact* con)
{
bubble_sort(con->data,
con->count,
sizeof(info),
cmp);
printf("排序成功!\n");
}
这里我用了冒泡排序的思想排序通讯录,同时我这个排序函数适用于各种类型的排序,如果读者嫌麻烦可以使用库函数的qsort函数进行排序。
enum choe {
EXIT,
ADD,
DELETE,
SEARCH,
MODIFY,
SHOW,
CLEAR,
SORT
};
int main()
{
int input = 0;
contact con;
memset(&con, 0, sizeof(con));
do
{
print();
printf("请选择功能:>\n");
scanf("%d", &input);
switch (input)
{
case ADD:
printf("请输入信息:>\n");
add(&con);
break;
case DELETE:
del(&con);
break;
case SEARCH:
printf("请输入要查找的联系人:>\n");
char name[max_name] = { 0 };
inputname(name);
int x = search(&con, name);
if (x >= 0)
{
printf("查找成功!\n");
}
else
{
printf("查无此人!\n");
}
show1(&con, x);
break;
case MODIFY
:
modify(&con);
break;
case SHOW:
show(&con);
break;
case CLEAR:
clear(&con);
break;
case SORT:
sort(&con);
break;
case EXIT:
printf("退出\n");
break;
}
} while (input);
return 0;
}
这里用了枚举,使得每一个功能都能够做到见名知意,清晰明了。
这里就不做效果展示咯,这个通讯录比较简单,大家可以自行复制,然后运行,编译器是vs2019,感谢各位!