⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dulist.h

📁 本题所涉及的有关操作是从控件中选择所要创建的链表的类型(用VC的Radio Button 实现选择)
💻 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 + -