通讯录的实现(二)动态实现

动态实现实现通讯录,就需要使用malloc和realloc等这些函数,首先我们先来介绍一下这些函数。

(1)void *malloc(unsigned  int  size);

size是需要分配的字节数。

(2)void *calloc(unsigned int num_elements,unsigned int elements_size);

num_elements是分配的元素个数,elements_size是每个元素占的字节数。

(3)void *realloc(void *p,unsigned int new_size);

new_size是修改后的字节数,p是原先的内存首地址。

由于这些函数都是在堆(heap)里开辟的空间,使用完后需要释放,所以就需要free函数。

(4)void free(void *p);

p是需要释放的空间的首地址。

前边3个函数都需要free,如果不free就可能造成内存泄漏。free释放完成后需要置为NULL。我们在使用指针之前必须要有一个原则,那就是使用之前先判断是否为空、使用之后需要置为NULL。

下来我们就来实现动态增长通讯录。

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include <stdio.h>
#include <string.h>
enum OP
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
DISPLAY,
SORT,
CLEAR
};
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25
#define MAX 1000
#define MAX_INIT 2
#define MAX_RISE 2
typedef struct PerInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact
{
PeoInfo data[MAX];
int size;
int i;
}Contact,*Pcon;
void init_contact(Pcon pcon);
void _add_contact(Pcon pcon);
void _display_contact(Pcon pcon);
void _del_contact(Pcon pcon);
void _search_contact(Pcon pcon);
void _modify_contact(Pcon pcon);
void _sort_contact(Pcon pcon);
void _clear_contact(Pcon pcon);
#endif //__CONTACT_H__

函数实现部分:

#define _CRT_SECURE_NO_WARNINGS 1
#include "Contact.h"
//
//git
//svn
//
void init_contact(Pcon pcon)
{
//memset(pcon->data, 0, MAX*sizeof(PeoInfo));
//pcon->size = 0;
pcon->data=(PerInfo *)malloc(MAX_INIT*sizeof(PerInfo));  
    if(pcon->data == NULL)  
    {  
        printf("out of menory");  
        exit(EXIT_FAILURE);  
    }  
    pcon->size=0;  
    pcon->capacity=MAX_INIT;  
}
void _add_contact(Pcon pcon)
{
/*if(pcon->size >= MAX)
{
printf("电话本满了\n");
return;
}*/
if(pcon->size >= pcon->i)  
    {  
        PerInfo *tmp=(PerInfo *)realloc(pcon->data,(pcon->i+MAX_RISE)*sizeof(PerInfo));    
        //当实际联系人个数和初始化的容量相等时用realloc增容  
        if(tmp == NULL)  
        {  
            printf("out of menory\n");  
            exit(EXIT_FAILURE);  
        }  
        else  
        {  
            pcon->data=tmp;  
            pcon->capacity+=MAX_RISE;  
        }  
printf("请输入名字:>");
scanf("%s",pcon->data[pcon->size].name);
printf("请输入年龄:>");
scanf("%d",&(pcon->data[pcon->size].age));
printf("请输入性别:>");
scanf("%s",pcon->data[pcon->size].sex);
printf("请输入电话:>");
scanf("%s",pcon->data[pcon->size].tele);
printf("请输入地址:>");
scanf("%s",pcon->data[pcon->size].addr);
pcon->size++;
printf("添加成功\n");
}
void _display_contact(Pcon pcon)
{
int i = 0;
printf("%9s\t%3s\t%4s\t%11s\t%10s\n","name","age","sex","tele","addr");
for(i = 0;i<pcon->size;i++)
{
printf("%9s\t%3d\t%4s\t%11s\t%10s\n",
pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].tele,
pcon->data[i].addr);
}
}
static int find_entry(Pcon pcon, char *name)
{
int i = 0;
for(i = 0;i<pcon->size; i++)
{
if(strcmp(pcon->data[i].name,name) == 0)
{
return i;
}
}
return -1;
}
void _del_contact(Pcon pcon)
{
int pos = 0;
int index = 0;
char name[NAME_MAX];
if(pcon->size == 0)
{
printf("电话本空\n");
return;
}
printf("请输入要删除人的名字:>");
scanf("%s",name);
pos = find_entry(pcon, name);
if(pos == -1)
{
printf("找不到要删除的人\n");
return;
}
//
for(index = pos; index < pcon->size; index++)
{
pcon->data[index] = pcon->data[index+1];
}
pcon->size--;
printf("删除成功\n");
}
void _search_contact(Pcon pcon)
{
char  name[NAME_MAX] = {0};
int pos = 0;
printf("请输入要查找人的名字:>");
scanf("%s",name);
pos = find_entry(pcon, name);
if(pos == -1)
{
printf("指定联系人不存在\n");
return;
}
else
{
printf("%9s\t%3s\t%4s\t%11s\t%10s\n","name","age","sex","tele","addr");
printf("%9s\t%3d\t%4s\t%11s\t%10s\n",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
}
}
void _modify_contact(Pcon pcon)
{
char  name[NAME_MAX] = {0};
int pos = 0;
printf("请输入要修改人的名字:>");
scanf("%s",name);
pos = find_entry(pcon, name);
if(pos == -1)
{
printf("指定联系人不存在\n");
return;
}
else
{
printf("请输入名字:>");
scanf("%s",pcon->data[pos].name);
printf("请输入年龄:>");
scanf("%d",&(pcon->data[pos].age));
printf("请输入性别:>");
scanf("%s",pcon->data[pos].sex);
printf("请输入电话:>");
scanf("%s",pcon->data[pos].tele);
printf("请输入地址:>");
scanf("%s",pcon->data[pos].addr);
}
}
//volatile
void _sort_contact(Pcon pcon)
{
int i = 0;
int j = 0;
for(i = 0;i<pcon->size-1; i++)//控制排序趟数
{
for(j = 0; j<pcon->size-1-i; j++)
{
if(strcmp(pcon->data[j].name,pcon->data[j+1].name) > 0)
{
PeoInfo tmp = {0};
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j+1];
pcon->data[j+1] = tmp;
}
}
}
}
void _clear_contact(Pcon pcon)
{
pcon->size = 0;
}


