通讯录(动态与静态)实现 w字 C语言进阶

本文阅读 7 分钟
首页 代码,C/C#/C++ 正文

目录

1. 序言

2. 静态实现

2.1. 效果展示图

2.2. 接口实现

2.2.01. 首先是我们的框架

2.2.02. 要实现的接口

2.2.03. 初始化

2.2.04. 增加联系人

2.2.05. 删除

2.2.06. 查找 

2.2.07. 改成员数据

2.02.08. 显示成员

2.02.09.  排序

2.3. 源代码

test.c

Contact.h 

Contact.c

3. 动态版

3.1. 通讯录的创建

3.2. 初始化

3.3. 增加数据

动态版源代码

test.c

Contact.h 

Contact.c

1. 序言

hello✨,大家好呀,这里是原来💖 💛💙,随着文章篇幅越来越多可能有很多小伙伴们找不到自己想要看的文章,所以我就出来啦,这里附带各文章链接哈。🎁 🎁 🎁

对于通讯录的动静态差别还是很小的,所以本文章先实现静态的,动态的就把要改的拎出来就可以了,避免文章冗余哈。这里注意我们使用了枚举常量去替换了原来的switch,case语句中的数字,这是对于枚举常量的使用。

<span style="color:#a2e043;">首先我们要知道我们要实现的功能,首先还是增删查改,然后是显示成员,排序,最后是退出。</span>

2.1. 效果展示图

img

img

2.2. 接口实现

2.2.01. 首先是我们的框架

int main()
{
    do
    {
        menu();

        switch ()
        {
        case:
        default:
        }
    } while ();
    return 0;
}

2.2.02. 要实现的接口

img

img

2.2.03. 初始化

img

2.2.04. 增加联系人

img

2.2.05. 删除

img

2.2.06. 查找 

img

找到了返回地址,找不到返回-1。 

2.2.07. 改成员数据

img

2.02.08. 显示成员

这里显示了各数据对应的名称,注意%s长度一样‘-’是左对齐,/t是相当于4个空格。 

2.02.09.  排序

这里我们是用了qsort快速排序这个库函数,这里我们是按的名字排序,后面会把实现快速排序的文章也发出来哈。 

2.3. 源代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"


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

int main()
{
    int input=0;
    Contact con;
    char name[10] = { 0 };
    InitContact(&con);
    do
    {
        menu();
        printf("请输入你要选择的选项:\n");
        scanf("%d", &input);
        switch (input)
        {
        case Add:
            printf("增加通讯录成员:\n");
            AddContact(&con);
            break;
        case Delet:
            printf("删除通讯录成员:\n");
            printf("请输入要删除人员姓名:");
            char name[NAME_MAX] = { 0 };
            scanf("%s", name);
            DeletContact(&con, name);
            break;
        case Search:
            printf("查找通讯录成员:\n");
            printf("请输入要查找人员姓名:");
            scanf("%s", name);
            SearchContact(&con, name);
            break;
        case Modify:
            printf("更改通讯录成员信息:\n");
            printf("请输入要查找人员姓名:");
            scanf("%s", name);
            ModifyContact(&con, name);
            break;
        case Show:
            printf("显示通讯录成员:\n");
            ShowContact(&con);
            break;
        case Sort:
            printf("排序通讯录成员:\n");
            SortContact(&con);
            break;
        case exitcontact:
            //DestoryContact(&con);
            printf("退出通讯录:\n");
            break;
        default:
            printf("输入错误,请重新输入:");
            break;
        }
    } while (input);
    return 0;
}

Contact.h 

#pragma once

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

#define CONTACT_MAX 1000
#define NAME_MAX 10
#define SEX_MAX 5
#define TELEP_MAX 13
#define ADDRESS_MAX 20

typedef struct Student
{
    char name[NAME_MAX];
    char sex[SEX_MAX];
    int age;
    char telep[TELEP_MAX];
    char address[ADDRESS_MAX];
}Student;

typedef struct Contact
{
    Student date[CONTACT_MAX];
    int sz;
}Contact;

enum contactmenu
{
    exitcontact,
    Add,
    Delet,
    Search,
    Modify,
    Show,
    Sort,
};

