【C语言】 实现通讯录(使用动态内存存储)

版权声明: https://blog.csdn.net/spaceman_c/article/details/80367072

实现一个通讯录

通讯录可以用来存储联系人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

text.c中的代码:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include"contact.h"
#include<string.h>

int menu()
{
    printf("--------------------------------------\n");
    printf("-----1.增加    2.删除     3.查找------\n");
    printf("-----4.修改    5.显示     6.清空------\n");
    printf("----------7.排序----0.exit------------\n");
    printf("--------------------------------------\n");
    printf("请选择>");
    int x = 0;
    scanf_s("%d", &x);
    return x;
}

int main()
{
    int ret = 0;
    Contact my_con;//结构体变量
    InitContact(&my_con);
    do
    {
        ret = menu();
        switch (ret) 
        {
        case ADD:
            AddContact(&my_con);
            break;
        case DELE:
            Dele_Contact(&my_con);
            break;
        case SEAR:
            Search_Contact(&my_con);
            break;
        case MOD:
            Mod_Contact(&my_con);
            break;
        case SHOW :
            ShowContact(&my_con);
            break;
        case EEMP:
            Eempty_Contact(&my_con);
            break;
        case SORT :
            Sort_Contact(&my_con);
            break;
        case EXIT:
            Destroy_Contact(&my_con);
            break;
        default:
            printf("输入错误,请重新输入:\n");
                break;
        }
        printf("\n");
    } while (ret);

    system("pause");
    return 0;

}

contact.h中的代码:(头文件的声明,函数的声明,宏定义,结构体和联合体)

#define _CRT_SECURE_NO_WARNINGS 1

#ifndef __CONTACT_H__
#define __CONTACT_H__ //防止头文件被重复引用

#include <stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDERS 20
#define MAX_CAPACITY 2

**//使用枚举可以增加代码的可读性和可维护性,一次可以定义多个变量**
enum peo
{
    EXIT,
    ADD,
    DELE,
    SEAR,
    MOD,
    SHOW,
    EEMP,
    SORT
};


typedef struct PeoInfo
{
    char name[MAX_NAME];
    int age;
    char sex[MAX_SEX];
    char tele[MAX_TELE];
    char address[MAX_ADDERS];
}PeoInfo;

typedef struct Contact
{
    PeoInfo *data;
    int count;//当前个数
    int capacity;//最大容量
}Contact, *pContact;

//初始化结构体
void InitContact(pContact pc);
//增加联系人
void AddContact(pContact pc);
//删除联系人
void Dele_Contact(pContact pc);
//检查联系人是否存在
int is_exit(pContact pc, char *name);
//查找联系人
void Search_Contact(pContact pc);
//修改联系人
void Mod_Contact(pContact pc);
//显示联系人
void ShowContact(pContact pc);
//清空联系人
void Eempty_Contact(pContact pc);
//按照姓名排序所有联系人
void Sort_Contact(pContact pc);
//销毁所创建的空间
void Destroy_Contact(pContact pc);

#endif //__CONTACT_H__

start.c中代码:(各种函数的实现)

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"

