単一ノードは、可変数要素のチェーンテーブルを格納できます.
2270 ワード
chunk listはチェーンテーブルlistに対して変化し、古典的なlistは構造体nodeによってパッケージ固定数の情報を実現する.すなわち、各ノードのサイズは完全に同じであり、異なるのは格納された値が異なる.chunk listでは、可変数の要素を格納する必要があります.この点はstlの古典的な容器vectorによって実現できる.
#include
#include
#include
#include
#include
template
class Chunklist
{
private:
struct node
{
std::vector vec;
node* link;
};
node* head;
void clear()
{
node* p = head;
while(!p->link)
{
node* temp = p;
p = p->link;
delete temp;
}
delete p;
}
public:
Chunklist()
{
head = new node();
head->link = NULL;
}
node* GetHead()const;
void Insert(T* buffer,size_t size);
bool Delete(T data);
void Display()const;
~Chunklist()
{
clear();
}
};
template
typename Chunklist::node* Chunklist::GetHead()const
{
return head;
}
template
void Chunklist::Insert(T* buffer, size_t size)
{
// node haha;
// node hh();
node* q = new node();
for(int i = 0; i < size; ++i)
{
q->vec.push_back(*(buffer+i));
}
node* p = head;
while(p->link)
{
p = p->link;
}
p->link = q;
q->link = NULL;
}
template
bool Chunklist::Delete(T data)
{
node* p = head->link;
node* q = head;
typename std::vector::iterator iter;
while(p)
{
iter = find(p->vec.begin(), p->vec.end(),data);
if(iter != p->vec.end())
{
break;
}
q = p;
p = p->link;
}
if(p && iter != p->vec.end())//find it
{
p->vec.erase(iter);
if(p->vec.size() == 0)
{
q->link = p->link;
delete p;
}
return 1;
}
else
{
return 0;
}
}
template
void Chunklist::Display()const
{
node* p = head->link;
std::cout<::iterator it = p->vec.begin(); it != p->vec.end(); ++it)
{
std::cout<link;
}
std::cout< cl;
int a[]={1,2,3,4,5};
cl.Insert(a,5);
cl.Display();
int b[]={6,7};
cl.Insert(b,2);
cl.Display();
int c[]={8};
cl.Insert(c,1);
cl.Display();
cl.Delete(6);
cl.Display();
cl.Delete(7);
cl.Display();
cl.Delete(8);
cl.Display();
return 0;
}