栈预先存储节点,队列的malloc/free均有栈模拟,从而保证不频繁的开辟/是否节点内存。

#include "com_is_buf.h"
#include "com_is_filter.h"
#include "assert.h" FileList_t* pgFileList = NULL;
FileList_t FileBuffer[IS_MAX_FILE_NUM];
static MS_U32* gs_pFileBufferSpace[IS_MAX_FILE_NUM];
Stack_t stack_file; #define ASSERT(x) assert(x) void create_stack(MS_U32 **ppStackSpace, MS_U32 nSize,
Stack_t* pStack)
{
ASSERT(ppStackSpace != NULL && pStack != NULL); pStack->m_pBuf = (void**)ppStackSpace; pStack->m_nBottom = ;
pStack->m_nTop = nSize-;
pStack->m_nInterator = ;
pStack->m_nSize = nSize;
} /**
* @brief pop stack
* @param pStack : stack to pop
* @return NULL
*/
void* pop_stack(Stack_t * pStack )
{
MS_U32 i = ;
void *pResult = NULL; ASSERT( pStack != NULL );
if( pStack->m_nInterator > )
{
i = (--pStack->m_nInterator) + pStack->m_nBottom; pResult = (void*)(pStack->m_pBuf[i]); return pResult;
} // no more stack to alloc
return NULL;
} /**
* @brief push data into stack
* @param pStack : stack to push
* @param pBuf : the pointer of data
* @return NULL
*/
void push_stack(Stack_t * pStack, void* pBuf )
{
MS_U32 i = ; ASSERT(pStack != NULL && pBuf != NULL); if( pStack->m_nInterator < pStack->m_nSize )
{
i = (pStack->m_nInterator++)+pStack->m_nBottom; pStack->m_pBuf[i] = pBuf;
}
} MS_U32 com_stack_file_initialize( void )
{
MS_U32 i = ;
MS_U32 err = ; create_stack(gs_pFileBufferSpace, IS_MAX_FILE_NUM, &stack_file); for( i=; i<IS_MAX_FILE_NUM; i++ )
{
push_stack( &stack_file, (void*)&FileBuffer[i] );
}
return err;
} FileList_t* com_is_malloc_file(void)
{
FileList_t* pFileList = NULL;
pFileList = (FileList_t*)pop_stack( &stack_file );
if( pFileList!=NULL )
{
memset( pFileList, , sizeof(FileList_t) );
} return pFileList;
} MS_U32 com_is_free_file( FileList_t *buf )
{
memset(buf,,sizeof(FileList_t));
push_stack( &stack_file, (void*) buf); FileList_t *pFileList = pgFileList;
FileList_t *pPreFileList = pgFileList; if(pgFileList == buf)
{
pgFileList = NULL;
buf = NULL;
return ;
} if( NULL != pFileList )
{
while( pFileList->next != NULL )
{
pPreFileList = pFileList;
pFileList= pFileList->next;
} if(pFileList == buf)
{
buf = NULL;
pPreFileList->next = NULL;
}
}
return ;
} void com_is_add_file( FileList_t** pFileOut)
{
FileList_t *pFileList = pgFileList;
FileList_t *pFileNew = NULL; pFileNew = com_is_malloc_file();
if(pFileNew == NULL)
{
return ;
}
pFileList = pgFileList;
if( NULL != pFileList )
{
while( pFileList->next != NULL )
{
pFileList= pFileList->next;
} pFileList->next = pFileNew;
pFileNew->next = NULL;
}
else
{
pFileNew->next = NULL;
pgFileList = pFileNew;
}
*pFileOut = pFileNew;
return ; } void com_is_destroy_filelist(void )
{
FileList_t *pFile = pgFileList;
FileList_t *pFile_temp = NULL; for(pFile = pgFileList;pFile != NULL; )
{
//com_is_free_file(pFile); pFile_temp = pFile->next;
memset(pFile,,sizeof(FileList_t));
push_stack( &stack_file, (void*) pFile);
pFile = pFile_temp;
}
pgFileList = NULL;
} FileState_t com_is_update_file_type(FileList_t *pFile)
{
MS_U16 len = ;
FileState_t state = FILE_OK;
len = strlen((char*)pFile->m_pchFileName);
if( == pFile->m_pchFileName[len-]//x
&& == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-])//l
{
pFile->m_FileType = FILE_XML;
}
else if( == pFile->m_pchFileName[len-]//b
&& == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-])//p
{
pFile->m_FileType = FILE_BMP;
}
else if( == pFile->m_pchFileName[len-]//m
&& == pFile->m_pchFileName[len-]//p
&& == pFile->m_pchFileName[len-])//g
{
pFile->m_FileType = FILE_MPG;
}
else
{
pFile->m_FileType = FILE_ERR;
state = FILE_ERROR;
}
return state;
} FileList_t* com_is_get_file_list(void)
{
return pgFileList;
}
#ifndef __COM_IS_BUF_H__
#define __COM_IS_BUF_H__
#include "MsCommon.h" #define IS_MAX_FILE_NAME (50)
#define IS_MAX_SECTION_NUM (700) // TODO: 2.5MB->640 Section
#define IS_MAX_SECTION_LEN (4100) // #define ADDR_ALIGN(data) ((((data) & 0x3) == 0)? (data) : ((data) + 0x4 - ((data) & 0x3))) typedef struct Stack_s
{
MS_U32 m_nBottom;
MS_U32 m_nTop;
MS_S32 m_nInterator;
MS_U32 m_nSize;
void** m_pBuf;
}Stack_t; typedef enum FileType_e
{
FILE_ALL,
FILE_BMP,
FILE_XML,
FILE_MPG,
FILE_ERR,
}FileType_t; typedef enum FileState_e
{
FILE_NOT_EXIST = ,
FILE_EXIST,
FILE_ERROR,
FILE_OK
}FileState_t; typedef struct FileList_s
{
FileType_t m_FileType;
MS_U16 m_FileId;
MS_U8 m_version;
MS_U8 m_chFileNameLen;
MS_S8 m_pchFileName[IS_MAX_FILE_NAME +];
MS_U8 m_nLastSection;
MS_U32 m_nFileAddr;
MS_U32 m_nFileLength;
MS_U32 m_nSubFileAddr[];
MS_U32 m_nSubFileLength[]; struct FileList_s *next;
}FileList_t; MS_U32 com_stack_file_initialize( void );
MS_U32 com_stack_file_free(void);
FileList_t* com_is_malloc_file(void);
MS_U32 com_is_free_file( FileList_t *buf );
void com_is_add_file( FileList_t** pFileOut);
void com_is_destroy_filelist(void );
FileState_t com_is_update_file_type(FileList_t *pFile); FileList_t* com_is_get_file_list(void); #endif

