#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max_name 10
#define Max_sex 10
#define Max_number 11
#define Max_phoList 1000
typedef struct PhoneList
{
char name[Max_name];
char sex[Max_sex];
char number[Max_number];
}PhoneList;
typedef struct Contact
{
PhoneList data[Max_phoList];
int size;
} Contact;
//初始化通讯录
void InitContact(Contact* con);
//打印通讯录
void Show(Contact* con);
//添加信息
void AddContact(Contact* con);
//删除信息
void DelContact(Contact* con);
//查找联系人
void Search(Contact* con);
//修改指定联系人信息
void Modify(Contact* con);
//对联系人按年龄排序
void Sort(Contact* con);
//用qsort排序时需调用的函数
int cmp_by_name(const void* e1, const void*e2);
---------------------------------------------------
void InitContact(Contact* con)
{
con->size = 0;//初始化通讯录内人数为零
memset(con->data, 0, sizeof(con->data));
}
void Show(Contact* con)
{
int i = 0;
if (con->size == 0)
{
printf("-----------------------------------\n");
printf("通讯录为空!\n");
printf("-----------------------------------\n");
}
else
{
printf("\n");
printf("\n");
printf("-----------------------------------\n");
printf("%-10s\t %-10s\t %-11s\n", "姓名", "性别", "电话号码");
for (i = 0; i < con->size; i++)//依次打印联系人信息
{
printf("%-10s\t %-10s\t %-11s\n", (con->data[i]).name, (con->data[i]).sex, (con->data[i]).number);
}
printf("-----------------------------------\n");
printf("\n");
printf("\n");
}
}
void AddContact(Contact* con)
{
if (con->size == Max_phoList)
{
printf("通讯录已满!\n");
}
else
{
//直接在data[con->size]内添加联系人信息
printf("请输入姓名:>");
scanf("%s", (con->data[con->size].name) ); //这里不用&操作符;name/sex/number为字符数组
printf("请输入性别:>");
scanf("%s", (con->data[con->size].sex));
printf("请输入电话号码:>");
scanf("%s", (con->data[con->size].number));
printf("已保存联系人信息!\n");
con->size++;//插入一次,联系人+1
}
}
static int FindName(Contact* con)
{
int i;
char str[10];
printf("请输入要查找的姓名:>");
scanf("%s", str);
for (i = 0; i < con->size; i++)
{
if (strcmp(con->data[i].name, str) == 0)
return i;
}
return -1;
}//查找联系人,修改联系人,删除联系人都要查找该人所在下标
//封装函数FindName能防止代码冗余
void DelContact(Contact* con)
{
//顺序表的删除都是用内存覆盖来实现的
//即把后面数据覆盖数组前面数据
int pos = FindName(con);
if (pos == -1)
{
printf("查无此人!\n");
return;
}
else
{
int i = pos;
for (i = pos; i < con->size - 1; i++)
{
con->data[i] = con->data[i + 1];
}
printf("\n");
printf("删除成功!\n");
printf("\n");
con->size--;
//删除一个 联系人-1
}
}
void Search(Contact* con)
{
int pos = FindName(con);
if (pos == -1)
{
printf("查无此人!\n");
return ;
}
else
{
printf("查找人信息如下:\n");
printf("姓名:%s\n",con->data[pos].name);
printf("性别:%s\n",con->data[pos].sex);
printf("电话号码:%s\n",con->data[pos].number);
}
return ;
}
void Modify(Contact* con)
{
int pos = FindName(con);
//通过FindName找到需修改人的下标,之后直接对数组改下标内的内容修改
printf("请修改姓名:> ");
scanf("%s",con->data[pos].name);
printf("请修改性别:> ");
scanf("%s", con->data[pos].sex);
printf("请修改电话号码:> ");
scanf("%s", con->data[pos].number);
}
int cmp_by_name(const void* e1,const void* e2)
{
int val= strcmp( ((PhoneList*)e1)->name, ((PhoneList*)e2)->name);
return val;
}
-----------------------------------------------------
//简易菜单实现对通讯录的调用
enum Func // 枚举 通讯录的功能
{
Exit,
addContact,
delContact,
serch,
modify,
show,
sort
};
int main()
{
Contact con;
InitContact(&con); //传址--可修改con内部的内容
int input;
//do while循环可实现多次调用通信录功能
//直到选择(0.exit)while内为零,退出程序
do
{
printf("************************************\n");
printf("** 1.addContact * 2.delContact **\n");
printf("** 3.serch * 4.modify **\n");
printf("** 5.show * 6.sort **\n");
printf("*********** 0.Exit ***********\n");
printf("************************************\n");
printf("请输入你的操作:> ");
scanf("%d",&input);
switch (input)
{
case addContact:
AddContact(&con);
break;
case delContact:
DelContact(&con);
break;
case serch:
Search(&con);
break;
case show:
Show(&con);
break;
case modify:
Modify(&con);
case sort:
qsort(con.data, con.size, sizeof(con.data[0]), cmp_by_name);
break;
case Exit:
printf("正在退出\n");
}
}
while (input);
}
c语言实现通讯录
最新推荐文章于 2025-03-03 21:56:56 发布