#include <stdio.h>
#include <string.h>
#define N 10
#define FIND 0
#define NFIND 1
enum {ID = 1, NAME, TEL};
enum {QUIT, ADD, DISPLAY, DELETE, SELECT, CHANGE, SORT};
struct Data
{ //定义一个结构体
int id;
char name[20];
long tel;
};
int random_id(struct Data *data, int *len)
{ //随机生成一个五位数id,不能和已有的重复
srand(time(NULL));
int temp = 1; //标记id是否合法,0为合法,1为不合法
int i;
int newid = 0;
while(temp)
{
for(i = 0; i < 5; i++)
{
newid = newid*10 + rand()%10;
}
temp = 0; //生成后默认合法
if(newid < 10000) //判断是否为四位数,即首位为0
{
newid = 0;
temp = 1;
}
for(i = 0; i < *len; i++)
{
if(newid == data[i].id) //判断是否与现有id重复
{
newid = 0;
temp = 1;
}
}
}
return newid; //返回新生成的随机id
}
void print_data(struct Data *data)
{ //打印结构体的所有元素
printf("%d\t",data->id);
printf("%s\t",data->name);
printf("%ld\n",data->tel);
}
void swap_data(struct Data *data1, struct Data *data2)
{ //交换两个结构体的所有元素
int swapid ;
char swapname[20] = {0};
long swaptel;
swapid = data1->id;
strcpy(swapname,data1->name);
swaptel = data1->tel;
data1->id = data2->id;
strcpy(data1->name,data2->name);
data1->tel = data2->tel;
data2->id = swapid;
strcpy(data2->name,swapname);
data2->tel = swaptel;
}
void add_data(struct Data *data, int *len)
{ //增加联系人
data[*len].id = random_id(&data[*len],len); //调用随机生成id函数并复制给结构体数组末位的id
printf("系统自动生成id为%d\n",data[*len].id); //输出新id
printf("请输入名字:\n"); //对新联系人进行赋值
scanf("%s",data[*len].name);
printf("请输入手机号码:\n");
scanf("%ld",&(data[*len].tel));
(*len) = (*len)+1; //长度加1
}
void display_data(struct Data *data, int *len)
{ //显示所有联系人
int i;
printf("----------------------------\n");
for(i = 0; i < *len; i++)
{
print_data(&data[i]); //对每个元素调用输出函数
}
printf("----------------------------\n");
}
void delete_data(struct Data *data,int *len)
{ //删除联系人
int i;
int temp = NFIND; //标记要删除的目标是否存在
int delete = 0;
int delid = 0;
char delname[20] = {0};
long deltel = 0;
printf("1.按ID删除\n");
printf("2.按姓名删除\n");
printf("3.按手机号码删除\n");
scanf("%d",&delete);
switch(delete)
{
case ID:
//通过ID删除
printf("输入要删除的ID\n");
scanf("%d",&delid);
for(i = 0; i < *len; i++) //遍历联系人数组
{
if(data[i].id == delid) //匹配到要删除的id
{
int j;
for(j = i; j < *len; j++) //从删除位置开始从后往前覆盖
{
data[j].id = data[j+1].id;
strcpy(data[j].name,data[j+1].name);
data[j].tel = data[j+1].tel;
}
(*len)--; //长度-1
printf("Delete id:%d successfully!\n",delid);
temp = FIND; //找到要删除的值
break;
}
}
if(temp) //判断是否找到要删除的联系人
{
printf("Can not find name:%d\n",delid);
}
break;
case NAME:
printf("输入要删除的姓名\n");
scanf("%s",delname);
for(i = 0; i < *len; i++)
{
if(strcmp(data[i].name,delname) == 0)
{
int j;
for(j = i; j < *len; j++)
{
data[j].id = data[j+1].id;
strcpy(data[j].name,data[j+1].name);
data[j].tel = data[j+1].tel;
}
(*len)--;
printf("Delete name:%s successfully!\n",delname);
temp = FIND;
break;
}
}
if(temp)
{
printf("Can not find name:%s\n",delname);
}
break;
case TEL:
printf("输入要删除的手机号码\n");
scanf("%ld",&deltel);
for(i = 0; i < *len; i++)
{
if(data[i].tel == deltel)
{
int j;
for(j = i; j < *len; j++)
{
data[j].id = data[j+1].id;
strcpy(data[j].name,data[j+1].name);
data[j].tel = data[j+1].tel;
}
(*len)--;
printf("Delete tel:%ld successfully!\n",deltel);
temp = FIND;
break;
}
}
if(temp)
{
printf("Can not find name:%ld\n",deltel);
}
break;
default:
printf("输入的选项有误!\n");
break;
}
}
int select_data(struct Data *data,int *len)
{ //查找联系人
int i;
int temp = NFIND; //标记要查找的目标是否存在
int save = -1;
int select = 0;
int selid = 0;
char selname[20] = {0};
long seltel = 0;
printf("1.按ID查找\n");
printf("2.按姓名查找\n");
printf("3.按手机号码查找\n");
scanf("%d",&select);
switch(select)
{
case ID:
printf("输入要查找的ID\n");
scanf("%d",&selid);
for(i = 0; i < *len; i++)
{
if(data[i].id == selid)
{
printf("----------------------------\n");
print_data(&data[i]);
printf("----------------------------\n");
save = i;
temp = FIND; //找到查找的目标
}
}
if(temp)
{
printf("Can not find name:%d\n",selid);
}
break;
case NAME:
printf("输入要查找的姓名\n");
scanf("%s",selname);
for(i = 0; i < *len; i++)
{
if(strcmp(data[i].name,selname) == 0)
{
printf("----------------------------\n");
print_data(&data[i]);
printf("----------------------------\n");
save = i;
temp = FIND;
}
}
if(temp)
{
printf("Can not find name:%s\n",selname);
}
break;
case TEL:
printf("输入要查找的手机号码\n");
scanf("%ld",&seltel);
for(i = 0; i < *len; i++)
{
if(data[i].tel == seltel)
{
printf("----------------------------\n");
print_data(&data[i]);
printf("----------------------------\n");
save = i;
temp = FIND;
}
}
if(temp) //判断是否找到要查找的联系人
{
printf("Can not find name:%ld\n",seltel);
}
break;
}
return save; //返回找到的联系人在数组中的下标
}
void change_data(struct Data *data,int *len)
{ //修改联系人
int i;
int rec;
int change = 0;
int chid = 0;
char chname[20] = {0};
long chtel = 0;
printf("先对要修改的联系人进行查找\n");
rec = select_data(data,len); //接收查找到的联系人的下标
printf("选择要修改的信息\n");
printf("1.id\n");
printf("2.姓名\n");
printf("3.手机号码\n");
scanf("%d",&change);
switch(change)
{
case ID:
printf("修改后的新id为\n");
scanf("%d",&(data[rec].id));
break;
case NAME:
printf("修改后的新名字为\n");
scanf("%s",data[rec].name);
break;
case TEL:
printf("修改后的新手机号码为\n");
scanf("%ld",&(data[rec].tel));
break;
}
}
void sort_data(struct Data *data,int *len)
{ //排序联系人
int i,j;
int sort;
if(*len == 0)
{
printf("无联系人,无法排序!\n");
return ;
}
printf("请选择排序关键词:\n");
printf("1.id\n");
printf("2.姓名\n");
printf("3.手机号码\n");
scanf("%d",&sort);
switch(sort)
{
case ID:
for(i = 0 ; i < *len; i++)
{
for(j = 0; j < *len-1; j++)
{
if(data[j].id > data[j+1].id)
{
swap_data(&data[j],&data[j+1]);
}
}
}
printf("按id排序完成!\n");
break;
case NAME:
for(i = 0 ; i < *len; i++)
{
for(j = 0; j < *len-1; j++)
{
if(strcmp(data[j].name,data[j+1].name) > 0)
{
swap_data(&data[j],&data[j+1]);
}
}
}
printf("按姓名排序完成!\n");
break;
case TEL:
for(i = 0 ; i < *len; i++)
{
for(j = 0; j < *len-1; j++)
{
if(data[j].tel > data[j+1].tel)
{
swap_data(&data[j],&data[j+1]);
}
}
}
printf("按手机号码排序完成!\n");
break;
}
}
void menu(struct Data *data, int *len)
{ //菜单
int com = 0;
while(1)
{
printf("\t**************\n");
printf("\t*1.增加联系人*\n");
printf("\t*2.显示联系人*\n");
printf("\t*3.删除联系人*\n");
printf("\t*4.查找联系人*\n");
printf("\t*5.修改联系人*\n");
printf("\t*6.排序联系人*\n");
printf("\t*0.退出程序 *\n");
printf("\t**************\n");
scanf("%d",&com);
switch(com)
{
case ADD:
add_data(data,len);
break;
case DISPLAY:
display_data(data,len);
break;
case DELETE:
delete_data(data,len);
break;
case SELECT:
select_data(data,len);
break;
case CHANGE:
change_data(data,len);
break;
case SORT:
sort_data(data,len);
break;
case QUIT:
return ;
default:
printf("请输入正确的选项\n");
break;
}
}
}
int main()
{
struct Data data[N] = {0};
int length = 0;
menu(data,&length);
return 0;
}
用结构体数组实现一个简易通讯录
最新推荐文章于 2023-03-05 16:37:24 发布