//初始化
void InitContact(Contact* pc);
//增加
void AddContact(Contact* pc);
//删除
void DeletContact(Contact* pc, char name[]);
//查找
void SearchContact(Contact* pc, char name[]);
//修改
void ModifyContact(Contact* pc, char name[]);
//显示
void ShowContact(Contact* pc);
//排序
void SortContact(Contact* pc);
//void DestoryContact(Contact* pc);
int FindContact(Contact* pc, char name[]);

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(Contact* pc)
{
    assert(pc);
    pc->sz = 0;
    memset(pc->date, 0, sizeof(pc->date));
}

void AddContact(Contact* pc)
{
    assert(pc);
    if (pc->sz == CONTACT_MAX)
    {
        printf("通讯录满了,无法添加\n");
        return;
    }
    printf("输入要添加联系人的姓名:");
    scanf("%s", pc->date[pc->sz].name);
    printf("输入要添加联系人的性别:");
    scanf("%s", pc->date[pc->sz].sex);
    printf("输入要添加联系人的年龄:");
    scanf("%d", &(pc->date[pc->sz].age));
    printf("输入要添加联系人的电话:");
    scanf("%s", pc->date[pc->sz].telep);
    printf("输入要添加联系人的地址:");
    scanf("%s", pc->date[pc->sz].address);

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

void ShowContact(Contact* pc)
{
    assert(pc);
    printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n", 
            pc->date[i].name,pc->date[i].sex,pc->date[i].age,pc->date[i].telep,pc->date[i].address);
    }
}

int FindContact(Contact* pc,char name[])
{
    assert(pc);
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->date[i].name, name)==0)
        {
            return i;
        }
    }
    return -1;
}

void DeletContact(Contact* pc, char name[])
{
    assert(pc);
    if (pc->sz == 0)
    {
        printf("已经没有联系人,不可删除\n");
        return;
    }
    int i = FindContact(pc, name);
    if (i != -1)
    {
        int j = 0;
        for (j=i; j < pc->sz-1; j++)
        {
            pc->date[j] = pc->date[j + 1];
        }
        pc->sz--;
        printf("删除成功!\n");  
    }
    else
    {
        printf("查无此人\n");
    }
}

void SearchContact(Contact* pc, char name[])
{
    assert(pc);
    int ret=FindContact(pc, name);
    if (ret != -1)
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
    }
    else
    {
        printf("没有找到\n");
    }
    
}


void ModifyContact(Contact* pc, char name[])
{
    assert(pc);
    int ret=FindContact(pc, name);
    if (ret == -1)
    {
        printf("查无此人\n");
    }
    else
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
        printf("请修改:\n");
        printf("输入要添加联系人的姓名:");
        scanf("%s", pc->date[ret].name);
        printf("输入要添加联系人的性别:");
        scanf("%s", pc->date[ret].sex);
        printf("输入要添加联系人的年龄:");
        scanf("%d", &(pc->date[ret].age));
        printf("输入要添加联系人的电话:");
        scanf("%s", pc->date[ret].telep);
        printf("输入要添加联系人的地址:");
        scanf("%s", pc->date[ret].address);
        printf("修改成功!\n");
    }
}

int cmp_name(const void* e1, const void* e2)
{
    return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
}

