通讯录(c语言)动态版本-创新互联

一、需求增加

在学习动态内存管理之后,我们的需求也改变了,要求我们做一个动态版本的通讯录,可以改变我们的capacaty大小,随着加入联系人通讯录容量增大。

站在用户的角度思考问题,与客户深入沟通,找到伊川网站设计与伊川网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站制作、成都网站制作、企业官网、英文网站、手机端网站、网站推广、申请域名、网页空间、企业邮箱。业务覆盖伊川地区。二、如何实施

因为要实现动态版本通讯录,我们要改变通讯录结构

typedef struct Contact {
    PeoInfo* con;
    int size;
    int capacaty ;
}Contact;

我们之前存放的是一个定长数组来存放联系人,现在我们存放一个联系人数组的指针来保存联系人信息。

当结构体改变之后我们的初始化函数也要改变

void InitContact(Contact* ps) {
    assert(ps);
    ps->con = NULL;
    ps->size = 0;
    ps->capacaty =0;
}

我们先将指针con指向NULL表示现在一个人也没有存储完成初始化

在添加联系人函数中我们也要改变容量不够时的代码实现

我们首先判断size和capacaty是否相等
若相等我们就要扩容
扩容时我们用三目运算符判断是否为第一次扩容(capacaty是否等于0),是的话第一次给他四个空间大小,不是则扩大原空间2倍
之后进行联系人的添加
void AddContact(Contact* ps) {
    assert(ps);
    if (ps->size == ps->capacaty) {
        int newcapacaty = ps->capacaty == 0 ? 4 : 2 * ps->capacaty;
        PeoInfo*tmp=(PeoInfo*)realloc(ps->con, newcapacaty*sizeof(PeoInfo));
        if (tmp == NULL) {
            printf("扩容失败\n");
            exit(-1);
        }
        ps->con = tmp;
        ps->capacaty = newcapacaty;
    }
    printf("请输入被添加人的姓名\n");
    scanf("%s", ps->con[ps->size].name);
    printf("请输入被添加人的性别\n");
    scanf("%s", ps->con[ps->size].sex);
    printf("请输入被添加人的年龄\n");
    scanf("%d",& ps->con[ps->size].age);
    printf("请输入被添加人的电话\n");
    scanf("%s", ps->con[ps->size].phonenumber);
    printf("请输入被添加人的住址\n");
    scanf("%s", ps->con[ps->size].adress);
    getchar();
    ps->size++;
    printf("输入成功,请按回车继续\n");
    getchar();
}

最后我们不要忘记销毁开辟的空间

void DestoryContact(Contact* ps) {
    assert(ps);
    free(ps->con);
    ps->con = NULL;
    ps->size = 0;
    ps->capacaty = 0;
    ps->con= NULL;
}

在销毁通讯录时要将开辟的空间free掉

再将指针置为NULL

这样动态的通讯录就完成了是不是很简单呢!

三、完整代码 contact.h
#pragma once
#pragma warning(disable : 4996)
#include#include#include#include 
typedef struct PeoInfo {
    char name[32];
    char sex[8];
    int age;
    char phonenumber[12];
    char adress[20];
}PeoInfo;

typedef struct Contact {
    PeoInfo* con;
    int size;
    int capacaty ;
}Contact;


void InitContact(Contact* ps);
void DestoryContact(Contact* ps);
void AddContact(Contact* ps);
void DeleContact(Contact* ps);
void FindContact(Contact* ps);
void ChangeContact(Contact* ps);
void CleanContact(Contact* ps);
void ShowContact(Contact* ps);
void SortContact(Contact* ps);
void SortContact(Contact* ps);
contact.c
#include"contact.h"
void InitContact(Contact* ps) {
    assert(ps);
    ps->con = NULL;
    ps->size = 0;
    ps->capacaty =0;
}
void DestoryContact(Contact* ps) {
    assert(ps);
    free(ps->con);
    ps->con = NULL;
    ps->size = 0;
    ps->capacaty = 0;
    ps->con= NULL;
}
void AddContact(Contact* ps) {
    assert(ps);
    if (ps->size == ps->capacaty) {
        int newcapacaty = ps->capacaty == 0 ? 4 : 2 * ps->capacaty;
        PeoInfo*tmp=(PeoInfo*)realloc(ps->con, newcapacaty*sizeof(PeoInfo));
        if (tmp == NULL) {
            printf("扩容失败\n");
            exit(-1);
        }
        ps->con = tmp;
        ps->capacaty = newcapacaty;
    }
    printf("请输入被添加人的姓名\n");
    scanf("%s", ps->con[ps->size].name);
    printf("请输入被添加人的性别\n");
    scanf("%s", ps->con[ps->size].sex);
    printf("请输入被添加人的年龄\n");
    scanf("%d",& ps->con[ps->size].age);
    printf("请输入被添加人的电话\n");
    scanf("%s", ps->con[ps->size].phonenumber);
    printf("请输入被添加人的住址\n");
    scanf("%s", ps->con[ps->size].adress);
    getchar();
    ps->size++;
    printf("输入成功,请按回车继续\n");
    getchar();
}
void ShowContact(Contact* ps) {
    assert(ps);
    system("cls");
    printf("%-7s\t%-5s\t%-5s\t%-11s\t%-32s\t\n","姓名","性别","年龄"," 电话","住址");
    for (int i = 0; i< ps->size; i++) {
        printf("%-7s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[i].name,
                                                            ps->con[i].sex,
                                                            ps->con[i].age,
                                                            ps->con[i].phonenumber,
                                                            ps->con[i].adress);    
    }
    printf("输入回车继续\n");
    getchar();
}
void SortContact(Contact* ps);
int FindByName(Contact* ps, char* name) {
    for (int i = 0; i< ps->size; i++) {
        if (strcmp(name, ps->con[i].name) == 0) {
            return i;
        }
    }
    return -1;
}
void DeleContact(Contact * ps) {
        assert(ps);
        char name[32];
        printf("请输入要删除的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        for (int j = pos; j< ps->size; j++) {
            ps->con[j] = ps->con[j + 1];
        }
        ps->size--;
        printf("删除完毕按回车继续\n");
        getchar();
    }
