码迷,mamicode.com
首页 > 其他好文 > 详细

用结构体实现一个电话本

时间:2015-12-01 19:42:52      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:电话本   c语言   结构体   count   如何 用结构体实现一个电话本   

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

用结构体实现一个电话本

标签:电话本   c语言   结构体   count   如何 用结构体实现一个电话本   

原文地址:http://10799170.blog.51cto.com/10789170/1718562

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!