void SortContact(Contact* pc)
{
    assert(pc);
    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

<span style="color:#79c6cd;">对于动态版与静态版的区别还是很小的,区别就是通讯录的创建,然后是增加数据的时候注意要扩容,初始化的时候注意动态开辟空间,其余都是一样的。</span>

3.1. 通讯录的创建

注意多了一个capacity容量这个参数,然后用sz来记录。 

3.2. 初始化

注意判空。

3.3. 增加数据

img

img

动态版源代码

为了人性化,可能有小伙伴改起来困难,所以这里也把动态版的源代码也发出来了哈。

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"


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

int main()
{
    int input = 0;
    Contact con;
    char name[10] = { 0 };
    InitContact(&con);
    do
    {
        menu();
        printf("请输入你要选择的选项:\n");
        scanf("%d", &input);
        switch (input)
        {
        case Add:
            printf("增加通讯录成员:\n");
            AddContact(&con);
            break;
        case Delet:
            printf("删除通讯录成员:\n");
            printf("请输入要删除人员姓名:");
            char name[NAME_MAX] = { 0 };
            scanf("%s", name);
            DeletContact(&con, name);
            break;
        case Search:
            printf("查找通讯录成员:\n");
            printf("请输入要查找人员姓名:");
            scanf("%s", name);
            SearchContact(&con, name);
            break;
        case Modify:
            printf("更改通讯录成员信息:\n");
            printf("请输入要查找人员姓名:");
            scanf("%s", name);
            ModifyContact(&con, name);
            break;
        case Show:
            printf("显示通讯录成员:\n");
            ShowContact(&con);
            break;
        case Sort:
            printf("排序通讯录成员:\n");
            SortContact(&con);
            break;
        case exitcontact:
            DestoryContact(&con);
            printf("退出通讯录:\n");
            break;
        default:
            printf("输入错误,请重新输入:");
            break;
        }
    } while (input);
    return 0;
}

Contact.h 

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(Contact* pc)
{
    assert(pc);
    Student* new = (Student*)malloc(DEFAULT_SIZE * sizeof(Student));
    if (new != NULL)
    {
        pc->date = new;
        pc->sz = 0;
        pc->capacity = DEFAULT_SIZE;
    }
    else
    {
        printf("InitContact:%s\n", strerror(errno));
        return;
    }
}

void Add_Capacity(Contact* pc)
{
    Student* new = (Student*)realloc(pc->date, sizeof(Student) * (pc->capacity + 2));
    if (new != NULL)
    {
        pc->date = new;
        pc->capacity += 2;
        printf("增容成功!\n");
    }
    else
    {
        printf("Add_Capccity():%s\n", strerror(errno));
        return;
    }
}

void AddContact(Contact* pc)
{
    assert(pc);

    if (pc->capacity == pc->sz)
    {
        Add_Capacity(pc);
    }

    printf("输入要添加联系人的姓名:");
    scanf("%s", pc->date[pc->sz].name);
    printf("输入要添加联系人的性别:");
    scanf("%s", pc->date[pc->sz].sex);
    printf("输入要添加联系人的年龄:");
    scanf("%d", &(pc->date[pc->sz].age));
    printf("输入要添加联系人的电话:");
    scanf("%s", pc->date[pc->sz].telep);
    printf("输入要添加联系人的地址:");
    scanf("%s", pc->date[pc->sz].address);

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

void ShowContact(Contact* pc)
{
    assert(pc);
    printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].telep, pc->date[i].address);
    }
}

int FindContact(Contact* pc, char name[])
{
    assert(pc);
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->date[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

void DeletContact(Contact* pc, char name[])
{
    assert(pc);
    if (pc->sz == 0)
    {
        printf("已经没有联系人,不可删除\n");
        return;
    }
    int i = FindContact(pc, name);
    if (i != -1)
    {
        int j = 0;
        for (j = i; j < pc->sz - 1; j++)
        {
            pc->date[j] = pc->date[j + 1];
        }
        pc->sz--;
        printf("删除成功!\n");
    }
    else
    {
        printf("查无此人\n");
    }
}

void SearchContact(Contact* pc, char name[])
{
    assert(pc);
    int ret = FindContact(pc, name);
    if (ret != -1)
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
    }
    else
    {
        printf("没有找到\n");
    }

}


void ModifyContact(Contact* pc, char name[])
{
    assert(pc);
    int ret = FindContact(pc, name);
    if (ret == -1)
    {
        printf("查无此人\n");
    }
    else
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
        printf("请修改:\n");
        printf("输入要添加联系人的姓名:");
        scanf("%s", pc->date[ret].name);
        printf("输入要添加联系人的性别:");
        scanf("%s", pc->date[ret].sex);
        printf("输入要添加联系人的年龄:");
        scanf("%d", &(pc->date[ret].age));
        printf("输入要添加联系人的电话:");
        scanf("%s", pc->date[ret].telep);
        printf("输入要添加联系人的地址:");
        scanf("%s", pc->date[ret].address);
        printf("修改成功!\n");
    }
}

int cmp_name(const void* e1, const void* e2)
{
    return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
    // return strcmp(((Contact*)e1)->date->name, ((Student*)e2)->date->name);
}

