📄 dulist.h
字号:
#ifndef DULIST_H
#define DULIST_H
#include "dunode.h"
enum error_code { Success, Unsuccess };
template< class ENTRY_TYPE >
class Dulist{
public:
Dulist( );
Dulist( ENTRY_TYPE data[] );
~Dulist( );
void InsertAtFront( ENTRY_TYPE &data );
void InsertAtBack( ENTRY_TYPE &data );
error_code InsertAtCurrent( ENTRY_TYPE &data, int &i );
error_code RemoveAtFront( );
error_code RemoveAtBack( );
error_code Delete_element( int &i );
error_code Delete_elememt( ENTRY_TYPE &data );
void Print( );
void DelDulist( );
Dunode< ENTRY_TYPE >* GetHead( ){ return Head; }
Dunode< ENTRY_TYPE >* GetLast( ){ return Last; }
int GetCount( ) { return count; }
private:
Dunode< ENTRY_TYPE > *Head, *Last;
int count;
};
template< class ENTRY_TYPE >
Dulist< ENTRY_TYPE >::Dulist( )
{
count = 0;
Head = new Dunode< ENTRY_TYPE >;
Last = new Dunode< ENTRY_TYPE >;
Head->Next = Head->Prior = Last;
Last->Next = Last->Prior = Head;
}
template< class ENTRY_TYPE >
Dulist< ENTRY_TYPE >::~Dulist( )
{
Dunode< ENTRY_TYPE > *DelNode;
while( Head -> Next != Last )
{
DelNode = Head;
Head = Head->Next;
delete DelNode;
count--;
}
delete Head, Last;
}
template< class ENTRY_TYPE >
Dulist< ENTRY_TYPE >::Dulist( ENTRY_TYPE data[] )
{
count = 0;
Head = new Dunode< ENTRY_TYPE >;
Last = new Dunode< ENTRY_TYPE >;
Head->Next = Head->Prior = Last;
Last->Next = Last->Prior = Head;
int i = 0;
while( data[ i ] != -9999 )
{
InsertAtBack( data[ i ] );
i++;
}
}
template< class ENTRY_TYPE >
void Dulist< ENTRY_TYPE >::InsertAtFront( ENTRY_TYPE &data )
{
Dunode< ENTRY_TYPE > *NewNode;
NewNode = new Dunode< ENTRY_TYPE >;
NewNode->Data = data;
NewNode->Next = Head->Next;
NewNode->Prior = Head->Next->Prior;
Head->Next->Prior = NewNode;
NewNode->Prior->Next = NewNode;
count++;
}
template< class ENTRY_TYPE >
void Dulist< ENTRY_TYPE >::InsertAtBack( ENTRY_TYPE &data )
{
Dunode< ENTRY_TYPE > *NewNode;
NewNode = new Dunode< ENTRY_TYPE >;
NewNode->Data = data;
NewNode->Next = Last;
NewNode->Prior = Last->Prior;
Last->Prior->Next = NewNode;
Last->Prior = NewNode;
count++;
}
template< class ENTRY_TYPE >
error_code Dulist< ENTRY_TYPE >::InsertAtCurrent( ENTRY_TYPE &data, int &i )
{
Dunode< ENTRY_TYPE > *CurrentNode, *NewNode;
CurrentNode = new Dunode< ENTRY_TYPE >;
NewNode = new Dunode< ENTRY_TYPE >;
NewNode->Data = data;
CurrentNode = Head->Next;
if( i <= 0 && i > count + 1 )
return Unsuccess;
while( i != 1 )
{
CurrentNode= CurrentNode->Next;
i--;
}
NewNode->Next = CurrentNode;
NewNode->Prior = CurrentNode->Prior;
CurrentNode->Prior->Next = NewNode;
NewNode->Next = CurrentNode;
count++;
return Success;
}
template< class ENTRY_TYPE >
error_code Dulist< ENTRY_TYPE >::RemoveAtBack( )
{
Dunode< ENTRY_TYPE > *DelNode;
if( count == 0 )
return Unsuccess;
else{
DelNode = Last->Prior;
if( DelNode == Visited_node )
Visited_node = Visited_node -> Prior;
Last->Prior = Last->Prior->Prior;
Last->Prior->Next = Last;
count--;
delete DelNode;
return Success;
}
}
template< class ENTRY_TYPE >
error_code Dulist< ENTRY_TYPE >::RemoveAtFront( )
{
Dunode< ENTRY_TYPE > *DelNode;
if( count == 0 )
return Unsuccess;
else {
DelNode = Head->Next;
if( DelNode == Visited_node )
Visited_node = Visited_node -> Next;
Head->Next = Head->Next->Next;
Head->Next->Prior = Head;
count--;
delete DelNode;
return Success;
}
}
template< class ENTRY_TYPE >
error_code Dulist< ENTRY_TYPE >::Delete_element( int &i )
{
Dunode< ENTRY_TYPE > *DelNode;
DelNode = Head->Next;
if( i <= 0 || i > count )
return Unsuccess;
else{
while( i != 1 )
{
DelNode = DelNode->Next;
i--;
}
DelNode->Prior->Next = DelNode->Next;
DelNode->Next->Prior = DelNode->Prior;
count--;
delete DelNode;
return Success;
}
}
template< class ENTRY_TYPE >
void Dulist< ENTRY_TYPE >::Print( )
{
Dunode< ENTRY_TYPE > *NewNode = Head;
while( NewNode->Prior != Head )
{
if( NewNode->Prior != Last )
cout << NewNode->Prior->Data << endl;
NewNode = NewNode->Prior;
}
}
template< class ENTRY_TYPE >
void Dulist< ENTRY_TYPE>::DelDulist( )
{
while( count != 0 )
RemoveAtBack( );
}
template< class ENTRY_TYPE >
error_code Dulist< ENTRY_TYPE >::Delete_elememt( ENTRY_TYPE &data )
{
Dunode< ENTRY_TYPE > *NewNode = Head;
int i = 0;
while( NewNode -> Next -> Data != data )
{
NewNode = NewNode -> Next;
i++;
}
if( Delete_element( i ) == Success )
return Success;
else return Unsuccess;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -