색인 기반 범용 대기 열 구축 및 구현 (C 언어 구현)
현재 우 리 는 색인 을 기반 으로 옮 겨 다 니 고 연결 하 는 배열 의 범 형 대기 열 (BASE LIST) 을 만 들 수 있 습 니 다. 이러한 범 형 대기 열 은 여러 가지 유형의 노드 요 소 를 호 환 할 수 있 습 니 다. 구체 적 인 노드 유형 요소 의 조작 인 터 페 이 스 는 사용자 가 단독으로 맞 춤 형 으로 실현 할 수 있 기 때문에 BASE 에 영향 을 주지 않 습 니 다.LIST;
구체 적 인 실현 코드 는 다음 과 같다.
My_Typedef. h 파일
// ----------------------------------- My_Typedef.h --------------------------------------------------
#ifndef _MY_TYPEDF_H_
#include
#include
#include
#include
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
#endif
Base_List. h 파일
// ----------------------------------- Base_List.h --------------------------------------------------
#ifndef _BASE_LIST_H_
#define _BASE_LIST_H_
#include "My_Typedef.h"
#define NODE_HEAD_INDEX 0x00000000
#define NODE_TAIL_INDEX 0xFFFFFFFF
#define NODE_FLAG_USED 0x00000001
typedef struct _BASE_NODE_T{
u32 PrevIndex;
u32 NextIndex;
u32 NodeFlag;
}BASE_NODE_T;
typedef struct _BASE_NODEHEAP_T{
u32 NodeAmount;
u32 CurIndex;
// NodeHeap[]
}BASE_NODEHEAP_T;
typedef struct _BASE_LIST_T{
u32 ListSize;
u32 HeadIndex;
u32 TailIndex;
u32 NodeSize;
u32 HeapMax;
// LIST Heap
}BASE_LIST_T;
int BaseList_Init(BASE_LIST_T* pList, u32 NodeSize, u32 HeapMax); //
int BaseList_Add(BASE_LIST_T* pList, u32* pIndex); //
void BaseList_Del(BASE_LIST_T* pList, u32 Index); //
#endif
Base_List. c 파일
// ----------------------------------- Base_List.c --------------------------------------------------
#include "Base_List.h"
int BaseNode_Malloc(BASE_NODEHEAP_T* pHeap, u32* pIndex, u32 NodeSize, u32 HeapMax)
{
// Heap Index = 0x00000000 Index = 0xFFFFFFFF
void* pHeapArray = NULL;
BASE_NODE_T* pBaseNode = NULL;
u32 index = 0;
if(pHeap->NodeAmount >= (HeapMax-2))
{
return -1; //
}
if(pHeap->NodeAmount == 0)
{
// Heap
pHeap->NodeAmount = 1;
pHeap->CurIndex = 1; //
pHeapArray = pHeap + sizeof(u32)*2; // NodeHeap
pBaseNode = (BASE_NODE_T*)pHeapArray;
memset((void*)pBaseNode, 0, NodeSize); //
pBaseNode->NodeFlag = NODE_FLAG_USED; //
*pIndex = pHeap->CurIndex;
return 0; // 0
}
else
{
index = pHeap->CurIndex;
if(index == 0 || index >= HeapMax)
{
index = 1;
}
pHeapArray = pHeap + sizeof(u32)*2 + index*NodeSize; // NodeHeap
pBaseNode = (BASE_NODE_T*)pHeapArray;
while(pBaseNode->NodeFlag&NODE_FLAG_USED)
{
index++;
if(index==0 || index >= HeapMax)
{
index = 0;
}
pHeapArray = pHeap + sizeof(u32)*2 + index*NodeSize; // NodeHeap
pBaseNode = (BASE_NODE_T*)pHeapArray;
}
pHeap->NodeAmount++;
pHeap->CurIndex = index;
memset((void*)pBaseNode, 0, NodeSize); //
pBaseNode->NodeFlag = NODE_FLAG_USED; //
*pIndex = pHeap->CurIndex;
return 0; // 0
}
}
void BaseNode_Free(BASE_NODEHEAP_T* pHeap, u32 Index, u32 NodeSize, u32 HeapMax)
{
void* pHeapArray = NULL;
BASE_NODE_T* pBaseNode = NULL;
u32 index = 0;
if(pHeap->NodeAmount == 0)
{
return;
}
if((Index == 0) && (Index >= HeapMax))
{
return;
}
pHeapArray = pHeap + sizeof(u32)*2 + Index*NodeSize; // NodeHeap
pBaseNode = (BASE_NODE_T*)pHeapArray;
if(pBaseNode->NodeFlag&NODE_FLAG_USED)
{
// Free
memset((void*)pBaseNode, 0, NodeSize);
pHeap->NodeAmount--;
}
return;
}
int BaseList_Init(BASE_LIST_T* pList, u32 NodeSize, u32 HeapMax)
{
BASE_NODEHEAP_T* pHeap = NULL;
void* pVoid = (void*)pList;
void* pHeapArray = NULL;
u32 i = 0;
pList->ListSize = 0;
pList->NodeSize = NodeSize;
pList->HeapMax = HeapMax;
pList->HeadIndex = 0;
pList->TailIndex = 0;
pHeap = (BASE_NODEHEAP_T*)(pVoid+sizeof(u32)*5);
pHeapArray = pHeap + sizeof(u32)*2;
pHeap->NodeAmount = 0;
pHeap->CurIndex = 0;
memset((void*)pHeapArray, 0, NodeSize*HeapMax);
return;
}
int BaseList_Add(BASE_LIST_T* pList, u32* pIndex)
{
u32 NodeSize = pList->NodeSize;
u32 HeapMax = pList->HeapMax;
int Ret = 0;
BASE_NODEHEAP_T* pHeap = NULL;
BASE_NODE_T* pBaseNode = NULL;
BASE_NODE_T* pTailNode = NULL;
void* pVoid = (void*)pList;
u32 Index = 0;
pHeap = (BASE_NODEHEAP_T*)(pVoid+sizeof(u32)*5);
//
Ret = BaseNode_Malloc(pHeap, &Index, NodeSize, HeapMax);
if(Ret < 0)
{
//
return -1;
}
//
pBaseNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+Index*NodeSize);
if(pList->ListSize == 0)
{
//
pList->ListSize = 1;
pList->HeadIndex = Index;
pList->TailIndex = Index;
pBaseNode->PrevIndex = NODE_HEAD_INDEX;
pBaseNode->NextIndex = NODE_TAIL_INDEX;
*pIndex = Index;
return 0;
}
else
{
//
pList->ListSize++;
pTailNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+pList->TailIndex*NodeSize);
pTailNode->NextIndex = Index;
pBaseNode->PrevIndex = pList->TailIndex;
pBaseNode->NextIndex = NODE_TAIL_INDEX;
pList->TailIndex = Index;
*pIndex = Index;
return 0;
}
}
void BaseList_Del(BASE_LIST_T* pList, u32 Index)
{
BASE_NODEHEAP_T* pHeap = NULL;
void* pVoid = (void*)pList;
BASE_NODE_T* pBaseNode = NULL;
BASE_NODE_T* pNextNode = NULL;
BASE_NODE_T* pPrevNode = NULL;
u32 NodeSize = pList->NodeSize;
u32 HeapMax = pList->HeapMax;
u32 NextIndex = 0;
u32 PrevIndex = 0;
if(pList->ListSize == 0)
{
//
return;
}
pHeap = (BASE_NODEHEAP_T*)(pVoid+sizeof(u32)*5);
pBaseNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+Index*NodeSize);
//
if(!(pBaseNode->NodeFlag&NODE_FLAG_USED))
{
//
return;
}
//
if(pBaseNode->PrevIndex == NODE_HEAD_INDEX) //
{
if(pBaseNode->NextIndex == NODE_TAIL_INDEX) //
{
//
pList->ListSize = 0;
pList->HeadIndex = 0;
pList->TailIndex = 0;
}
else
{
NextIndex = pBaseNode->NextIndex;
pNextNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+NextIndex*NodeSize);
pNextNode->PrevIndex = NODE_HEAD_INDEX;
pList->HeadIndex = NextIndex;
pList->ListSize--;
}
}
else if(pBaseNode->NextIndex == NODE_TAIL_INDEX) //
{
if(pBaseNode->PrevIndex == NODE_HEAD_INDEX) //
{
//
pList->ListSize = 0;
pList->HeadIndex = 0;
pList->TailIndex = 0;
}
else
{
PrevIndex = pBaseNode->PrevIndex;
pPrevNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+PrevIndex*NodeSize);
pPrevNode->NextIndex = NODE_TAIL_INDEX;
pList->TailIndex = PrevIndex;
pList->ListSize--;
}
}
else
{
//
NextIndex = pBaseNode->NextIndex;
pNextNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+NextIndex*NodeSize);
PrevIndex = pBaseNode->PrevIndex;
pPrevNode = (BASE_NODE_T*)(pHeap+sizeof(u32)*2+PrevIndex*NodeSize);
pNextNode->PrevIndex = PrevIndex;
pPrevNode->NextIndex = NextIndex;
pList->ListSize--;
}
// Heap
BaseNode_Free(pHeap, Index, NodeSize, HeapMax);
return ;
}
후기 에는 편리 하 게 사용 할 수 있 도록 응용 절 차 를 제시 할 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
색인 기반 범용 대기 열 구축 및 구현 (C 언어 구현)이런 자원 은 신청 되 고 회수 할 수 있다.대기 열의 조작 은 기본적으로 매우 통용 되 기 때문에 가장 자주 사용 하 는 조작 시작 은 구체 적 인 유형의 요소 대상 을 대상 으로 요소 대상 의 속성 과 내용 에 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.