自己写的共享内存链表CAlgShareList

本文档介绍了CAlgShareList,一个C语言实现的共享内存链表。它包括了链表的基本操作,如插入、删除、查找节点。此外,还提供了遍历和枚举节点的功能,支持头尾节点的添加和移除。代码中使用了宏定义和内联函数以提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CAlgShareList.h

#ifndef _C_ALG_SHARE_LIST_H_
#define _C_ALG_SHARE_LIST_H_
#include <string.h>
#include <stdlib.h>
#include "CAlgCommon.h"

#ifdef	__cplusplus
extern "C" {
#endif

#define ALG_SHARE_LIST_INVALID_POS (-1)

typedef struct _CAlgShareNode{
	void * curr_data; /* node data pointer */

	int prev; /* previous link No. */
	int next; /* next link No. */
	int curr; /* current link No. */
}CAlgShareNode;

typedef struct {
	int head; /* list head */
	int tail; /* list tail */

	int elem_count;         /* list element counts */
	unsigned int elem_size; /* list size of each element */
}CAlgShareList;


typedef CAlgShareNode* (*AlgShareList_RealNode_F)(int);
typedef struct {
	/* position to real node pointer convert function */
	AlgShareList_RealNode_F real_node_f;
	/* compare function. NOTE: pass position (int) to (Node*) */
	Alg_Cmp_F cmp_f;
}CAlgShareList_F;


/**
  * l->head, l->next is int index, may means postion
  */
static inline void CAlgShareList_ReSet(CAlgShareList* l, unsigned int elem_size)
{
	l->head = l->tail = ALG_SHARE_LIST_INVALID_POS;
	l->elem_count = 0;
	l->elem_size = elem_size;
}

/**
  *            insert n to list after prev
  *@prev       previous position, link n to real_node(n)->next, 
  *            if real_node(n) return NULL , means add to head
  *@n          make sure real_node(n) return valid pointer !!!
  *@real_node  position to node position converter, convert prev and n to CAlgShareNode*
  */
//static inline void CAlgShareList_Insert(CAlgShareList* l, int prev, int n, AlgShareList_RealNode_F real_node)
//{
//	CAlgShareNode*p_prev, *p_n;
//	p_prev = real_node(prev);
//	p_n = real_node(n);
//	if(p_prev)
//	{
//		p_n->prev = prev;
//		p_n->next = p_prev->next;
//		p_prev->next = n;
//	}
//	else
//	{
//		p_n->prev = ALG_SHARE_LIST_INVALID_POS;
//		p_n->next = l->head;
//		l->head = n;
//	}
//
//	p_n->curr = n;
//	p_prev = real_node(p_n->next);
//	if(p_prev)
//		p_prev->prev = n;
//
//	if(prev == l->tail)
//		l->tail = n;
//
//	l->elem_count ++;
//}

/**
  *     add n to list head
  *@f   function pointer methods
  *@l   the share list which n should add to
  *@n   make sure real_node_f(n) return valid pointer !!!
  *@ret return the tail position
  */
//static inline int CAlgShareList_AddHead(CAlgShareList* l, int n, AlgShareList_RealNode_F real_node_f)
//{
//	CAlgShareList_Insert(l, ALG_SHARE_LIST_INVALID_POS, n, real_node_f);
//	return l->head;
//}

/**
  *     add n to list tail
  *@f   real node function methods
  *@l   the share list which n should add to
  *@n   make sure real_node_f(n) return valid pointer
  *@ret return the tail position
  */
//static inline int CAlgShareList_AddTail(CAlgShareList* l, int n, AlgShareList_RealNode_F real_node_f)
//{
//	CAlgShareList_Insert(l, l->tail, n, real_node_f);
//	return l->tail;
//}

/**
  *    find the node with data
  *@f     function pointer methods, use f.cmp_f() to compare
  *@l     the share list which n should add to
  *@data  make sure real_node_f(n) return valid pointer
  *@ret   return node position if found, else return ALG_SHARE_LIST_INVALID_POS
  */
static inline int CAlgShareList_Find(CAlgShareList_F f, CAlgShareList* l, void* data)
{
	CAlgShareNode* tmp = f.real_node_f(l->head);
	int rc = l->head;
	while(tmp)
	{
		if(0 == f.cmp_f(tmp->curr_data, data, l->elem_size))
			return rc;

		rc = tmp->next;
		tmp = f.real_node_f(tmp->next);
	}

	return ALG_SHARE_LIST_INVALID_POS;
}

/**
  *    remove node n from list
  *@l  the share list which n should add to
  *@n  make sure real_node_f(n) return valid pointer
  *@f  function pointer methods
  */
static inline int CAlgShareList_RemoveNode(CAlgShareList* l, int n, AlgShareList_RealNode_F real_node)
{
	CAlgShareNode* curr = real_node(n);
	CAlgShareNode* tmp;
	if( curr == NULL) return -1;
	if(n == l->head)
		l->head = curr->next;
	if(n == l->tail)
		l->tail = curr->prev;
	if(tmp= real_node(curr->prev))
		tmp->next = curr->next;
	if(tmp= real_node(curr->next))
		tmp->prev = curr->prev;

	l->elem_count --;

	return 0;
}

///**
//  *     remove head node from list
//  *@l   the share list which n should add to
//  *@f   function pointer methods
//  *@ret return the head node position
//  */
//static inline int CAlgShareList_RemoveHead(CAlgShareList_F f, CAlgShareList* l)
//{
//	int head = l->head;
//	CAlgShareList_RemoveNode(l, l->head, f.real_node_f);
//	return head;
//}
//
///**
//  *     remove tail node from list
//  *@l   the share list which n should add to
//  *@f   function pointer methods
//  *@ret return the head node position
//  */
//static inline int CAlgShareList_RemoveTail(CAlgShareList_F f, CAlgShareList* l)
//{
//	int tail = l->tail;
//	CAlgShareList_RemoveNode(l, l->tail, f.real_node_f);
//	return tail;
//}

#define ALG_SHARE_LIST_FOREACH(alglist, node, f) do{\
	for(node=f.real_node_f(alglist->head); NULL != node; node =f.real_node_f(node->next)){


#define ALG_SHARE_LIST_FOREACH_END() }}while(0)

/**
  *traverse all node data with function it
  *@l       the share list which n should add to
  *@it      it function pointer methods , perform it(node->curr_data)
  *@reverse sequence or reverse traverse the node
  *@ret     return traverse node counts
  */
static inline int CAlgShareList_Enum(const CAlgShareList* l,Alg_IteRator_F it, 
											  AlgShareList_RealNode_F real_node, int reverse)
{
	int count = 0u;
	CAlgShareNode* tmp ;
	CAlgEnum rc ;
	if(reverse)
		tmp = real_node(l->tail);
	else
		tmp = real_node(l->head);

	while(tmp)
	{
		count ++;
		rc = it(tmp->curr_data);
		if(rc == CALG_ENUM_REPEAT)
			continue;
		else if(rc == CALG_ENUM_STOP)
			return count;
		if(reverse)
			tmp = real_node(tmp->prev);
		else
			tmp = real_node(tmp->next);
	}

	return count;
}


//////////////////////////////////////////////////////////////////////////
/**
  *            insert n to list after prev
  *@p_prev     previous position, link n to p_n->prev, 
  *            if p_prev is NULL , means add to head
  *@p_next     next position, link n to p_n->next, 
  *            if p_bext is NULL , means add to tail
  *@p_n        p_n = real_node(n)
  */
static inline void CAlgShareList_InsertPointer(CAlgShareList* l, CAlgShareNode*p_prev, CAlgShareNode*p_next, 
											   CAlgShareNode*p_n, int n)
{
	p_n->curr = n;
	if(p_prev)
	{
		p_prev->next = n;//p_n->curr;
		p_n->prev = p_prev->curr;
	}
	else
	{
		p_n->prev = ALG_SHARE_LIST_INVALID_POS;
		l->head = n;//p_n->curr;
	}

	if(p_next)
	{
		p_next->prev = n;//p_n->curr;
		p_n->next = p_next->curr;
	}
	else
	{
		p_n->next = ALG_SHARE_LIST_INVALID_POS;
		l->tail = n;//p_n->curr;
	}

	l->elem_count ++;
}

/**
  *     add n to list head
  *@f   function pointer methods
  *@l   the share list which n should add to
  *@n   make sure real_node_f(n) return valid pointer !!!
  *@ret return the tail position
  */
static inline int CAlgShareList_AddHead(CAlgShareList* l, int n, AlgShareList_RealNode_F real_node_f)
{
	CAlgShareList_InsertPointer(l, NULL, real_node_f(l->head), real_node_f(n), n);
	return l->head;
}

/**
  *     add n to list tail
  *@f   real node function methods
  *@l   the share list which n should add to
  *@n   make sure real_node_f(n) return valid pointer
  *@ret return the tail position
  */
static inline int CAlgShareList_AddTail(CAlgShareList* l, int n, AlgShareList_RealNode_F real_node_f)
{
	CAlgShareList_InsertPointer(l, real_node_f(l->tail), NULL, real_node_f(n), n);
	return l->tail;
}


static inline void CAlgShareList_Insert(CAlgShareList* l, int prev, int n, AlgShareList_RealNode_F real_node_f)
{
	CAlgShareNode* p_prev = real_node_f(prev);
	CAlgShareNode* p_next = p_prev ? real_node_f(p_prev->next) : NULL;
	CAlgShareList_InsertPointer(l, p_prev, p_next, real_node_f(n), n);
}

static inline int CAlgShareList_RemoveNodePointer(CAlgShareList* l, CAlgShareNode* prev, CAlgShareNode* next, CAlgShareNode* n)
{
	if(n->curr == l->head)
		l->head = n->next;
	if(n->curr == l->tail)
		l->tail = n->prev;
	if(prev)
		prev->next = n->next;
	if(next)
		next->prev = n->prev;

	l->elem_count --;

	return 0;
}

/**
  *     remove head node from list
  *@l   the share list which n should add to
  *@f   function pointer methods
  *@ret return the head node position
  */
static inline int CAlgShareList_RemoveHead(CAlgShareList_F f, CAlgShareList* l)
{
	int head = l->head;
	CAlgShareNode* curr = f.real_node_f(head);
	if(!curr) return ALG_SHARE_LIST_INVALID_POS;
	CAlgShareList_RemoveNodePointer(l, NULL, f.real_node_f(curr->next), curr);
	return head;
}

/**
  *     remove tail node from list
  *@l   the share list which n should add to
  *@f   function pointer methods
  *@ret return the head node position
  */
static inline int CAlgShareList_RemoveTail(CAlgShareList_F f, CAlgShareList* l)
{
	int tail = l->tail;
	CAlgShareNode* curr = f.real_node_f(tail);
	if(!curr) return ALG_SHARE_LIST_INVALID_POS;
	CAlgShareList_RemoveNodePointer(l, f.real_node_f(curr->prev), NULL, curr);
	//CAlgShareList_RemoveNode(l, l->tail, f.real_node_f);
	return tail;
}

#ifdef	__cplusplus
}
#endif

#endif
//end of file

单元测试:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "CAlgList.h"
#include "CAlgShareList.h"

#define MAX_SHARE_NODE_ELEM   10000000
typedef struct {
	int a;
	int b;
}CAlgListNodeData;

static CAlgListNodeData* g_NodeDataPool = NULL;
static CAlgShareNode* g_CAlgNodes = NULL;
static CAlgShareList* g_CAlgList = NULL;

extern "C" static int TestAlgShareList_node_cmp(const void* left, const void* right, unsigned int size)
{
	CAlgListNodeData* l, *r;
	l = (CAlgListNodeData*)left;
	r = (CAlgListNodeData*)right;
	if (l->a != r->a) 
		return l->a - r->a;

	return l->b - r->b;
}


extern "C" CAlgShareNode* TestAlgShareList_RealNode_F(int pos)
{
	if(pos <0 || pos >=MAX_SHARE_NODE_ELEM) return NULL;
	return &g_CAlgNodes[pos];
}


static CAlgShareList_F g_ShareListF = {
	TestAlgShareList_RealNode_F, TestAlgShareList_node_cmp
};

extern "C" CAlgEnum TestAlgShareList_Enum(void* elem)
{
	CAlgListNodeData* e = (CAlgListNodeData*)elem;
	printf("%5d, a=%5d, b=%5d\n", e - g_NodeDataPool, e->a, e->b);
	return CALG_ENUM_NEXT;
}

extern "C" CAlgEnum TestAlgShareList_EnumNothing(void* elem)
{
	return CALG_ENUM_NEXT;
}

void TestAlgShareList_Init()
{
	g_NodeDataPool = (CAlgListNodeData*)malloc(sizeof(CAlgListNodeData)*MAX_SHARE_NODE_ELEM);
	g_CAlgNodes = (CAlgShareNode*)malloc(sizeof(CAlgShareNode)*MAX_SHARE_NODE_ELEM);
	g_CAlgList = (CAlgShareList*)malloc(sizeof(CAlgShareList));
	
	CAlgShareList_ReSet(g_CAlgList, sizeof(CAlgListNodeData));
}

void TestAlgShareList_Free()
{
	free(g_NodeDataPool);
	g_NodeDataPool = NULL;

	free(g_CAlgNodes);
	g_CAlgNodes = NULL;

	free(g_CAlgList);
	g_CAlgList = NULL;
}

void TestAlgShareList_AddAll_Pointer(int add_tail)
{
	CAlgShareNode* n = g_CAlgNodes;
	CAlgListNodeData* d = g_NodeDataPool;
	int i, pos;
	for(i=0; i<MAX_SHARE_NODE_ELEM; i++)
	{
		d->a = i+1;
		d->b = i+2;

		n[i].curr_data = (void*)d;
		if(add_tail)
			CAlgShareList_AddTail(g_CAlgList, i, g_ShareListF.real_node_f);
		else
			CAlgShareList_AddHead(g_CAlgList, i, g_ShareListF.real_node_f);

		d++;
		assert(g_CAlgList->elem_count == i +1);
	}

	i=0;
	pos = g_CAlgList->head;
	n = g_ShareListF.real_node_f(pos);
	do{
		if(pos == g_CAlgList->head)
		{
			assert(g_ShareListF.real_node_f(n->prev) == NULL);
		}
		if(pos == g_CAlgList->tail)
		{
			assert(g_ShareListF.real_node_f(n->next) == NULL);
		}

		d = (CAlgListNodeData*)n->curr_data;
		if(add_tail){
			assert(d->a == i+1);
			assert(d->b == i+2);
		}
		else
		{
			assert(d->a == MAX_SHARE_NODE_ELEM - i);
			assert(d->b == MAX_SHARE_NODE_ELEM - i +1);
		}

		pos++;
		i++;
	}while(n=TestAlgShareList_RealNode_F(n->next));
	assert(i == MAX_SHARE_NODE_ELEM);
	assert(g_CAlgList->elem_count == MAX_SHARE_NODE_ELEM);
}

void TestAlgShareList_RemoveHead()
{
	CAlgShareNode* n = g_CAlgNodes;
	CAlgListNodeData* d;
	int i;

	for(i=0; i<MAX_SHARE_NODE_ELEM; i++)
	{
		n = TestAlgShareList_RealNode_F(CAlgShareList_RemoveHead(g_ShareListF, g_CAlgList));
		d = (CAlgListNodeData*)n->curr_data;
		assert(d->a == i+1);
		assert(d->b == i+2);
		assert(g_CAlgList->elem_count == MAX_SHARE_NODE_ELEM - i -1);
	}

	assert(g_CAlgList->head == ALG_SHARE_LIST_INVALID_POS);
	assert(g_CAlgList->tail == ALG_SHARE_LIST_INVALID_POS);
}

void TestAlgShareList_RemoveTail()
{
	CAlgShareNode* n = g_CAlgNodes;
	CAlgListNodeData* d;
	int i;

	for(i=0; i<MAX_SHARE_NODE_ELEM; i++)
	{
		n = TestAlgShareList_RealNode_F(CAlgShareList_RemoveTail(g_ShareListF, g_CAlgList));
		d = (CAlgListNodeData*)n->curr_data;
		assert(d->a == i+1);
		assert(d->b == i+2);
		assert(g_CAlgList->elem_count == MAX_SHARE_NODE_ELEM - i - 1);
	}

	assert(g_CAlgList->head == ALG_SHARE_LIST_INVALID_POS);
	assert(g_CAlgList->tail == ALG_SHARE_LIST_INVALID_POS);
}

void TestAlgShareList_Insert_Remove()
{
	const int node_num = 10;
	CAlgShareNode* n = g_CAlgNodes;
	CAlgListNodeData* d = g_NodeDataPool;
	int i, pos;
	CAlgListNodeData tmp;

	//list empty find fail
	for(i=0; i<node_num/2; i++)
	{
		d = &g_NodeDataPool[node_num/2+i];
		tmp.a = i+1;
		tmp.b = i+2;

		n = TestAlgShareList_RealNode_F(CAlgShareList_Find(g_ShareListF, g_CAlgList, &tmp));
		assert(n == NULL);
	}

	//list empty remove fail
	assert (NULL == TestAlgShareList_RealNode_F(CAlgShareList_RemoveTail(g_ShareListF, g_CAlgList)));
	assert (NULL == TestAlgShareList_RealNode_F(CAlgShareList_RemoveHead(g_ShareListF, g_CAlgList)));
	assert (g_CAlgList->elem_count == 0);


	//add node_num/2 nodes
	for(i=0; i<node_num/2; i++)
	{
		d = &g_NodeDataPool[i];
		d->a = i+1;
		d->b = i+2;

		g_CAlgNodes[i].curr_data = (void*)d;
		CAlgShareList_AddTail(g_CAlgList, i, g_ShareListF.real_node_f);

		assert(g_CAlgList->elem_count == i +1);
	}

	assert(g_CAlgList->elem_count == node_num/2);
	printf("add 5 nodes using CAlgShareList_AddTail()\n");
	CAlgShareList_Enum(g_CAlgList,TestAlgShareList_Enum,g_ShareListF.real_node_f, 0);

	//insert node_num/2 nodes into the list
	//1,      2,      3,      4,      5 
	//1,1001, 2,1002, 3,1003, 4,1004, 5,1005
	for(i=0; i<node_num/2; i++)
	{
		d = &g_NodeDataPool[node_num/2+i];
		tmp.a = i+1;
		tmp.b = i+2;

		pos = CAlgShareList_Find(g_ShareListF, g_CAlgList, &tmp);
		n = g_ShareListF.real_node_f(pos);
		assert(n != NULL);

		d->a = 1000+i+1;
		d->b = 2000+i+1;

		g_CAlgNodes[node_num/2+i].curr_data = d;

		CAlgShareList_Insert(g_CAlgList, pos, node_num/2+i, g_ShareListF.real_node_f);
	}
	printf("\nafter add 5 nodes using CAlgList_Insert()\n");
	CAlgShareList_Enum(g_CAlgList,TestAlgShareList_Enum,g_ShareListF.real_node_f,0);

	i=0;
	n = g_ShareListF.real_node_f(g_CAlgList->head);
	do{
		if(n == g_ShareListF.real_node_f(g_CAlgList->head))
		{
			assert(n->prev == ALG_SHARE_LIST_INVALID_POS);
		}
		if(n == g_ShareListF.real_node_f(g_CAlgList->tail))
		{
			assert(n->next == ALG_SHARE_LIST_INVALID_POS);
		}

		d = (CAlgListNodeData*)n->curr_data;
		if((i % 2) == 0)
		{
			assert(d->a == i/2+1);
			assert(d->b == i/2+2);
		}
		else
		{
			assert(d->a == 1000+i/2+1);
			assert(d->b == 2000+i/2+1);
		}

		i++;
	}while(n=g_ShareListF.real_node_f(n->next));
	assert(i == node_num);
	assert(g_CAlgList->elem_count == node_num);

	//remove node 1001,1002,1003,1004,1005
	//before 1,1001, 2,1002, 3,1003, 4,1004, 5,1005
	//after  1,      2,      3,      4,      5 
	for(i=0; i<node_num/2; i++)
	{
		tmp.a = 1000+i+1;
		tmp.b = 2000+i+1;
		pos = CAlgShareList_Find(g_ShareListF, g_CAlgList, &tmp);
		n = g_ShareListF.real_node_f(pos);
		assert(n != NULL);
		assert(0 == CAlgShareList_RemoveNode( g_CAlgList, pos, g_ShareListF.real_node_f));
	}
	printf("\nafter remove 5 nodes using CAlgList_RemoveNode\n");
	CAlgShareList_Enum(g_CAlgList,TestAlgShareList_Enum,g_ShareListF.real_node_f,0);
	assert(g_CAlgList->elem_count == node_num/2);

	i=0;
	n = g_ShareListF.real_node_f(g_CAlgList->head);
	do{
		if(n == g_ShareListF.real_node_f(g_CAlgList->head))
		{
			assert(n->prev == ALG_SHARE_LIST_INVALID_POS);
		}
		if(n == g_ShareListF.real_node_f(g_CAlgList->tail))
		{
			assert(n->next == ALG_SHARE_LIST_INVALID_POS);
		}

		d = (CAlgListNodeData*)n->curr_data;
		assert(d->a == i+1);
		assert(d->b == i+2);

		i++;
	}while(n=g_ShareListF.real_node_f(n->next));

	//remove head 1
	//after  2,      3,      4,      5 
	pos = CAlgShareList_RemoveHead(g_ShareListF, g_CAlgList);
	n = g_ShareListF.real_node_f(pos);
	assert(n != NULL && g_CAlgList->elem_count > 2);
	d = (CAlgListNodeData*)n->curr_data;
	assert(d->a == 1);
	assert(d->b == 2);

	//remove tail 5
	//after  2,      3,      4,      
	pos = CAlgShareList_RemoveTail(g_ShareListF, g_CAlgList);
	n = g_ShareListF.real_node_f(pos);
	assert(n != NULL && g_CAlgList->elem_count > 2);
	d = (CAlgListNodeData*)n->curr_data;
	assert(d->a == 5);
	assert(d->b == 6);

	assert(g_CAlgList->elem_count == 3);
	i=1;
	n = g_ShareListF.real_node_f(g_CAlgList->head);
	do{
		if(n == g_ShareListF.real_node_f(g_CAlgList->head))
		{
			assert(n->prev == ALG_SHARE_LIST_INVALID_POS);
		}
		if(n == g_ShareListF.real_node_f(g_CAlgList->tail))
		{
			assert(n->next == ALG_SHARE_LIST_INVALID_POS);
		}

		d = (CAlgListNodeData*)n->curr_data;
		assert(d->a == i+1);
		assert(d->b == i+2);

		i++;
	}while(n=g_ShareListF.real_node_f(n->next));
	assert(i == 4);
	printf("\nafter CAlgShareList_RemoveHead && CAlgShareList_RemoveTail\n");
	CAlgShareList_Enum(g_CAlgList,TestAlgShareList_Enum,g_ShareListF.real_node_f, 0);

	//remove all
	while(g_ShareListF.real_node_f(CAlgShareList_RemoveHead(g_ShareListF, g_CAlgList)))
		printf("remove...\n");

	assert(g_CAlgList->elem_count == 0);

}


#include <Windows.h>
void TestAlgShareList_Run()
{
	SYSTEMTIME st1, st2;
	FILETIME ft1, ft2; //100ns
	CAlgShareNode* n;
	int i;
	TestAlgShareList_Init();

	//test add head
	GetLocalTime(&st1);
	TestAlgShareList_AddAll_Pointer(1);
	GetLocalTime(&st2);
	SystemTimeToFileTime(&st1, &ft1);
	SystemTimeToFileTime(&st2, &ft2);
	printf("%s using %u.%03ums to add head %d nodes %02u:%02u:%02u.%03u - %02u:%02u:%02u.%03u\n", 
		__FILE__,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10000,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10, MAX_SHARE_NODE_ELEM,
		st1.wHour,st1.wMinute,st1.wSecond,st1.wMilliseconds,
		st2.wHour,st2.wMinute,st2.wSecond,st2.wMilliseconds);

	//iterate all elements
	GetLocalTime(&st1);
	CAlgShareList_Enum(g_CAlgList,TestAlgShareList_EnumNothing,g_ShareListF.real_node_f,0);
	GetLocalTime(&st2);
	SystemTimeToFileTime(&st1, &ft1);
	SystemTimeToFileTime(&st2, &ft2);
	printf("%s using %u.%03ums to iterate %d nodes %02u:%02u:%02u.%03u - %02u:%02u:%02u.%03u\n", 
		__FILE__,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10000,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10, MAX_SHARE_NODE_ELEM,
		st1.wHour,st1.wMinute,st1.wSecond,st1.wMilliseconds,
		st2.wHour,st2.wMinute,st2.wSecond,st2.wMilliseconds);

	i=0;
	GetLocalTime(&st1);
	ALG_SHARE_LIST_FOREACH(g_CAlgList, n, g_ShareListF);
	i++;
	ALG_SHARE_LIST_FOREACH_END();
	GetLocalTime(&st2);
	SystemTimeToFileTime(&st1, &ft1);
	SystemTimeToFileTime(&st2, &ft2);
	printf("%s using %u.%03ums to iterate %d nodes %02u:%02u:%02u.%03u - %02u:%02u:%02u.%03u\n", 
		__FILE__,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10000,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10, i,
		st1.wHour,st1.wMinute,st1.wSecond,st1.wMilliseconds,
		st2.wHour,st2.wMinute,st2.wSecond,st2.wMilliseconds);

	//CAlgList_Enum(CAlgList_GetAlgFunc(),g_CAlgList,TestAlgList_Enum,0);
	//remove all 
	TestAlgShareList_RemoveHead();

	//test add tail
	GetLocalTime(&st1);
	TestAlgShareList_AddAll_Pointer(0);
	GetLocalTime(&st2);
	SystemTimeToFileTime(&st1, &ft1);
	SystemTimeToFileTime(&st2, &ft2);
	printf("%s using %u.%03ums to add tail %d nodes %02u:%02u:%02u.%03u - %02u:%02u:%02u.%03u\n", 
		__FILE__,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10000,
		(ft2.dwLowDateTime-ft1.dwLowDateTime)/10, MAX_SHARE_NODE_ELEM,
		st1.wHour,st1.wMinute,st1.wSecond,st1.wMilliseconds,
		st2.wHour,st2.wMinute,st2.wSecond,st2.wMilliseconds);
	//CAlgList_Enum(CAlgList_GetAlgFunc(),g_CAlgList,TestAlgList_Enum,1);
	TestAlgShareList_RemoveTail();

	//test find and insert
	CAlgShareList_ReSet(g_CAlgList, sizeof(CAlgListNodeData));
	TestAlgShareList_Insert_Remove();

	TestAlgShareList_Free();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值