简介:
通过学习完结构体,那我们如何应用呢?这里我们将介绍结构体在通讯录里面的应用,并且可以实现联系人的增加、删除、修改、分类、显示、查找等功能。
目录:
1.创建通讯录
2.初始化通讯录
3.增加联系人
4.显示联系人
5.删除联系人
6.查找联系人
7.修改联系人
8.分类联系人
1.创建通讯录
创建通讯录,联系人的信息例如:姓名、性别、年龄、地址、电话。在一个结构体中都可以被包含,并且在后面一直在使用。
struct peoinfo
{
char name[NAME];
char sex[SEX];
int age;
char add[ADD];
char tele[TELE];
};
2.初始化通讯录
在实现增加、删除联系人时,如何找到增加、删除联系人的信息呢?这时候需要在创建一个结构体,有两个内容,一个是存储联系人的信息的数据,另一个是指向的数据的地址。
struct contact
{
struct peoinfo data[MAX];
int sz;
};
将通讯录初始化进行后面的功能。用memset函数对结构体开辟空间并且初始化
void init_contact(struct contact* con)
{
//void * memset ( void * ptr, int value, size_t num );
memset(con->data,0, 100*sizeof(struct peoinfo));
con->sz = 0;
}
3.增加联系人
这是一个静态通讯录,有一个最大储存空间。首先判断是否还有空间,如果有的话就开始添加联系人,通过结构体找到要输入的信息,每增加一个联系人sz就会增加
//增加联系人
void addcontact(struct contact* con)
{
if (con->sz > 100)
{
printf("通讯录已满\n");
}
else
{
printf("请输入姓名:>");
scanf("%s",con->data[con->sz].name );
printf("请输入性别:>");
scanf("%s", con->data[con->sz].sex );
printf("请输入年龄:>");
scanf("%d", &(con->data[con->sz].age));
printf("请输入地址:>");
scanf("%s", con->data[con->sz].add);
printf("请输入电话:>");
scanf("%s", con->data[con->sz].tele);
}
con->sz++;
printf("成功添加联系人\n");
}
4.显示联系人
增加了联系人,可以在屏幕上显示出来,看是否增加成功。需要一个格式,不然就不知道信息是什么。
//显示联系人
void showcontact(struct contact con)
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < con.sz;i++)
{
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",con.data[i].name, con.data[i].sex, con.data[i].age, con.data[i].add, con.data[i].tele);
}
}
5.删除联系人
首先需要输入要删除联系人的姓名,与在通讯录的联系人进行对比,如果一样就删除。删除之后需要将后面的联系人的地址都往前一个位置,这时sz-1,空间将会增加一个。
int find_name(char* name,struct contact* con)
{
int i = 0;
for (i = 0; i < con->sz;i++)
{
if (strcmp(name, con->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void delcontact(struct contact* con)
{
char name[NAME];
printf("请输入需要删除的联系人姓名:>");
scanf("%s",name );
int ret = find_name(name,con);
if (-1 == ret)
{
printf("找不到要删除人的信息\n");
}
else
{
int i = 0;
for (i = ret; i < con->sz-1; i++)
{
con->data[i] = con->data[i + 1];
}
con->sz--;
printf("成功删除联系人\n");
}
}
6.查找联系人
首先需要输入要查找联系人的姓名,与在通讯录的联系人进行对比,如果一样就将联系人显示出来
int find_name(char* name,struct contact* con)
{
int i = 0;
for (i = 0; i < con->sz;i++)
{
if (strcmp(name, con->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//搜索联系人
void searchcontact(struct contact* con)
{
char name[NAME];
printf("请输入要查找联系人的姓名:>");
scanf("%s",name);
int ret = find_name(name, con);
if (-1 == ret)
{
printf("要查找的联系人不存在\n");
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",
con->data[ret].name,
con->data[ret].sex,
con->data[ret].age,
con->data[ret].tele,
con->data[ret].add
);
}
}
7.修改联系人
首先需要输入要修改联系人的姓名,与在通讯录的联系人进行对比,如果一样就将将这个联系人的信息覆盖
int find_name(char* name,struct contact* con)
{
int i = 0;
for (i = 0; i < con->sz;i++)
{
if (strcmp(name, con->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//修改联系人信息
void modifycontact(struct contact* con)
{
char name[NAME];
printf("请输入要修改联系人的姓名:>");
scanf("%s",name);
int ret = find_name(name, con);
if (-1 == ret)
{
printf("要修改的联系人不存在\n");
}
else
{
printf("请输入姓名:>");
scanf("%s", con->data[ret].name);
printf("请输入性别:>");
scanf("%s", con->data[ret].sex);
printf("请输入年龄:>");
scanf("%d", &(con->data[ret].age));
printf("请输入地址:>");
scanf("%s", con->data[ret].add);
printf("请输入电话:>");
scanf("%s", con->data[ret].tele);
}
}
8.分类联系人
可以通过姓名、年龄等不同的方法对通讯录分类。这里可以用qsort函数,可以实现不同类型的分类。
int cmp_name(const void* e1, const void* e2)
{
return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name);
}
int cmp_age(const void* e1, const void* e2)
{
return ((struct peoinfo*)e1)->age - ((struct peoinfo*)e2)->age;
}
//通讯录分类
void sortcontact(struct contact* con)
{
//void qsort(void* base, size_t num, size_t size,
//int (*compar)(const void*, const void*));
printf("************************1.名字分类******************\n");
printf("************************2.年龄分类******************\n");
int i = 0;
printf("请选择>:");
scanf("%d", &i);
switch (i)
{
case 1:qsort(con->data,con->sz,sizeof(struct peoinfo),cmp_name);
break;
case 2:qsort(con->data, con->sz, sizeof(struct peoinfo), cmp_age);
break;
defaule:
printf("选择错误\n");
break;
}
}
完整代码
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("**************************************\n");
printf("***** 1. add 2. del *****\n");
printf("***** 3. search 4. modify *****\n");
printf("***** 5. show 6. sort *****\n");
printf("***** 0. exit *****\n");
printf("**************************************\n");
}
int main()
{
int input = 0;
//创建通讯录
struct contact con;
//初始化通讯录
init_contact(&con);
do
{
menu();
printf("请根据菜单选择:>");
scanf("%d",&input);
switch (input)
{
case 0:
printf("退出通讯录\n");
break;
case 1:
addcontact(&con);
break;
case 2:
delcontact(&con);
break;
case 3:
searchcontact(&con);
break;
case 4:
modifycontact(&con);
break;
case 5:
showcontact(con);
break;
case 6:
sortcontact(&con);
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
return 0;
}
contact.h
#pragma once
#include <stdio.h>
#define MAX 100
#define NAME 20
#define SEX 5
#define ADD 20
#define TELE 20
#include <string.h>
#include <stdlib.h>
struct peoinfo
{
char name[NAME];
char sex[SEX];
int age;
char add[ADD];
char tele[TELE];
};
struct contact
{
struct peoinfo data[MAX];
int sz;
};
//初始化通讯录
void init_contact(struct contact *con);
//增加联系人
void addcontact(struct contact* con);
//删除联系人
void delcontact(struct contact* con);
//显示联系人
void showcontact(struct contact con);
//搜索联系人
void searchcontact(struct contact* con);
//修改联系人信息
void modifycontact(struct contact* con);
//通讯录分类
void sortcontact(struct contact* con);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
//初始化通讯录
void init_contact(struct contact* con)
{
//void * memset ( void * ptr, int value, size_t num );
memset(con->data,0, 100*sizeof(struct peoinfo));
con->sz = 0;
}
//增加联系人
void addcontact(struct contact* con)
{
if (con->sz > 100)
{
printf("通讯录已满\n");
}
else
{
printf("请输入姓名:>");
scanf("%s",con->data[con->sz].name );
printf("请输入性别:>");
scanf("%s", con->data[con->sz].sex );
printf("请输入年龄:>");
scanf("%d", &(con->data[con->sz].age));
printf("请输入地址:>");
scanf("%s", con->data[con->sz].add);
printf("请输入电话:>");
scanf("%s", con->data[con->sz].tele);
}
con->sz++;
printf("成功添加联系人\n");
}
int find_name(char* name, struct contact* con)
{
int i = 0;
for (i = 0; i < con->sz;i++)
{
if (strcmp(name, con->data[i].name) == 0)
{
return i;
}
}
return -1;
}
//删除联系人
void delcontact(struct contact* con)
{
char name[NAME];
printf("请输入需要删除的联系人姓名:>");
scanf("%s", name);
int ret = find_name(name, con);
if (-1 == ret)
{
printf("找不到要删除人的信息\n");
}
else
{
int i = 0;
for (i = ret; i < con->sz - 1; i++)
{
con->data[i] = con->data[i + 1];
}
con->sz--;
printf("成功删除联系人\n");
}
}
//显示联系人
void showcontact(struct contact con)
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
int i = 0;
for (i = 0; i < con.sz;i++)
{
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", con.data[i].name, con.data[i].sex, con.data[i].age, con.data[i].add, con.data[i].tele);
}
}
//搜索联系人
void searchcontact(struct contact* con)
{
char name[NAME];
printf("请输入要查找联系人的姓名:>");
scanf("%s", name);
int ret = find_name(name, con);
if (-1 == ret)
{
printf("要查找的联系人不存在\n");
}
else
{
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n",
con->data[ret].name,
con->data[ret].sex,
con->data[ret].age,
con->data[ret].tele,
con->data[ret].add
);
}
}
//修改联系人信息
void modifycontact(struct contact* con)
{
char name[NAME];
printf("请输入要修改联系人的姓名:>");
scanf("%s", name);
int ret = find_name(name, con);
if (-1 == ret)
{
printf("要修改的联系人不存在\n");
}
else
{
printf("请输入姓名:>");
scanf("%s", con->data[ret].name);
printf("请输入性别:>");
scanf("%s", con->data[ret].sex);
printf("请输入年龄:>");
scanf("%d", &(con->data[ret].age));
printf("请输入地址:>");
scanf("%s", con->data[ret].add);
printf("请输入电话:>");
scanf("%s", con->data[ret].tele);
}
}
int cmp_name(const void* e1, const void* e2)
{
return strcmp(((struct peoinfo*)e1)->name, ((struct peoinfo*)e2)->name);
}
int cmp_age(const void* e1, const void* e2)
{
return ((struct peoinfo*)e1)->age - ((struct peoinfo*)e2)->age;
}
//通讯录分类
void sortcontact(struct contact* con)
{
//void qsort(void* base, size_t num, size_t size,
//int (*compar)(const void*, const void*));
printf("************************1.名字分类******************\n");
printf("************************2.年龄分类******************\n");
int i = 0;
printf("请选择>:");
scanf("%d", &i);
switch (i)
{
case 1:qsort(con->data,con->sz,sizeof(struct peoinfo),cmp_name);
break;
case 2:qsort(con->data, con->sz, sizeof(struct peoinfo), cmp_age);
break;
defaule:
printf("选择错误\n");
break;
}
}