用结构体实现一个电话本

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

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

时间: 2024-10-23 08:10:49

用结构体实现一个电话本的相关文章

java模拟而一个电话本操作

哈哈,大家平时都在使用电话本,下面使用java来模拟而一个简单的电话本吧... 首先给出联系人的抽象类 package net.itaem.po; /** * * 电话人的信息 * */ public class User { private String name; private String phoneNumber; private String companyName; private String email; private String address; private Strin

关于结构体的一个特殊用法(总觉得遇到的问题就该记录一下哇)

关于结构体的一个特殊用法 //写法一 struct array { int count; char *buf; } //写法二 struct array { int count; char buf[0]; } 如果一个buf用作一个buffer的话,这时候如果malloc一块内存, 用方法一,buf是指针的话,指向这块申请出的内存的话,这里array结构体和buf指向的buffer就是分开的. 而用方法二的时候,申请出的buffer和结构体buffer是连接在一起的. 这么说有点抽象. 非常感谢

柔性数组(结构体最后一个域为0/1数组)

结构体最后的长度为0或1数组的作用(转载) 2012-05-07 17:07:09 其实很 早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们 的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,

C语言用结构体写一个通讯录

今天写了个通讯录,给大家看一下 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> extern meau();//目录函数就没写出来了,大家可以自己写一下 typedef struct T//定义一个结构体 { char name[10]; char sex[4]; int age; char tetl[13]; char add[20

C语言利用结构体实现一个通讯录

实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名.性别.年龄.电话.住址 提供以下方法: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 以名字排序所有联系人 7. 清空所有联系人 student.h: #ifndef __CRT #define _CRT_SECURE_NO_WARNINGS 1 #endif #ifndef __STUDENT #ifndef __STDIO_H

C语言:结构体,共用体

结构体: 一个变量,存储不同类型的数据项共用体:一个变量,存储不同类型的数据项,相同的内存位置,存储不同的数据类型 #include <stdio.h> #include <string.h> struct Books { char title[50]; char author[20]; }; union Data { char title[50]; char author[20]; }; main() { union Data _u; struct Books _s; print

结构体/联合体 所占用内存

1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 typedef struct Parameter{ 6 int a; 7 long b; 8 double c; 9 int d; 10 }Parameter; 11 12 typedef union Para{ 13 unsigned a; 14 double b; 15 long c; 16 int d; 17 }Para; 18

指向结构体类型的指针强制转换为指向另外一种结构体类型。会不会出现问题?

结构体和int等类型一样,都是数据类型.其他类型怎么转换,结构体就怎么转换,没有什么特殊的地方. 楼主可能想知道的不是结构体怎样强制转换这个问题吧,猜测,楼主想知道如下几个问题: 如果将一个结构体强制类型转换为另一个结构体(或者类型),那这个结构体的成员会怎样了? 如果将一个结构体强制类型转换为另一个结构体(或者类型),那么这个结构体成员的数值又会是什么了? 解答: 1.结构体的本质是:我们和C语言约定了一段内存空间的长短,及其内容的安排.假设下面两个结构体: struct A1 { int a

结构体+typedef的具体应用和解释

首先需要先了解结构体的基本知识: 1.结构体定义: struct 结构体名 { --结构体成员: } 举例: struct student { char name[10]; int age; } 2.结构指针-struct *p 其中,p为指向结构的一个指针,在给p传地址时,要给他传入结构体类型的地址. 举例: struct student *p; struct student stu1={"Anna",20}; p = &stu1; 依据上例可以发现,一个结构的名字并不是该结