배열 시 뮬 레이 션 링크 의 실현
6317 단어 데이터 구조
#pragma once
/**
* , , 。
* /
*
*
* : , 。
* : ELEMENT , 。
* , ELEMENT, 。
* , ( )
*ELEMENT :typedef CListWithArray<int,1000>::ELEMENT CListWithArray_t;
* CListWithArray_t
*
* bool Add(llist_t* e); // 。
* llist_t* Erase(); // ,
* next , ,
**/
namespace list_with_array
{
template<typename llist_t, int llist_size=100>
class CListWithArray
{
//variable
public:
struct ELEMENT
{
llist_t element;
ELEMENT* pPre;
ELEMENT* pNext;
};
private:
ELEMENT elementData[llist_size];//
ELEMENT freeElement; //
ELEMENT useElement; //
//function
public:
CListWithArray();
bool Add(const llist_t e);
ELEMENT* Erase(ELEMENT *p)
{
return ReleaseElement(p);
}
ELEMENT* GetListHead()
{
return useElement.pNext;
}
/**
*
**/
int GetSumUseElement()
{
int sum=0;
ELEMENT* p;
for(p=useElement.pNext; p!=NULL; p=p->pNext)
{
++sum;
}
return sum;
}
int GetSumFreeElement()
{
int sum=0;
ELEMENT* p;
for(p=freeElement.pNext; p!=NULL; p=p->pNext)
{
++sum;
}
return sum;
}
private:
/**
* ,
**/
void InitList();
ELEMENT* MallocElement();
ELEMENT* ReleaseElement(ELEMENT *p);
/**
*
**/
void AddNodeToList(ELEMENT* const pNode, ELEMENT* const pDesList)
{
//
pNode->pNext = pDesList->pNext;
pNode->pPre = pDesList;
// ,
if( NULL!=pDesList->pNext )
{
pDesList->pNext->pPre = pNode;
}
pDesList->pNext = pNode;
}
};
/**
*
**/
template <typename llist_t, int llist_size>
CListWithArray<llist_t, llist_size>::CListWithArray()
{
InitList();
}
template <typename llist_t, int llist_size>
void CListWithArray<llist_t, llist_size>::InitList()
{
//
for(int i=0; i<llist_size-1; ++i)
{
elementData[i].pNext = &elementData[i+1];
}
elementData[llist_size-1].pNext = NULL;
useElement.pNext = NULL;
freeElement.pNext = &elementData[0];
}
template <typename llist_t, int llist_size>
typename CListWithArray<llist_t, llist_size>::ELEMENT* CListWithArray<llist_t, llist_size>::MallocElement()
{
//
if( NULL==freeElement.pNext )
{
return NULL;
}
// Free ,
ELEMENT* p = freeElement.pNext;
freeElement.pNext = freeElement.pNext->pNext;
//
p->pPre = NULL;
p->pNext = NULL;
AddNodeToList(p, &useElement);
return p;
}
template <typename llist_t, int llist_size>
typename CListWithArray<llist_t, llist_size>::ELEMENT* CListWithArray<llist_t, llist_size>::ReleaseElement( ELEMENT *p)
{
ELEMENT *pResult = p->pNext;
// Use
p->pPre->pNext = p->pNext;
//
if( NULL!=p->pNext )
{
p->pNext->pPre = p->pPre;
}
//
p->pPre = NULL;
p->pNext = NULL;
AddNodeToList(p, &freeElement);
return pResult;
}
template <typename llist_t, int llist_size>
bool CListWithArray<llist_t, llist_size>::Add(const llist_t e)
{
// Free
ELEMENT *p = MallocElement();
if( NULL==p )
{
return false;
}
else
{
p->element = e;
return true;
}
}
};
/*
#include "CListWithArray.h"
using namespace std;
using namespace list_with_array;
CListWithArray<int,1000> listTest;
typedef CListWithArray<int,1000>::ELEMENT CListWithArray_t;
void cout_listinfo()
{
cout<<"sum use:"<<listTest.GetSumUseElement()<<endl;
cout<<"sum free:"<<listTest.GetSumFreeElement()<<endl;
cout<<"-------------------"<<endl;
}
void test_del_1()
{
CListWithArray_t *p=listTest.GetListHead();
while( NULL!=p )
{
if( ((p->element)&0x1) == 0 ) //
{
p = listTest.Erase(p); // , p , p->pNext;
continue;
}
p=p->pNext;
}
}
void test_del_2()
{
CListWithArray_t *p=listTest.GetListHead();
while( NULL!=p )
{
if( 1000==p->element || 2000==p->element )
{
p = listTest.Erase(p);
continue;
}
p=p->pNext;
}
}
void test_add_1()
{
for(int i=0; i<1100; ++i)
{
listTest.Add(i);
}
}
void test_add_2()
{
for(int i=0; i<3; ++i)
{
listTest.Add(i*1000);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cout_listinfo(); //
test_add_1(); //
cout_listinfo();
test_del_1(); //
cout_listinfo();
test_add_2(); // ,0,1000,2000
cout_listinfo();
test_del_2(); // 1000,2000
cout_listinfo();
return 0;
}
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.