C语言/通讯录/动态开辟

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

//静态版本
//void Initcontact(Contact* pc)//初始化函数
//{
//    pc->sz = 0;
//    //memset — 内存设置函数
//    memset(pc->date, 0, sizeof(pc->date));
//}

void Initcontact(Contact* pc)//初始化函数
{
    pc->sz = 0;
    //memset — 内存设置函数
    pc->date = (Peotfe*)malloc(Max * sizeof(Peotfe));
    if (pc->date == NULL)
    {
        perror("Initcontact");
        return;
    }
    pc->capacity = Max;
    pc->date = (Peotfe*)calloc(Max, sizeof(Peotfe));
}

//void AddContact(Contact* pc)//增加函数
//{
//    if (pc->sz == Max)//如果人满了,就无法添加联系人
//    {
//        printf("联系人已满,无法添加联系人\n");
//        return;
//    }
//
//    printf("请输入名字:>");
//    scanf("%s", pc->date[pc->sz].name);
//    printf("请输入电话:>");
//    scanf("%s", pc->date[pc->sz].tele);
//    printf("请输入地址:>");
//    scanf("%s", pc->date[pc->sz].addr);
//    printf("请输入年龄:>");
//    scanf("%d", &(pc->date[pc->sz].age));
//    printf("请输入性别:>");
//    scanf("%s", pc->date[pc->sz].sex);
//    
//    pc->sz++;
//    printf("成功增加联系人\n");
//}

void AddContact(Contact* pc)//增加函数
{
    if (pc->sz == pc->capacity)//如果人满了,就无法添加联系人
    {
        Peotfe* ptr = (Peotfe*)realloc(pc->date, (Max + INC_sz) * sizeof(Peotfe));
        if (ptr != NULL)
        {
            pc->date = ptr;
            pc->capacity += INC_sz;
            printf("增容成功\n");
        }
        else
        {
            perror("AddContact");
            printf("增加联系人失败\n");
            return;
        }
    }

    printf("请输入名字:>");
    scanf("%s", pc->date[pc->sz].name);
    printf("请输入电话:>");
    scanf("%s", pc->date[pc->sz].tele);
    printf("请输入地址:>");
    scanf("%s", pc->date[pc->sz].addr);
    printf("请输入年龄:>");
    scanf("%d", &(pc->date[pc->sz].age));
    printf("请输入性别:>");
    scanf("%s", pc->date[pc->sz].sex);

    pc->sz++;
    printf("成功增加联系人\n");
}

void PrintContact(Contact* pc)//打印函数
{
    if (pc->sz == 0)
    {
        printf("通讯录没有联系人,请添加联系人再打印\n");
        return;
    }
    int i = 0;
    printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n","姓名","年龄","性别","电话","地址");
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n", 
            pc->date[i].name,
            pc->date[i].age,
            pc->date[i].sex,
            pc->date[i].tele,
            pc->date[i].addr
              );
    }
}

static int Seekcontact(Contact* p,char str[])
{
    /*这里我们需要注意返回值,参数设计等等
    并且我在这个顺便说一下,大家写程序的时候一定要认真
    任何一个小失误可能都会导致你的失败*/

    //想一想 我们改则么查找呢,有人会说姓名或者是电话号码,或者地址对吧?
    //想法没有问题,主要是如何实现,因为这是第一版本,所以我就简单的用姓名查找吧
    //一些细节我没有注意,比如说名字一样则么办,我后面会升级代码的哈,希望大家点个关注,不迷路
    //废话不多说,开始实现
    int i = 0;
    for (i = 0; i < p->sz; i++)//用循环的方式 一个一个找
    {
        if (strcmp((p->date[i].name), str) == 0)
        {
            return i;
        }
    }
    return -1;//如果这个循环出来都没有找到的话,就是没有
}