void FindContact(Contact* ps) {
        assert(ps);
        char name[32];
        printf("请输入要查找的姓名\n");
        scanf("%s", name);
        getchar();
        int pos = FindByName(ps, name);
        if (pos == -1) {
            printf("查无此人\n");
            return;
        }
        system("cls");
        printf("查找成功\n");
        printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
        printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
            ps->con[pos].sex,
            ps->con[pos].age,
            ps->con[pos].phonenumber,
            ps->con[pos].adress);
        printf("输入回车继续\n");
        getchar();
}
void ChangeContact(Contact* ps) {
    assert(ps);
    char name[32];
    printf("请输入要修改的姓名\n");
    scanf("%s", name);
    getchar();
    int pos = FindByName(ps, name);
    if (pos == -1) {
        printf("查无此人\n");
        return;
    }
    printf("请输入要修改的年龄\n");
    scanf("%d", &ps->con[pos].age);
    printf("请输入要修改的电话\n");
    scanf("%s", ps->con[pos].phonenumber);
    printf("请输入要修改的住址\n");
    scanf("%s", ps->con[pos].adress);
    printf("修改完成\n");
    printf("%-10s\t%-5s\t%-5s\t%-11s\t%-32s\t\n", "姓名", "性别", "年龄", " 电话", "住址");
    printf("%-10s\t%-5s\t%-5d\t%-11s\t%-32s\t\n", ps->con[pos].name,
        ps->con[pos].sex,
        ps->con[pos].age,
        ps->con[pos].phonenumber,
        ps->con[pos].adress);
    printf("输入回车继续\n");
    getchar();
}
void CleanContact(Contact* ps) {
    assert(ps);
    ps->size = 0;
    printf("清除完毕按回车继续\n");
    getchar();
}
void SortContact(Contact* ps)
{
    if (ps->size == 0)
    {
        printf("通讯录中没有联系人\n");
    }
    else
    {
        for (int i = 0; i< ps->size - 1; i++)
        {
            for (int j = 0; j< ps->size - 1 - i; j++)
            {
                if ((strcmp(ps->con[j].name, ps->con[j + 1].name)) >0)
                {
                    PeoInfo temp = ps->con[j];
                    ps->con[j] = ps->con[j + 1];
                    ps->con[j + 1] = temp;
                }
            }
        }
        printf("排序成功!\n");
    }
}
test.c
#include "contact.h"

int memu() {
    system("cls");
    printf("*****************************************\n");
    printf("*********        通讯录         *********\n");
    printf("*********   1.ADD    2.DELETE   *********\n");
    printf("*********   3.FIND   4.CHANGE   *********\n");
    printf("*********   5.SHOW   6.CLEAN    *********\n");
    printf("*********   7.SORT   0.EXIT     *********\n");
    printf("*****************************************\n");
    int input;
    printf("请输入选项\n");
    scanf_s("%d", &input);
    getchar();
    return input;
}
int main() {
    Contact contact;
    InitContact(&contact);
    while (1) {
        int choose = memu();
        switch (choose)
        {
        case 1:
            AddContact(&contact);
            break;
        case 2:
            DeleContact(&contact);
            break;
        case 3:
            FindContact(&contact);
            break;
        case 4:
            ChangeContact(&contact);
            break;
        case 5:
            ShowContact(&contact);
            break;
        case 6:
            CleanContact(&contact);
            break;
        case 7:
            SortContact(&contact);
            break;
        case 0:
            DestoryContact(&contact);
            printf("退出成功\n");
            exit(0);
        default:
            printf("请输入正确选项\n");
            system("pause");
        }

    }
    return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站标题:通讯录(c语言)动态版本-创新互联
文章起源:http://myzitong.com/article/gjhjh.html