0


运用动态内存管理编写通讯录(后附源码)

各位大佬,在上篇博客我完成了通讯录的编写。那么今天给大家带来运用动态内存管理版本的通讯录。

在上一篇博客中我们创造了一个可以容纳100人的数组来存放联系人,但只能存放100人。那么我们使用动态内存是可以存放更多人的。

因此我们先使用malloc函数创造可存放3个人的空间,如果还要存放可以再利用realloc再添加。

首先我们要先将struct contact改进原来的data数组改为指针他指向的是存放数据的空间。然后再加入一个变量capcity,用来表示容量。

struct contact
{
    struct peop* data;
    int sz;
    int capcity;

};

其次需要改进的是我们的初始化函数,在初始化函数中我们应该直接利用malloc开辟空间。而capcity我们直接初始化为3表示刚开始可以存放3个联系人的信息。

void initializecon(struct contact* pc)
{
    pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
    pc->sz = 0;
    pc->capcity = 3;
    
}

那么在我们添加完3个联系人之后,我们就需要用到realloc函数了,realloc函数需要两个参数分别为需要改变的内存地址和改变后的空间大小。改变后的空间大小这里很容易就写成要添加的空间大小了,希望大家可以多多留意,一定是改变后的空间大小!

int chack_peop(struct contact* pc)
{
    if(pc->sz == pc->capcity)
    {
        struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
        printf("增加空间成功!!\n");
        if (ptr != NULL)
        {
            pc->data = ptr;
            pc->capcity += 2;
            printf("增容成功\n");
            return 1;
        }
        else
        {
            perror("AddContact()");
            return 0;
        }
    }
    else
        return 1;
    }

添加空间成功后就会返回1或者刚开始的空间没有占满也会返回1,如果开辟失败会返回0。

所以我们在添加联系人函数中需要改变一下,将原先的if else语句改为接受chack_peop函数值如果为零直接从函数退出,若不为零再进行联系人的信息输入。

void Addpeop(struct contact* pc)
{
        int ret = chack_peop(pc);
        if(ret == 0)
        {
            return;
        }
        
        printf("请输入联系人信息\n");
        printf("请输入性名:>");

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

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

}

当然,malloc出来的空间是需要释放的,所以需要再加入一个退出函数quit,他的作用就是将创建出来的空间释放,再将sz和capcity置零。

void quit(struct contact* pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->data = 0;
    pc->capcity = 0;
}

好了现在我们的通讯录就改进完成了。

下面是源码:

contact,h

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 6
#define MAX_PHONE_NUM 12
#define MAX_HOME 30

struct peop
{
    char name[MAX_NAME];
    char sex[MAX_SEX];
    char phone_num[MAX_PHONE_NUM];
    int age;
    char home[MAX_HOME];
};
struct contact
{
    struct peop* data;
    int sz;
    int capcity;

};
void initializecon(struct contact* pc);
void Addpeop(struct contact* pc);
void Cutpeop(struct contact* pc);
void Showpeop(const struct contact* pc);
void Findpeop(const struct contact* pc);
void Exchangepeop(struct contact* pc);
void Sortpeop(const struct contact* pc);
void quit(const struct contact* pc);

contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
//初始化
void initializecon(struct contact* pc)
{
    pc->data = (struct peop*)malloc(3 * sizeof(struct peop));
    pc->sz = 0;
    pc->capcity = 3;
    
}
int chack_peop(struct contact* pc)
{
    if(pc->sz == pc->capcity)
    {
        struct peop* ptr = (struct peop*)realloc(pc->data, (pc->capcity + 2) * sizeof(struct peop));
        printf("增加空间成功!!\n");
        if (ptr != NULL)
        {
            pc->data = ptr;
            pc->capcity += 2;
            printf("增容成功\n");
            return 1;
        }
        else
        {
            perror("AddContact()");
            return 0;
        }
    }
    else
        return 1;
    }