时间: 2024-11-05 22:35:00

通讯录的实现(二)动态实现的相关文章

二十二 动态代理&amp;解决网站的字符集编码问题

设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car 设计了汽车开发阅读 Interface Icar{  start  run  stop} final class GoogleCar implments ICar(){} 希望将谷歌Car接入到生态圈 装饰者设计模式 场景:二次开发的时候,无法获取源码GoogleCar,无法使用继承的情况下,要对已经存在的对象进行增强 前提:可以获取到被装饰的对象

爬虫之路: 字体文件反爬二(动态字体文件)

上一篇解决了但页面的字体反爬, 这篇记录下如何解决动态字体文件, 编码不同, 文字顺序不同的情况 源码在最后 冷静分析页面 打开一个页面, 发现字体文件地址是动态的, 这个倒是好说, 写个正则, 就可以动态匹配出来 先下载下来一个新页面的字体文件, 做一下对比, 如图 mmp, 发现编码, 字体顺序那那都不一样, 这可就过分了, 心里一万个xxx在奔腾 头脑风暴ing.gif (与伙伴对话ing...) 不着急, 还是要冷静下来, 再想想哪里还有突破点 同一个页面的字体文件地址是动态的, 但是,

老王讲自制RPC框架.(二.动态代理)

(#简介) 什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常 广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来看看如何实现一个动态代理模式 (#实现) 首先我们来定义一个接口 public interface ICar { void run(String name); } 然后我们来定义一个实现类 public class Car implements ICar { public void run(Stri

老王讲自制RPC框架.(二.动态代理)87555pefe

百姓便是一些年轻将军都无法想象那种数十万甲士酣战的波澜壮阔了.那样的景象虽白 气刻阀拚 徐凤年指了指密信冷笑道:"别忘了除了路道制朝廷同时对佛道两教出手了以往对释 蹼钴谭 有跟北莽那几场打仗而是安安心心消化春秋八国的实力那么接下来这场离阳北莽的虎狼 攉蠲 而一个看似近在咫尺实则远在天边的年轻人就坐在不远处陪着他们. 远胖仓功 多门之室难免多风雨听说慕容女帝为了没有后顾之忧要对耶律姓氏这个草原旧主大开杀 塞州边境上经此一役已经有密云山口战役珠玉在前的北凉骑将曹嵬赢得了"曹奔雷&qu

Java Reflection(十二):动态类加载与重载

转载自并发编程网 – ifeve.com 内容索引类加载器类加载体系类加载动态类加载动态类重载自定义类重载类加载/重载示例Java允许你在运行期动态加载和重载类,但是这个功能并没有像人们希望的那么简单直接.这篇文章将阐述在Java中如何加载以及重载类.你可能会质疑为什么Java动态类加载特性是Java反射机制的一部分而不是Java核心平台的一部分.不管怎样,这篇文章被放到了Java反射系列里面而且也没有更好的系列来包含它了. 类加载器 所有Java应用中的类都是被java.lang.ClassL

仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源代码)

转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就仅仅剩下调色板功能没有做了.我本以为会非常easy.可是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1aG9uZ3NodQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > waterm

动态加载JS脚本

一. document.write() <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Dynamic load JS</title>    <script>        function init() {            document.write('<script 

Ubuntu下用glade和GTK+开发C语言界面程序(二)——gcc常用命令介绍

谈到linux,没人不懂gcc,当然,学过C语言的都该知道gcc,毕竟所有的类C编译器基本都有gcc来构成. GCC的意思随着时间的发展也从最初的GNU C Compiler发展到GNU Compiler Collection,也就是GNU编译器的统称集合.GCC对与操作系统与硬件的的支持,可以说是:无处不在. 一.gcc编译过程 GCC的编译过程要分为四个阶段来进行:预处理阶段,编译阶段,汇编阶段,以及链接阶段. 1.预处理阶段(也称预编译阶段) gcc -E helloworld.c -o

JS动态引入js,CSS——动态创建script/link/style标签

一.动态创建link方式 我们可以使用link的方式.如下代码所示. function addCssByLink(url){ var doc=document; var link=doc.createElement("link"); link.setAttribute("rel", "stylesheet"); link.setAttribute("type", "text/css"); link.setA

C#程序实现动态调用DLL的研究(转)

摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动