//初始化结构体
void InitContact(pContact pc)
{
    pc->count = 0;
    pc->capacity = MAX_CAPACITY;
    pc->data = (PeoInfo*)calloc(sizeof(PeoInfo),pc->capacity);

}
//增加容量
void increase(pContact pc)
{
    PeoInfo *p = (PeoInfo*)realloc(pc->data, sizeof(PeoInfo)*(pc->capacity + 2));
    if (p != NULL)
    {
        pc->data = p;
        p = NULL;

    }
    pc->capacity += 2;
    printf("增容成功\n");

}
//增加联系人
void  AddContact(pContact pc)
{

    if (pc->count == pc->capacity)
    {
        printf("容量以满,是否增容\n");
        printf("1,增容  2,不增\n");
        printf("请选择>");
        int i = 0;
        scanf("%d", &i);
        if (i == 1)
        {
            increase(pc);
        }
        else
        {
            printf("存不下了");
            return ;
        }
    }

    printf("输入姓名:");
    scanf("%s", pc->data[pc->count].name);

    printf("输入性别:");
    scanf("%s", pc->data[pc->count].sex);

    printf("输入年龄:");
    scanf("%d", &(pc->data[pc->count].age));

    printf("输入手机:");
    scanf("%s", pc->data[pc->count].tele);

    printf("输入地址:");
    scanf("%s", pc->data[pc->count].address);

    pc->count++;

}
//删除联系人
void Dele_Contact(pContact pc)
{

    int i = 0;
    char name[20] = { 0 };
    printf("请输入要删除的姓名:");
    scanf("%s", &name);
    int ret=is_exit(pc, name);
    if (ret != -1)
    {
        for (i = ret; i < pc->count; i++)
        {
            pc->data[i] = pc->data[i + 1];

        }
        pc->count--;
        printf("删除成功");

    }

    else
    {
        printf("联系人不存在\n");
    } 
}
//查找联系人
void Search_Contact(pContact pc)
{
    printf("请输入要查找的联系人:");
    char name[20] = { 0 };
    scanf("%s", &name);
    int ret = is_exit(pc, name);
    if (ret != -1)
    {
        printf("%10s %7s %5d %12s %10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].address);
    }
    else
    {
        printf("联系人不存在");
    }
}
//修改联系人
void Mod_Contact(pContact pc)
{
    printf("请输入要修改的联系人:");
    char name[20] = { 0 };
    scanf("%s", &name);
    int ret = is_exit(pc, name);
    if (ret != -1)
    {
        printf("输入姓名:");
        scanf("%s", pc->data[ret].name);

        printf("输入性别:");
        scanf("%s", pc->data[ret].sex);

        printf("输入年龄:");
        scanf("%d", &(pc->data[ret].age));

        printf("输入手机:");
        scanf("%s", pc->data[ret].tele);

        printf("输入地址:");
        scanf("%s", pc->data[ret].address);

        printf("修改后的信息为:\n");
        printf("%10s %7s %5d %12s %10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].address);
    }
    else
    {
        printf("联系人不存在");
    }
}
//显示联系人
void ShowContact(pContact pc)
{

    int i = 0;
    if (pc->count == 0)
    {
        printf("通讯录为空\n");
        return;
    }   
    printf("--------------------------------------------------------\n");
    printf("%10s %7s %5s %12s %10s\n", "姓名","性别","年龄","电话","住址");
    printf("\n");
    for (i = 0; i<pc->count; i++)
    {
        printf("%10s %7s %5d %12s %10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].address);
    }
    printf("--------------------------------------------------------\n");
}
//清空联系人
void Eempty_Contact(pContact pc)
{

    pc->count = 0;
    memset(pc->data, 0, sizeof(pc->data));
    printf("清空联系人\n");
}
//按照姓名排序所有联系人
void Sort_Contact(pContact pc)
{
    int i = 0;
    for (i = 0; i < pc->count; i++)
    {
        int j = 0;
        for (j = 0; j < pc->count - 1 - i; j++)
        {
            if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
            {
                PeoInfo tme = pc->data[j];
                pc->data[j] = pc->data[j + 1];
                pc->data[j + 1] = tme;

            }
        }
    }

    printf("排序成功\n");
}
//检查联系人是否存在  存在返回下标,不存在返回-1
int is_exit(pContact pc,char *name)
{
    int i = 0;
    for (i = 0; i < pc->count; i++)
    {
        if (strcmp(pc->data[i].name, name)==0)
        {
            return i;

        }
    }
    return -1;
}
//销毁所创建的空间
void Destroy_Contact(pContact pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->count = 0;
    pc->capacity = 0;
    printf("销毁成功\n");
}

这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/spaceman_c/article/details/80367072