在开发基于MTK平台上的游戏时,由于MTK不支持动态申请内存的做法,如果按以前的做法,只能用数组来表示游戏中的数据,以及用结构体来组成一些数据类型,这样对游戏的写法方面造成很多限制;由于对数组的操作只能通过数组下标来操作,比较抽象,按个人目前的能力,在使用数组来表示链表等经典数据结构上会很麻烦,所以参考别人的做法,自己先申请一个大数组做内存池,从大数组里面申请结点用来做链表,这样我们就可以用链表等结构。我们直接看代码
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
//链表结构
typedef struct __link
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
struct __link* pNext;//双向链表结构
struct __link* pPrev;
int LinkFlag;//标识
Data *pData;//数据
}Link,*pLink;
//链表节点空间
Link link[100];
//从链表数组里申请一个链表节点
pLink_Alloc(pLink Link)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int i;
for (i = 0; i < 100 ; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (Link[i].LinkFlag == 0)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
BulletLink[i].BulletLinkFlag = 1;
return &Link[i];
}
}
return NULL;
}
//从链表数组里释放一个链表节点
void Link_Free(pLink pNode)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
pNode ->tLinkFlag = 0;
}
//创建一个链表
void Create_Link(pLink* LinkHead,pLink* LinkTail,pLink link)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int i;
*LinkHead= NULL;//初始化头尾节点
*LinkTail = NULL;
for (i = 0;i<100;i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ //初始化链表
Link[i].LinkFlag = 0;
}
}
//往链表里添加节点
void Link_Add(pLink* LinkHead,pLink* LinkTail,pLink Link)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
pLink pLinkNode;
pLinkNode = Link_Alloc(Link);
if (pLinkNode != NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Link_Insert(LinkHead,LinkTail,pLinkNode);
}
}
//插入一个节点
void Link_Insert(pLink* LinkHead,pLink* LinkTail,pLink pNode)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
pLink tmpNext;
pLink tmpPrev;
tmpPrev = *LinkTail;
if (*LinkTail == NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ /**//* new node is to be first in list */
tmpNext = *LinkHead;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
*LinkHead= pNode; /**//*1.设置链表结构体的头指针*/
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ /**//* make prev node point fwd to new */
tmpNext = (*LinkTail)->pNext;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
(*LinkTail)->pNext = pNode; /**//*2.将节点添加到添加处节点的后面*/
}
if (tmpNext == NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
*LinkTail = pNode; /**//*3.设置链表结构体的尾指针*/
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
tmpNext->pPrev = pNode; /**//*4.将节点添加到添加处节点的后面节点的前面*/
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//* set pointers in new node */
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
pNode->pNext = tmpNext; /**//*5.设置节点的后向指针*/
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
pNode->pPrev = tmpPrev; /**//*6.设置节点的前向指针*/
}
//删除一个节点
void Link_Remove(pLink* LinkHead,pLink* LinkTail,pLink pNode)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
if ( pNode == NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return;
}
Link_Free(pNode);
if (pNode ->pPrev == NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
*LinkHead = pNode ->pNext; /**//*1.改变链表的头指针*/
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
pNode ->pPrev ->pNext = pNode ->pNext; /**//*2.改变待删除节点的前向节点的后向指针*/
}
if (pNode ->enemy_pNext == NULL)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
*LinkTail = pNode ->pPrev; /**//*3.改变链表的尾指针*/
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
pNode ->pNext ->pPrev = pNode ->pPrev; /**//*4.改变待删除节点的后向节点的前向指针*/
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
在代码中,先向MTK预先申请了一个大数组,这个数组相当于PC中的内存,我们可以再这上面进行一些对链表的操作,链表在使用的时候,必须先定义链表的头指针与尾指针,定义他们为全局变量,用来标识链表的唯一
链表结构参考了VXWORKS嵌入式系统的双向链表结构,相关文章在下面:
http://www.cnblogs.com/lotusswan/archive/2008/10/14/1310387.html