通讯录2.0(动态实现)

实现动态开辟内存的通讯录

在实现动态开辟内存时首先得了解动态内存分配

1.malloc和free

函数原型

   void  *malloc( size_t size );
   void  freevoid *pointer );

   malloc分配一块连续的内存,参数以字节数为单位,如果空间申请失败,则函数返回NULL,free常和malloc结合使用并成对出现。

2.realloc

  void  realloc( void  *ptr, size_t size )//扩容
  void *calloc( size_t num_elements,  size_t element_size )//内存分配,并在分配前将空间初始化为0;

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__
#define __CONTACT_H__

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


#define INIT_MAX 2 
#define RISE_MAX 2

typedef struct PeInfo
{
    char name[20];
    int age;
    char sex[10];
    char tele[15];
    char addr[30];
}PeInfo;

typedef struct Contact
{ 
    PeInfo *contact;
    int capacity;
    int sz;
}Contact, *pContact;

void init_con(pContact p);//初始化通讯录
void Add_con(pContact p);// 添加联系人信息
void Dele_con(pContact p);//删除指定联系人信息
void Find_con(pContact p);//查找指定联系人信息
void Revise_con(pContact p);//修改指定联系人信息
void Display_con(pContact p);//显示所有联系人信息
void Empty_con(pContact p);//清空所有联系人 
void Sort_con(pContact p);//以名字排序所有联系人
void Exit_con(pContact p);//结束程序

void adj(pContact p, int i);//写入数据 m
void Inc_capa(pContact p);//扩容函数

#endif //__CONTACT_H__

contact.c

#include"contact.h"

void init_con(pContact p)//初始化通讯录
{
    p->contact =(PeInfo*)malloc(INIT_MAX*sizeof(PeInfo));//开辟空间
    if(p->contact == NULL)//错误报告
    {
        perror("out of memory\n");
        exit(EXIT_FAILURE);
    }
    p->capacity = INIT_MAX;    //初始化
    p->sz = 0;    //初始化
    //memset(p->contact, 0, INIT_MAX);
}

void Inc_capa(pContact p)//扩容函数
{
    PeInfo *tmp = (PeInfo*)realloc(p->contact, (p->capacity + RISE_MAX)*sizeof(PeInfo));    //当内存不够时,扩充大小为(p->capacity + RISE_MAX)*sizeof(PeInfo))个字节的内存   
    assert(p);
    if(tmp == NULL)
    {
        perror("out of memory\n");
        exit(EXIT_FAILURE);
    }
    p->capacity += RISE_MAX;
    p->contact=tmp;
    printf("增容成功\n");
}
void adj(pContact p, int i)//写入数据
{
    printf("请输入姓名:\n");
    scanf("%s", p->contact[i].name);
    printf("请输入年龄:\n");
    scanf("%d", &(p->contact[i].age));
    printf("请输入性别:\n");
    scanf("%s", p->contact[i].sex);
    printf("请输入电话:\n");
    scanf("%s", p->contact[i].tele);
    printf("请输入住址:\n");
    scanf("%s", p->contact[i].addr);
}


void Add_con(pContact p)// 添加联系人信息
{
    if(p->sz == p->capacity)
    {
        Inc_capa(p);
    }
    adj(p, p->sz);//写入数据
    p->sz++;
}

void Dele_con(pContact p)//删除指定联系人信息
{
    int i=0;
    int j=0;
    char ch=0;
    char name[20]={0};
    if(p->sz==0)
    {
        printf("通讯录为空\n");
        return;
    }
    while(1)
    {
        printf("输入删除对象姓名:");
        scanf("%s", name);
        for(i=0; i<p->sz; i++)
        {
            if(strcmp(name, p->contact[i].name)==0)
                break;
        }
        if(i==p->sz)
        {
            printf("不存在\n");
            return;
        }
        else
        {
            for(j=i; j<(p->sz-1); j++)
            {
                p->contact[j]=p->contact[j+1];
            }
            printf("删除成功\n");
            p->sz--;
            return;
        }
    }
}

void Find_con(pContact p)//查找指定联系人信息
{
    int i=0;
    char name[20]={0};
    printf("所查找人姓名:");
    scanf("%s", name);
    for(i=0; i<p->sz; i++)
    {
        if(strcmp(name, p->contact[i].name)==0)
        {
            printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
            printf("%15s%10d%10s%15s%20s\n",p->contact[i].name, p->contact[i].age, p->contact[i].sex,
                p->contact[i].tele, p->contact[i].addr);
            return;
        }
    }
    if(i==p->sz)
        printf("不存在\n");
    return;
}

void Revise_con(pContact p)//修改指定联系人信息
{
    int i=0;
    char name[20]={0};
    if(p->sz==0)
    {
        printf("通讯录为空");
        return;
    }
    printf("输入修改对象姓名:");
    scanf("%s", name);
    for(i=0; i<p->sz; i++)
    {
        if(strcmp(name, p->contact[i].name)==0)
        {
            printf("要修改人信息:\n");
            printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
            printf("%15s%10d%10s%15s%20s\n",p->contact[i].name, 
                p->contact[i].age, p->contact[i].sex,
                p->contact[i].tele, p->contact[i].addr);
            printf("修改为:\n");
            adj(p, i);
            printf("修改完成\n");
            return;
        }
    }
    if(i==p->sz)
        printf("不存在\n");
    return;
}

void Display_con(pContact p)//显示所有联系人信息
{
    int i=0;
    printf("%15s%10s%10s%15s%20s\n","name","age","sex","tele","addr");
    if(p->sz==0)
    {
        printf("空\n ");
        return ;
    }
    for(i=0; i<p->sz; i++)
    {
        printf("%15s%10d%10s%15s%20s\n",p->contact[i].name, 
            p->contact[i].age,  p->contact[i].sex,
            p->contact[i].tele, p->contact[i].addr);
    }
}

void Empty_con(pContact p)//清空所有联系人 
{
    p->sz=0;
    free(p);
}

void Sort_con(pContact p)//按字母排序所有联系人
{
    int i = 0;
    int j = 0;
    for(i=0;i<p->sz-1;i++)
    {
        for(j=0;j<p->sz-1-i;j++)
        {
            if(strcmp(p->contact[j].name,p->contact[j+1].name)>0)
            {
                PeInfo temp;
                temp = p->contact[j];
                p->contact[j] = p->contact[j+1];
                p->contact[j+1] = temp;
            }
        }
    }
    printf("排序完成\n");
    return;
}
void Exit_con(pContact p)//结束程序
{
    free(p->contact);
    p->contact = NULL;
    exit(0);
}

test.c

#include"contact.h"

void menu()//菜单打印
{
    printf("**************************\n");
    printf("*****   通  讯  录   *****\n");
    printf("**************************\n");
    printf("***** 1.添加  2.删除 *****\n");
    printf("***** 3.查找  4.修改 *****\n");
    printf("***** 5.列表  6.清空 *****\n");
    printf("***** 7.排序  8.退出 *****\n");
    printf("**************************\n");
}

int main()
{
    Contact con;
    int input = 0;
    init_con(&con);
    do{
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            Add_con(&con);
            break;
        case 2:
            Dele_con(&con);
            break;
        case 3:
            Find_con(&con);
            break;
        case 4:
            Revise_con(&con);
            break;
        case 5:
            Display_con(&con);
            break;
        case 6:
            Empty_con(&con);
            break;
        case 7:
            Sort_con(&con);
            break;
        case 8:
            Exit_con(&con);
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    }while(1);
    return 0;
}

代码实现效果如和1.0无差别,没有新的功能的增加。
若有不当之处,恳请留言指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值