#include <stdio.h>typedef struct _BLOCK   //定义一个结构体,用于记录所有可用区块的大小及位置
{unsigned int size;struct _BLOCK xdata* pLink;}BLOCK,xdata* PBLOCK;PBLOCK xdata pHead = NULL;//
// Initialize
//    Init the Block
//
// Formal Parameters:
//    memory = the address of memory
//    len = the size of the memory
//
// Global Input Parameters:
//    None
//
// Global Output Parameters:
//    None
//
// Return Value:
//    None
//
void
MemInitializePool(void* memory,unsigned len)
{pHead = (PBLOCK)memory;   //头结点指向自定义用于分配内存的空间pHead->pLink = NULL;pHead->size = len;
}//
// MyMalloc
//    malloc the space
//
// Formal Parameters:
//    needSize = size of the Block we need
//
// Global Input Parameters:
//    None
//
// Global Output Parameters:
//    None
//
// Return Value:
//    result = the location of the Block
//
void*
MemAlloc(unsigned int needSize)
{PBLOCK pPrior,pNext,pNewNode;void* result;pNext  = pHead;pPrior = pHead;do{if ( pNext->size >= needSize )     //寻找到合适大小的空白区块{pNext->size    = pNext->size - needSize - sizeof(BLOCK);  //分配空间出去pNewNode       = (PBLOCK)((void*)pNext + pNext->size + sizeof(BLOCK));//得到存储信息的空间的地址pNewNode->size = needSize; //可使用的空间大小if(pNext->size < sizeof(BLOCK)){pPrior->pLink = pNext->pLink;}result = (void*)(++pNewNode);//返回分配出去的空间地址return result;}pPrior = pNext;pNext  = pNext->pLink;}while ( pNext != NULL );if(pNext == NULL)                //over{return NULL;}
}//
// merge
//    merge the Block we needn't use
//
// Formal Parameters:
//    pPrior = the node of the Link
//    pNext = the pLink node of the Link
//
// Global Input Parameters:
//    None
//
// Global Output Parameters:
//    None
//
// Return Value:
//    None
//
void
Merge(PBLOCK pPrior,PBLOCK pNext)
{if ( pNext == (PBLOCK)((void*)pPrior + pPrior->size + sizeof(PBLOCK)) ) //如果两个空白区块连续,合并空间{pPrior->size += (pNext->size) + sizeof(BLOCK);pPrior->pLink = pNext->pLink;}
}//
// MemFree
//    free the Block we used
//
// Formal Parameters:
//    pBlock = the location of the Block we need to free
//
// Global Input Parameters:
//    None
//
// Global Output Parameters:
//    None
//
// Return Value:
//    None
//
void
MemFree(PBLOCK pBlock)
{PBLOCK pFree  = (--pBlock);PBLOCK pNext  = pHead;PBLOCK pPrior = pHead;do{pPrior = pNext;pNext  = pNext->pLink;if( pPrior <= pFree && pNext >= pFree)  //找到所需要释放的区块的位置{pFree->pLink = pNext;pPrior->pLink = pFree;break;}}while ( pNext != NULL );//合并空白区块Merge(pPrior,pFree);Merge(pFree,pNext);
}

C语言编写可以实现malloc() free()功能的函数(空间/时间复杂度低)相关推荐

  1. 可以用c语言程序制造病毒吗,此人用C语言编写了一个简单但功能强大的“病毒”!...

    我们都讨厌病毒. 俗话说: "彼此认识,彼此认识,你只能赢得一百场战斗". 为了避免病毒的危害,有必要研究病毒只是如何传播的. 当我在互联网上看到一个帖子时,我称其为编程研究. 我 ...

  2. dll文件用什么语言编写_为什么Unix不用功能更强大的C++而是用C编写

    有人总会说C++不是要比C的作用大很多,功能也更多.那为什么Unix不用功能更强大的C++而是用C编写?关于Unix为什么用C而不是C ++编写的显而易见的答案是C ++是在C之后诞生的.另一个原因是 ...

  3. C语言-编写求两个双精度数之和的函数

    double add(double a,double b) {double s;s=a+b;return s; }

  4. m被3整除的c语言表达式,C语言编写函数fun,实现从整数m到n,能被3整除

    1.用c语言编写程序,实现输入10个数,分别求其最大值.最小值及平均数,要求用函数实现. #includevoidfun(doublea[10],intn){inti;doubleave,max,mi ...

  5. c语言 编写一个求圆面积的函数area,该函数有一个形式参数r,c语言编写一个求圆面积的函数area,有形参,类型为float...

    用c语言编写函数,求圆的周长和面积,用函数.急求. #include#definePI3.1415926doublearea(doubler){returnPI*r*r;}doubleperimete ...

  6. C语言试题三十二之编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数)。

    1. 题目 请编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数). 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复 ...

  7. 24.请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。

    24.请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数). 例如,若输入字符串"-1234",则函数把它转换为整数值- ...

  8. 一种基于扩展反电动势的永磁同步电机无位置控制算法,全部C语言 编写,含有矢量控制大部分功能(弱磁,解耦,过调制,死区补偿等)

    一种基于扩展反电动势的永磁同步电机无位置控制算法,全部C语言 编写,含有矢量控制大部分功能(弱磁,解耦,过调制,死区补偿等) 为了方便学习和工作,该产品结合S-Function进行仿真,且属于量产产品 ...

  9. C语言编写简单实现淘宝购物功能 答辩课题实用

    C语言编写简单实现淘宝购物功能,并能够实现 登陆账号验证 添加购物车 l付密码 错误上限 支付成功 等.. #include <stdio.h> #include <string.h ...

最新文章

  1. js及jQuery实现checkbox的全选、反选和全不选
  2. Eclipse设置背景色、字体大小
  3. PAL算法原理及代码实现
  4. gzip、bzip2和tar
  5. STL9-vector容器
  6. 和为 k 的组合(51Nod-1268)
  7. Java主要处理哪些类型的异常_Java技术高效处理异常有哪些呢?
  8. Python+django网页设计入门(18):自定义模板过滤器
  9. 48.自定义邮件模板
  10. python架构师工作职责_软件架构师工作的职责
  11. 高数复习: 多元函数微分学及其应用
  12. netsetman使用教程_网络管理软件NetSetMan安装教程
  13. 基于eNSP的千人中型校园企业网络设计与规划(可以自己按步骤实现)
  14. 从faces_glintasia的.rec数据集转换为jpg图片
  15. vim 使用体会(1) Normal模式 当你启动Vim后,Vim会处于Normal模式。在Vim的Normal模式下,所有的键就是功能键,下面附上Vim快捷键分布图。 (2) Insert模
  16. 几种常见窗函数的特性
  17. 屏保问题(即背光灯的关闭)
  18. 【SQL】LATERAL VIEW 的用法
  19. Vue | Vue.js 全家桶 - Vue-Router详解
  20. iPad国内降价!在内地开启教育优惠

热门文章

  1. 初学者学Java常遇到的问题,我都给你回答了!
  2. 计算机体系结构讲解,计算机体系结构 | x86 架构的讲解
  3. vs2015 - vs2010
  4. word文档生成目录的方法,word生成目录之后怎么修改页码
  5. python-体质指数BMI计算
  6. 【机器学习】简单理解精确度(precision)和准确率(accuracy)的区别
  7. 当面试官问Webpack的时候他想知道什么
  8. bloomFilter和哈希函数murmur3
  9. 微信api接入验证的坑!!!
  10. Python Django,模型,模型管理器类(models.Manager)(与数据库交互的接口),自定义模型管理器类