结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?
一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等)。我们先来定义一个结构体。
typedef struct Pdhb-info
{
char name[5];
char sex[3];
int age;
char tele[12];
char addr[30];
}Pdhb-info;
二.需要存储1000个人的信息,那么意思就是定义一个结构体,成员为Pdhb-info类型的数组,大小是1000。
typedef struct Dhb
{
Pdhb-info pinfo[MAX]; //定义一个Pdhb-info类型的数组,大小1000,数组名为pinfo
int count; //将作为数组下标来访问数组元素
}Dhb,*pDhb; //定义一个这个结构体的指针
三.主函数如何实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include"contact.h" //添加自己写的头文件
int main()
{
Dhb dhb; //创建数组的那个结构体的对象
int input = 1;
init_dhb(&dhb);
while (input)
{
menu(); //打印一个开始菜单
scanf("%d", &input);//获取用户输入的数字
switch (input) //选择执行的程序
{
case ADD:
add_dhb(&dhb);
break;
case DEL:
del_dhb(&dhb);
break;
case SEARCH:
search_dhb(&dhb);
break;
case MODIFY:
modify_dhb(&dhb);
break;
case SHOW:
show_dhb(&dhb);
break;
case CLEAR:
clear_dhb(&dhb);
break;
case SORT:
sort_dhb(&dhb);
break;
case EXIT:
exit(EXIT_SUCCESS);
break;
}
}
return 0;
}
四.头文件的内容
#ifndef __CONTACT_H__
#define __CONTACT_H__ 定义头文件
#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 13
#define MAX_ADDR 20
#define MAX 1000
enum OP 枚举类型
{
EXIT, //0
ADD, //1
DEL, //2
SEARCH, //3
MODIFY, //4
SHOW, //5
CLEAR, //6
SORT //7
};
typedef struct Peo_Info
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}Peo_Info;
typedef struct Dhb
{
Peo_Info pinfo[MAX];
int count;
}Dhb,*pDhb;
void menu(); //函数的声名
void init_dhb(pDhb pdhb);
void add_dhb(pDhb pdhb);
void del_dhb(pDhb pdhb);
void search_dhb(pDhb pdhb);
void modify_dhb(pDhb pdhb);
void show_dhb(pDhb pdhb);
void clear_dhb(pDhb pdhb);
void sort_dhb(pDhb pdhb);
#endif //__CONTACT_H__
五.函数的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"contact.h"
void menu() //菜单函数的实现
{
printf("***************************************\n");
printf("**** 1.add ********** 2.del ******\n");
printf("**** 3.search ********** 4.modify*****\n");
printf("****5.show ********** 6.clear*****\n");
printf("****7.sort ********** 0.exit******\n");
printf("***************************************\n");
}
static int find_entry(pDhb pdhb, const char*name) //查找下标的函数实现
{
int i = 0;
for (i = 0; i < pdhb->count; i++)
{
if (0 == strcmp(name, pdhb->pinfo[i].name))
{
return i;
}
}
return -1;
}
void init_dhb(pDhb pdhb) //初始化
{
pdhb->count = 0;
}
void add_dhb(pDhb pdhb) //添加函数的实现
{
if (pdhb->count >= MAX) //判断人数是否大于1000
{
printf("电话本已经满了\n");
return;
}
printf("请输入信息\n");
printf("名字:->"); //向数组元素中赋值
scanf("%s", pdhb->pinfo[pdhb->count].name);
printf("性别:->");
scanf("%s", pdhb->pinfo[pdhb->count].sex);
printf("年龄:->");
scanf("%d", &pdhb->pinfo[pdhb->count].age);
printf("电话:->");
scanf("%s", pdhb->pinfo[pdhb->count].tele);
printf("住址:->");
scanf("%s", pdhb->pinfo[pdhb->count].addr);
pdhb->count++;
printf("添加成功\n");
}
void del_dhb(pDhb pdhb) //删除函数的实现
{
char name[MAX_NAME];
int ret = 0;
printf("输入要删除的名字\n");
scanf("%s", name);
ret = find_entry(pdhb, name); //找到对应的下标,这个程序的bug在于重名的只会删除下标靠前的名字
if (ret == -1)
{
printf("名字不存在\n");
return;
}
else //用被找到的下标的后面元素直接覆盖掉前面元素的内容
{
int j = 0;
for (j = ret; j < pdhb->count-1; j++)
{
pdhb->pinfo[j] = pdhb->pinfo[j + 1];
}
pdhb->count--;
printf("删除成功\n");
}
}
void search_dhb(pDhb pdhb) //查找函数的实现
{
char name[MAX_NAME];
int ret = 0;
printf("输入寻找的名字\n");
scanf("%s", name);
ret = find_entry(pdhb, name); //同样先找到下标
if (ret == -1)
{
printf("名字不存在\n");
return;
}
else 将找到下标所对应的元素输出
{
printf("%10s\t%5s\t%4s\t%10s\t%10s\n", "name", "sex", "age", "tele", "addr");
printf("%10s\t%5s\t%3d\t%10s\t%10s\n",
pdhb->pinfo[ret].name,
pdhb->pinfo[ret].sex,
pdhb->pinfo[ret].age,
pdhb->pinfo[ret].tele,
pdhb->pinfo[ret].addr);
}
}
void modify_dhb(pDhb pdhb) //改个人信息
{
char name[MAX_NAME];
int ret = 0;
printf("输入要修改的名字\n");
scanf("%s", name);
ret = find_entry(pdhb, name); //首先找到下标
if (ret == -1)
{
printf("名字不存在\n");
return;
}
else //让重新赋值就好了
{
printf("名字:->");
scanf("%s", pdhb->pinfo[ret].name);
printf("性别:->");
scanf("%s", pdhb->pinfo[ret].sex);
printf("年龄:->");
scanf("%d", &pdhb->pinfo[ret].age);
printf("电话:->");
scanf("%s", pdhb->pinfo[ret].tele);
printf("住址:->");
scanf("%s", pdhb->pinfo[ret].addr);
printf("修改成功");
}
}
void show_dhb(pDhb pdhb) //展示存储的信息
{
int i = 0;
printf("%10s\t%5s\t%4s\t%10s\t%10s\n", "name", "sex", "age", "tele", "addr");
for (i = 0; i < pdhb->count; i++)
{
printf("%10s\t%5s\t%3d\t%10s\t%10s\n",
pdhb->pinfo[i].name,
pdhb->pinfo[i].sex,
pdhb->pinfo[i].age,
pdhb->pinfo[i].tele,
pdhb->pinfo[i].addr);
}
}
void clear_dhb(pDhb pdhb) //清除电话本 ,只需要将conunt设置为0;
{
pdhb->count = 0;
}
void sort_dhb(pDhb pdhb) //冒泡排序,排序名字
{
int i = 0;
int j = 0;
for (i = 0; i < pdhb->count; i++)
{
for (j = 0; j < pdhb->count - 1 - i; j++)
{
if (strcmp(pdhb->pinfo[j].name, pdhb->pinfo[j + 1].name) >0 )
{
Peo_Info tmp = pdhb->pinfo[j];
pdhb->pinfo[j] = pdhb->pinfo[j+1];
pdhb->pinfo[j + 1] = tmp;
}
}
}
}
以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。
转载于:https://blog.51cto.com/10799170/1718562