void Addpeop(struct contact* pc)
{
        int ret = chack_peop(pc);
        if(ret == 0)
        {
            return;
        }
        
        printf("请输入联系人信息\n");
        printf("请输入性名:>");

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

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

}
void Showpeop(const struct contact* pc)
{
    int i;
    for (i = 0; i < pc->sz; i++)
    {
        printf("%s,%s,%d,%s,%s\n", pc->data[i].name,
            pc->data[i].sex,
            pc->data[i].age,
            pc->data[i].phone_num,
            pc->data[i].home);
    }

}

static int find_peop(struct contact* pc,char name[])
{
    int i = 0;
    int ret = 0;
    for(i;i<pc->sz;i++)
    {
        if(0 == strcmp(pc->data[i].name,name))
        {
            return i;
        }

    }
    return -1;
}

void Cutpeop(struct contact* pc)
{
    char cut_name[MAX_NAME];
    printf("请输入要删除的联系人");
    scanf("%s", &cut_name);
    int ret = find_peop(pc, cut_name);
    if(ret == -1)
    {
        printf("想要删除的联系人不存在!");
    }
    else
    {
        for(int i = ret;i<pc->sz-1;i++)
        {
            pc->data[i] = pc->data[i+1];
        }
        pc->sz--;
        printf("成功删除");
    }
        
}
void Findpeop(const struct contact* pc)
{
    char name[MAX_NAME];
    printf("请输入想要查找的人的名字");
    scanf("%s", &name);
    int ret = find_peop(pc, name);
    if (ret == -1)
    {
        printf("查找的联系人不存在!");

    }
    else
    {
        
        
            printf("%s,%s,%d,%s,%s\n", pc->data[ret].name,
                pc->data[ret].sex,
                pc->data[ret].age,
                pc->data[ret].phone_num,
                pc->data[ret].home);
        
    }
}
void Exchangepeop(struct contact* pc)
{
    char ex_name[MAX_NAME];
    printf("请输入想要修改的联系人姓名");
    scanf("%s", &ex_name);
    int ret = find_peop(pc, ex_name);
    if (ret == -1)
    {
        printf("想要修改的联系人不存在!");

    }
    else
    {
        printf("请输入性名:>");

        scanf("%s", pc->data[pc->sz].name);
        printf("请输入性别:>");
        scanf("%s", pc->data[pc->sz].sex);
        printf("请输入年龄:>");
        scanf("%d", &(pc->data[pc->sz].age));
        printf("请输入电话:>");
        scanf("%s", pc->data[pc->sz].phone_num);
        printf("请输入地址:>");
        scanf("%s", pc->data[pc->sz].home);
    }
}
int Cmpname(const void* e1, const void* e2)
{
    return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}

void Sortpeop(struct contact* pc)
{
    qsort(pc->data, pc->sz, sizeof(struct peop), Cmpname);
}
void quit(struct contact* pc)
{
    free(pc->data);
    pc->data = NULL;
    pc->data = 0;
    pc->capcity = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
    printf("********************************\n");
    printf("******1.add    2.cut   *********\n");
    printf("******3.find   4.exchange*******\n");
    printf("******5.show   6.sort   ********\n");
    printf("******0.quit********************\n");
    printf("********************************\n");

    
}
int main()
{

    int a = 0;
    struct contact con;
    initializecon(&con);//初始化
    printf("请选择:\n");
    do
    {
        menu();
        scanf("%d", &a);
        switch (a)
        {
        case 1:
            Addpeop(&con);
            break;
        case 2:
            Cutpeop(&con);
            break;
        case 3:
            Findpeop(&con);
            break;
        case 4:
            Exchangepeop(&con);
            break;
        case 5:
            Showpeop(&con);
            break;
        case 6:
            Sortpeop(&con);
            break;
        case 0:
            quit(&con);
            break;
        default:
            break;
        }
    } while (a);
    return 0;
}
标签: c语言 开发语言

本文转载自: https://blog.csdn.net/m0_64334842/article/details/127035890
版权归原作者 诗仙女rg 所有, 如有侵权,请联系我们删除。

“运用动态内存管理编写通讯录(后附源码)”的评论:

还没有评论