void DelContact(Contact* pc)//删除函数
{
    /*删除的布置
    首先要输入一个联系人的信息,比如姓名,地址等等
    我在这里就按姓名举例子
    1.查找,如果有返回下标
    如果有,然后将后面的往前移一个
    如果没有,返回-1或者负数,因为负数不可能是下标*/
    //显然我们先要写一个查找函数
    
    if (pc->sz == 0)
    {
        printf("通讯录为空,无需删除\n");
        return;
    }
    int ret = 0;
    int i = 0;
    printf("请输入你要查找的联系人的姓名:>");
    char str[Max_NAME] = { 0 };
    scanf("%s", str);
    ret = Seekcontact(pc, str);//我声明一下,我英语不太好,单词都是简单的,别嫌弃哈
    if (ret == -1)
    {
        printf("你要查找的人不存在\n");
        return;
    }
    else
    {
        for (i = ret; i < pc->sz - 1; i++)//这里的判断条件 会在后面的图片里有,我先标记一下 (1)
        {
            pc->date[i] = pc->date[i+1];
        }
        pc->sz--;//这里也是一种特殊情况
        printf("删除成功\n");
    }
}

void SearchContact(Contact* pc)
{
    /*查找之前就写过了
    会比较轻松*///还是要输入一个人的名字
    //分两种情况
    //1.查找的人不存在 或者没有联系人可以查找
    //2.另一种就是存在

    if (pc->sz == 0)
    {
        printf("通讯录为空,无需查询\n");
        return;
    }

    printf("请输入你要查找的联系人的姓名:>");
    char name[Max_NAME] = { 0 };
    scanf("%s", name);
    int ret = 0;
    ret = Seekcontact(pc, name);
    if (ret == -1)
    {
        printf("你查找的联系人不存在,请你确认后再查询\n");
        return;
    }
    else
    {
        printf("你查找的联系人存在,他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
               );
    }
}

void ModifyContact(Contact* pc)
{
    /*修改也是一样的
    * 0.看通讯录是否为空
    1.查询是否存在
    2.存在,然后修改*/

    if (pc->sz == 0)
    {
        printf("通讯录为空,无需修改\n");
        return;
    }

    printf("请输入你要修改的联系人的姓名:>");
    char name[Max_NAME] = { 0 };
    scanf("%s", name);
    int ret = 0;
    ret = Seekcontact(pc, name);
    if (ret == -1)
    {
        printf("你要修改的联系人不存在,请你确认后再修改\n");
        return;
    }
    else
    {
        printf("你修改的联系人存在,他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
        );

        printf("下面是修改他的信息:>\n");

        printf("请输入名字:>");
        scanf("%s", pc->date[ret].name);
        printf("请输入电话:>");
        scanf("%s", pc->date[ret].tele);
        printf("请输入地址:>");
        scanf("%s", pc->date[ret].addr);
        printf("请输入年龄:>");
        scanf("%d", &(pc->date[ret].age));
        printf("请输入性别:>");
        scanf("%s", pc->date[ret].sex);

        printf("修改后他的信息是:>\n");
        printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
        printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
            pc->date[ret].name,
            pc->date[ret].age,
            pc->date[ret].sex,
            pc->date[ret].tele,
            pc->date[ret].addr
        );
    }
}
void SOrtContact(Contact* pos)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < pos->sz-1; i++)
    {
        for (j = 0; j < pos->sz - i-1; j++)//冒泡排序大家肯定都是知道的
            //如果不知道的话 我后面写一篇博客
        {
            if (strcmp(pos->date[j].name, pos->date[j + 1].name) == -1)
            {
                Peotfe str = pos->date[j];
                pos->date[j] = pos->date[j + 1];
                pos->date[j + 1] = str;
            }
        }
    }
    printf("排序成功\n");
}

void SortContact(Contact* pc)
{
    /*排序可以有很多种方式
    不过本人主要想用姓名或者地址
    毕竟字符串方便一点,前面那些都用的姓名
    那么这个函数也围绕这姓名吧*/

    //写道这里首先想到的是冒泡排序
    //首先是思维,然后是代码
    /*思维是排序是按一下,所有人都排序
    因为是第一版本,我就弄简单点,这次这是从小到大
                                      或者从大到小
                                      后面的版本我会升级
                                      一样的大家期待一吧
    废话不多说 我们现在就开始*/

    //我们还是会用到字符串比较函数 strcmp
    SOrtContact(pc);
    PrintContact(pc);
}