void SortContact(Contact* pc)
{
    assert(pc);

    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

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

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(Contact* pc)
{
    assert(pc);
    Student* new = (Student*)malloc(DEFAULT_SIZE * sizeof(Student));
    if (new != NULL)
    {
        pc->date = new;
        pc->sz = 0;
        pc->capacity = DEFAULT_SIZE;
    }
    else
    {
        printf("InitContact:%s\n", strerror(errno));
        return;
    }
}

void Add_Capacity(Contact* pc)
{
    Student* new = (Student*)realloc(pc->date, sizeof(Student) * (pc->capacity + 2));
    if (new != NULL)
    {
        pc->date = new;
        pc->capacity += 2;
        printf("增容成功!\n");
    }
    else
    {
        printf("Add_Capccity():%s\n", strerror(errno));
        return;
    }
}

void AddContact(Contact* pc)
{
    assert(pc);

    if (pc->capacity == pc->sz)
    {
        Add_Capacity(pc);
    }

    printf("输入要添加联系人的姓名:");
    scanf("%s", pc->date[pc->sz].name);
    printf("输入要添加联系人的性别:");
    scanf("%s", pc->date[pc->sz].sex);
    printf("输入要添加联系人的年龄:");
    scanf("%d", &(pc->date[pc->sz].age));
    printf("输入要添加联系人的电话:");
    scanf("%s", pc->date[pc->sz].telep);
    printf("输入要添加联系人的地址:");
    scanf("%s", pc->date[pc->sz].address);

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

void ShowContact(Contact* pc)
{
    assert(pc);
    printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\t\n", "姓名", "性别", "年龄", "电话", "地址");
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[i].name, pc->date[i].sex, pc->date[i].age, pc->date[i].telep, pc->date[i].address);
    }
}

int FindContact(Contact* pc, char name[])
{
    assert(pc);
    int i = 0;
    for (i = 0; i < pc->sz; i++)
    {
        if (strcmp(pc->date[i].name, name) == 0)
        {
            return i;
        }
    }
    return -1;
}

void DeletContact(Contact* pc, char name[])
{
    assert(pc);
    if (pc->sz == 0)
    {
        printf("已经没有联系人,不可删除\n");
        return;
    }
    int i = FindContact(pc, name);
    if (i != -1)
    {
        int j = 0;
        for (j = i; j < pc->sz - 1; j++)
        {
            pc->date[j] = pc->date[j + 1];
        }
        pc->sz--;
        printf("删除成功!\n");
    }
    else
    {
        printf("查无此人\n");
    }
}

void SearchContact(Contact* pc, char name[])
{
    assert(pc);
    int ret = FindContact(pc, name);
    if (ret != -1)
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
    }
    else
    {
        printf("没有找到\n");
    }

}


void ModifyContact(Contact* pc, char name[])
{
    assert(pc);
    int ret = FindContact(pc, name);
    if (ret == -1)
    {
        printf("查无此人\n");
    }
    else
    {
        printf("找到了!\n");
        printf("%-10s\t%-5s\t%-5d\t%-13s\t%-20s\t\n",
            pc->date[ret].name, pc->date[ret].sex, pc->date[ret].age, pc->date[ret].telep, pc->date[ret].address);
        printf("请修改:\n");
        printf("输入要添加联系人的姓名:");
        scanf("%s", pc->date[ret].name);
        printf("输入要添加联系人的性别:");
        scanf("%s", pc->date[ret].sex);
        printf("输入要添加联系人的年龄:");
        scanf("%d", &(pc->date[ret].age));
        printf("输入要添加联系人的电话:");
        scanf("%s", pc->date[ret].telep);
        printf("输入要添加联系人的地址:");
        scanf("%s", pc->date[ret].address);
        printf("修改成功!\n");
    }
}

int cmp_name(const void* e1, const void* e2)
{
    return strcmp(((Student*)e1)->name, ((Student*)e2)->name);
    // return strcmp(((Contact*)e1)->date->name, ((Student*)e2)->date->name);
}

void SortContact(Contact* pc)
{
    assert(pc);

    qsort(pc->date, pc->sz, sizeof(pc->date[0]), cmp_name);
}

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

<span style="color:#956fe7;">今天的内容就到这里了哈!!!</span>

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/weixin_62700590/article/details/122719419
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复