C 栈实现队列节点的管理的更多相关文章

  1. 什么是“堆”,"栈","堆栈","队列",它们的区别?

    堆:什么是堆?又该怎么理解呢? ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树. 将根节点最大的堆叫做最大堆 ...

  2. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  3. 堆”,"栈","堆栈","队列"以及它们的区别

    如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到, ...

  4. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  5. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  6. 剑指offter-面试题7.用两个栈实现队列

    题目.用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead 分别完成在对尾插入节点和在队头删除节点. 该队列类模板如下: template <typ ...

  7. 【Java实现】栈和队列就是这么简单

    一.前言 上一篇已经讲过了链表[Java实现单向链表]了,它跟数组都是线性结构的基础,本文主要讲解线性结构的应用:栈和队列 如果写错的地方希望大家能够多多体谅并指正哦,如果有更好的理解的方式也希望能够 ...

  8. 剑指offer-面试题7:俩个栈实现队列(c)

  9. 课堂笔记及知识点----栈和队列(2018/10/24(am))

    栈: Stack<int>  xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法:   .pop---->出栈,弹栈     ...

随机推荐

  1. caffe arm

    依赖库: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-de ...

  2. 图论++【洛谷p1744】特价采购商品&&【一本通1342】最短路径问题

    (虽然题面不是很一样,但是其实是一个题qwq) [传送门] 算法标签: 利用Floyed的o(n3)算法: (讲白了就是暴算qwq) 从任意一条单边路径开始.所有两点之间的距离是边的权,或者无穷大,如 ...

  3. HTTP安全通信:Https和SSL

    1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HT ...

  4. python学习(八)

  5. MapServer Configuring with IIS

    MapServer Configuring with IIS 一.前言 1.MapServer简介 MapServer是一个用C语言编写的开源地理数据呈现引擎.除了浏览地理信息系统数据之外,MapSe ...

  6. 认识jmeter

    1.jmeter是什么:Apache Jmeter是Apache组织开发的基于java的压力测试工具. Jmeter可用于对服务器.网络或对象模拟巨大的负载,来自不同压力类别下测试他们的强度和分析整体 ...

  7. Java的基本数据类型大小及其包装类

     Java的基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义 ...

  8. Js 基本类型和引用类型

    一个变量可以存放两种类型的值,基本类型的值(primitive values)和引用类型的值(reference values). ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值. ...

  9. Oracle 导出的表不全,以及数据库版本不同导入报错

    公司有两个环境下的数据库,版本不同,一个是11g r2,另一个是10g r2 首先在11g r2下用exp导出数据库备份文件,发现部分表缺失. 原来这部分表是空的,11G中新特性,当表无数据时,不分配 ...

  10. 1.5 pycharm使用

    1.5 pycharm使用 前言    在写脚本之前,先要找个顺手的写脚本工具.python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里就不一一 ...