void DestoryContact(Contact* pc)
{
    free(pc->date);
    pc->date = NULL;
    pc->capacity = 0;
    pc->sz = 0;
}
#pragma once

#include<stdio.h>
#include<string.h>
#include<stdlib.h>//动态内存开辟版本


#define Max_NAME 20
#define Max_SEX  10
#define Max_TELE 12
#define Max_Addr 30
#define Max 3
#define INC_sz 2


//在这里我们要写一个人的基本信息,为了使程序更加稳定,我用预定义来限制字符串的长度
/*1.姓名
2.年龄
3.性别
4.地址
5.电话
6.等等*/

typedef struct Peotfe
{
    char name[Max_NAME];
    int age;
    char sex[Max_SEX];
    char tele[Max_TELE];
    char addr[Max_Addr];
}Peotfe;


//现在写一个通讯录的框架
//typedef struct Contact
//{
//    Peotfe date[Max];
//    int sz;
//}Contact;


typedef struct Contact
{
    Peotfe *date;
    int sz;
    int capacity;//记录当前通讯录最大容量
}Contact;


//初始化通讯录
void Initcontact(Contact* pc);


//增加联系人信息
void AddContact(Contact* pc);

//打印通讯录信息
void PrintContact(Contact* pc);

//删除联系人信息
void DelContact(Contact* pc);

//查找联系人信息
void SearchContact(Contact* pc);

//修改联系人信息
void ModifyContact(Contact* pc);

//排序通讯录
void SortContact(Contact* pc);

//销毁通讯录
void DestoryContact(Contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1

/*通讯录
1.增加联系人信息
2.删除联系人信息
3.查找联系人信息
4.排序联系人
5.打印通讯录
6.退出*/

#include"Contact.h"

void menu()
{
    printf("***************************************\n");
    printf("******  1. Add     2.Ddl **************\n");
    printf("******  3. Search  4. Modify **********\n");
    printf("******  5. Sort    6. Print  **********\n");
    printf("************ 0. Exit ******************\n");
    printf("***************************************\n");
}

enum Option
{
    Exit,
    Add,
    Del,
    Search,
    Modify,
    Sort,
    Print

};

int main()
{
    Contact con;
    //初始化通讯录
    Initcontact(&con);

    int input = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch(input)
        {
            case Add:
                AddContact(&con);
                //增加联系人信息
                break;
            case Del:
                DelContact(&con);
                //删除
                break;
            case Search:
                SearchContact(&con);
                //查找
                break;
            case Modify:
                //修改
                ModifyContact(&con);
                break;
            case Sort:
                //排序
                SortContact(&con);
                break;
            case Print:
                //打印
                PrintContact(&con);
                break;
            case Exit:
                //退出
                DestoryContact(&con);
                printf("已经退出通讯录\n");
                break;
            default:
                //输入错误
                printf("输入错误,请重新输入\n");
                break;
        }
    } while (input);
    return 0;
}

这个版本就是第二版本了,需要一定的编程能力,对于结构体的有一定的了解,尤其是初始化,排序的时候也需要注意,后面会有更多的版本,大概是文件版本吧 在这个的基础上增加的 后面的版本

之前给大家讲的刷题网站 你们可以去

0.牛客 这个网站很不错的 对于初学者很友好

  1. 就是航电oj 这个网站需要一定的实力 里面的题目可能一样 但是不好通过 测试的数据都很出乎意料 比如说两个数的加法 他会用超级大的数字 甚至超过了long long的范围 这个题要用字符串 要用内存函数 题目也很多 想提升的可以去练练

  1. 还有几个英文的网站 比如说cf 这个网站也是非常完美的 我把链接放下面 你们可以去看看 有比赛 也有题

  1. 洛谷也是很好的

  1. 想练习练习算法的可以去力扣 里面有很多算法题

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值