用结构体实现一个电话本

来源:互联网 发布:淘宝上下架时间设置 编辑:程序博客网 时间:2024/05/20 11:46

    结构体是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;    }    }    }        }

    以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1718562

0 0