今天看代码,发现系统内有一段index维护的代码,看了很久才反应过来! 是用数组来实现设备上下文index链表的管理。说道链表理所当然就想到动态内存的实现方式,静态内存实现往往要移动数据块,而要维护的数据一旦很多,效率就会大打折扣。在嵌入式应用中尤其如此!
代码使用数组实现链表,关键地方只有一点,就是用使用索引到的数据node[index]存储下一个数据标示的索引位置,从而不需要数据移动。实现起来也相当的简单,只是看你能否想的到。
代码是用c写的,以下是精简之后的实现,在vc6.0和tornado2.2编译通过!
h文件:
#ifndef _INDEX_LIST_H_H_
#define
_INDEX_LIST_H_H_

#define
MAX_INDEX 20
#define
INVALID_INDEX -1
typedef
struct
{
int head;
int tail;
int node[MAX_INDEX];
int count;
}
IndexLIST_;
void
init();
int
GetIndex();
void
list();
void
AddIndex(
int
id);
extern
IndexLIST_ gindexList;
#endif
c文件:
#include
"
indexList.h
"
IndexLIST_ gindexList;
void
init()
{
int i;
gindexList.head = INVALID_INDEX;
gindexList.tail = INVALID_INDEX;
gindexList.count = 0;
for(i =0 ;i < MAX_INDEX;i++ )
{
gindexList.node[i] = INVALID_INDEX;
}
}
int
GetIndex()
{
int res;
if(gindexList.count <= 0) return -1;
res = gindexList.head;
gindexList.count--;
if(gindexList.count <= 0){
gindexList.head = INVALID_INDEX;
gindexList.tail = INVALID_INDEX;
}
else
gindexList.head = gindexList.node[res];
gindexList.node[res] = INVALID_INDEX;
return res;
}
void
AddIndex(
int
idx)
{
if(idx >= MAX_INDEX)
return;
if(gindexList.count <= 0){
gindexList.head = idx;
gindexList.tail = idx;
gindexList.count = 1;
return;
}
gindexList.node[gindexList.tail] = idx;
gindexList.tail = idx;
gindexList.count++;
}
void
list()
{
int i;
printf(" head : %d ",gindexList.head);
printf(" tail : %d ",gindexList.tail);
printf(" count : %d ",gindexList.count);
for(i =0; i < MAX_INDEX ;i++)
printf(" node[%d] = %d ",i,gindexList.node[i]);
}
代码使用数组实现链表,关键地方只有一点,就是用使用索引到的数据node[index]存储下一个数据标示的索引位置,从而不需要数据移动。实现起来也相当的简单,只是看你能否想的到。
代码是用c写的,以下是精简之后的实现,在vc6.0和tornado2.2编译通过!
h文件:



































































