Vector_List类的基础实现

时间:2022-05-03 16:05:23

代码如下:

/*带头循环双向链表类的基本实现 */ 
#include<iostream>
using namespace std;

typedef int DataType; 

struct ListNode 
{ 
	ListNode* next; 
	ListNode* prev; 

	DataType data; 

	ListNode(DataType x) 
	:data(x) 
	,next(NULL) 
	,prev(NULL) 
	{} 
}; 

class List 
{ 
	typedef ListNode Node; 
	public: 
	List() //构造
	:_head(new Node(DataType())) 
	{ 
		_head->next = _head; 
		_head->prev = _head; 
	} 

	List(const List& l) //拷贝构造
	:_head(new Node(DataType()))
	
	
	{
		_head->next=_head;
		_head->prev=_head;
		Node* stand1=_head;
		Node* stand2=l._head->next;
	
		
		do
		{
			Node* node=new Node(stand2->data);
			stand1->next=node;
			node->prev=stand1;
			stand1=node;
            stand2=stand2->next;
		}
		while(stand2!=l._head);
		stand1->next=_head;
		_head->prev=stand1;
	}
	List& operator=(const List& l) //运算符重载
	{
        Node* cur=_head->next;
		Node* lcur=l._head->next;
		int clen=0;
		int llen=0;
        if(_head->next!=_head)
       {
		do
		{
			clen++;
			cur=cur->next;
		}
		while(cur!=_head);
	   }
	   else
		   clen=0;
         if(l._head->next!=l._head)
		 {
		do
		{
			llen++;
			lcur=lcur->next;
			}
			while(lcur!=l._head);
		  }
		  else
			  llen=0;
		
		cur=_head->next;
		lcur=l._head->next;
		//1.长度相等 2.长度大于 3.长度小于
		if(clen==llen)
		{
			if(clen!=0)
			{
			do
			{
				cur->data=lcur->data;
				cur=cur->next;
				lcur=lcur->next;
			}
			while(cur!=_head);
			return *this;
			}
			else
				return *this;
		}
		else if(clen>llen)
		{
			if(llen!=0)
			{
               do
			   {
				   cur->data=lcur->data;
				   cur=cur->next;
				   lcur=lcur->next;
			   }
			   while(lcur!=l._head);
			   Node* parent=cur->prev;
			   while(cur!=_head)
			   {
				   Node* xx=cur;
				   cur= cur->next;
				   delete xx;
			   }
			   parent->next=_head;
			   _head->prev=parent;
               
			   return *this;
			}
			else
			{
               Node* stand=_head->next;
			   do
			   {
				   Node* xx=stand;
				   stand=stand->next;
				   delete xx;
			   }
			   while(stand!=_head);
                _head->next=_head;
				_head->prev=_head;
			   return *this;

			}
		}
		else//clen<llen
		{
			if(clen!=0)
			{
				do
				{
					cur->data=lcur->data;
					cur=cur->next;
					lcur=lcur->next;
				}
				while(cur!=_head);
				Node* parent=cur->prev;
				do
				{
                 Node* node =new Node(lcur->data);
				 parent->next=node;
				 node->prev=parent;
				 parent=node;
				 lcur=lcur->next;
				}
				while(lcur!=l._head);
                parent->next=_head;
				_head->prev=parent;
				return *this;
			}
			else
			{
				Node* stand=_head->next;
				do
				{
					
					Node* node=new Node(lcur->data);
					stand->next=node;
					node->prev=stand;
					stand=node;
					lcur=lcur->next;
				}
				while(lcur!=l._head);
				_head->prev=stand;
				stand->next=_head;
				return *this;
			}

		}

        
		}
	~List()
	{
         Node* stand=_head->next;
		 if(stand!=_head)
		 {
			 do
			 {
				 Node* xx=stand;
				 stand=stand->next;
				 delete xx;
			 }
			 while(stand!=_head);
			 delete _head;
		 }
		 else
		 {
		 delete _head;
		 }
		 _head==NULL;
		}
	

	void PushBack(DataType x) //尾插
	{
	   Node* stand=_head->prev;
	
	   Node* node(new Node(x));
	  // node->data=x;
	   stand->next=node;
	   node->prev=stand;
	   node->next=_head;
	   _head->prev=node;
		cout<<node<<endl;
	}
	void PushFront(DataType x) //头插
    {
		Node* stand=_head->next;
		Node* node(new Node(x));
		//node->data=x;
		_head->next=node;
		node->prev=_head;
		node->next=stand;
		stand->prev=node;
	}
	void PopBack() //尾删
	{
		if(_head->next!=_head)
       {
     Node* stand=_head->prev;
	 stand->prev->next=_head;
	 _head->prev=stand->prev;
	 delete stand;
	   }

	}
	void PopFront() //头删
	{
			if(_head->next!=_head)
			{
			Node* stand=_head->next;
			_head->next=stand->next;
			stand->next->prev=_head;
			delete stand;
		}
	}
	Node* Find(DataType x)//查找 
	{
		if(_head!=NULL)
		{
      Node* stand=_head;
	  do
	  {
		if(stand->data==x)
			return stand;
			stand=stand->next;
	  }
	  while(stand!=_head);
	  return NULL;
		}
		return NULL;

	}
	void Insert(Node* pos, DataType x)//插入 
	{
        Node* stand=_head->next;
		
		
			do
			{
				if(stand==pos)
				{
					Node* node(new Node (x));
				//	node->data=x;
					stand->prev->next=node;
					node->prev=stand->prev;
					node->next=stand;
					stand->prev=node;
					cout<<"插入成功"<<endl;
					return;
				}
				stand=stand->next;
			}
				while(stand!=_head);
				cout<<"插入失败"<<endl;
		}

	void Erase(Node* pos) //销毁节点
		{
			Node* stand=_head->next;
		if(stand!=_head)
		{
			do
			{
				if(stand==pos)
				{
                   stand->prev->next=stand->next;
				   stand->next->prev=stand->prev;
				   delete stand;
				   return;
				}
				stand=stand->next;
			}
			while(stand!=_head);
			cout<< "欲删除的节点不存在 "<<endl;
		}
		cout<<"链表没有节点"<<endl;
	}
	void print()
	{
		Node* stand=_head->next;
		while(stand!=_head)
		{
			cout<<stand->data<<endl;
			stand=stand->next;
		}
		
			
			
		
	}
	private: 
	Node* _head; 
}; 
void test()
{
	List l;
	l.PushBack(1);
	l.PushBack(2);
	l.PushBack(3);
	l.PushBack(4);
//	l.PushFront(1);
//	l.PushFront(1);
//	l.PopFront();
//	l.PopFront();
//	l.PopBack();
//	l.PopBack();
//	l.Insert( (ListNode*)0x9e04028,5);
//	List v(l);
//	List a1;
//	a1=v;
//	List a2;
//	a2.PushBack(1);
//	a2=v;
//	//  List a3;
//	a3.PushBack(1);
//	a3.PushBack(2);
//	a3.PushBack(3);
//	a3.PushBack(4);
//	a3.PushBack(5);
//    a3=v;
	cout<<l.Find(1)<<endl;
	l.print();

}
int main()
{
	test();
	return 0;
}

 /* 顺序表类的基础实现*/

//#include<iostream>
//using namespace std;
//
//typedef int DataType; 
//
//class Vector 
//{ 
//	public: 
//	Vector() 
//	:_first(new DataType[10])
//	,_finish(_first)
//	,_endofstorage(&_first[10])
//	{
//	}
//	Vector( Vector& v)
//	:_first(new DataType[v.Capacity()])
//	,_finish(_first)
//	,_endofstorage(&_first[v.Capacity()])
//	{
//	//	_first=new DataType[v.Capacity()];
//		DataType* stand=_first;
//        DataType* ffirst=v._first;
//		DataType* ffinish=v._finish;
//		while(ffirst!=ffinish)
//		{
//			*stand=*ffirst;
//			stand++;
//			ffirst++;
//		}
//		_finish=stand;
//		_endofstorage=&_first[v.Capacity()];
//
//	}
//	Vector& operator=(const Vector& v); 
//	~Vector()
//	{
//		if(_first)
//		{
//			cout<<".............."<<endl;
//			delete[] _first;
//		}
//		_first=_finish=_endofstorage=NULL;
//	}
//	size_t Size() 
//	{
//		return (_finish - _first);
//	}
//	size_t Capacity() 
//	{
//		return (_endofstorage - _first);
//	}
//	void Expand(size_t n)
//	{
//		if(n>Capacity())
//		{
//			DataType* stand=new DataType[n];
//			DataType*  sfirst=stand;
//			DataType*  sfinish;
//			DataType*  sendofstorage;
//			DataType*  afirst=_first;
//			size_t  len=Capacity();
//			while(afirst!=_finish)
//			{
//			  *sfirst = *afirst;
//			   sfirst++;
//			  afirst++;
//			}
//            sfinish=sfirst;
//			sendofstorage=&stand[len];
//			if(_first)
//			delete[] _first;
//			_first=stand;
//			_finish=sfinish;
//			_endofstorage=&_first[n];
//		}
//	}
//	void PushBack(DataType x) 
//	{
//        if(_finish == _endofstorage)
//		{
//			cout<<">>>>>>"<<endl;
//          Reserve(Capacity()*2+1);
//		}
//		*_finish=x;
//		_finish++;
//
//	}
//	void Reserve(size_t n) 
//	{
//		Expand(n);
//	}
//	void PopBack()
//	{
//	    if(Size()>0)
//		//	cout<<"ccccccccc"<<endl;
//		_finish--;
//	
//
//	}
//
//	void Insert(size_t pos, DataType x)
//	{
//		if(pos<0||pos>Size())
//			return;
//      if(_finish==_endofstorage)
//	  {
//		  Reserve(Capacity()*2);
//	  }
//	 // DataType* stand=&_first[pos];
//	 // DataType* fistand=_finish;
//	 for(int i=Size();i>pos;i--)
//	 {
//		 _first[i]=_first[i-1];
//	 }
//	 _first[pos]=x;
//	 _finish++;
//	}
//	void Erase(size_t pos) 
//	{
//		if(pos<0||pos>=Size())
//			return;
//			for(int i=pos;i<Size()-1;i++)
//			{
//               _first[i]=_first[i+1];
//
//			}
//			_finish--;
//	}
//	size_t Find(DataType x)
//	{
//		DataType* stand=_first;
//		while(stand!=_finish)
//		{
//			if(*stand==x)
//			{
//				return stand  - _first;
//			}
//			stand++;
//		}
//		return -1;
//	}
//	void print()
//	
//	{
//		cout<<Size()<<endl;
//       DataType* stand=_first;
//		while(stand!=_finish)
//		{
//			cout<<*stand<<endl;
//			stand++;
//		}
//	}
//	private: 
//	DataType* _first; 
//	DataType* _finish; 
//	DataType* _endofstorage; 
//};
//void test()
//{
//	Vector v;
//	v.PushBack(1);
//	v.PushBack(2);
//	v.PushBack(3);
//	v.PushBack(4);
//	v.PushBack(5);
//	v.PushBack(6);
//	v.PushBack(7);
//	v.PushBack(8);
//	v.PushBack(9);
//	v.PushBack(10);
//	v.PushBack(11);
////	v.Insert(3,21);
////	v.Insert(10,22);
////	v.Find(22);
////	cout<<v.Find(11)<<endl;
//	v.Erase(8);
////	v.PopBack();
////	v.PopBack();
////	v.PopBack();
////	v.PopBack();
////	v.PopBack();
//	Vector vv=v;
//	v.print();
//}
//int main()
//{
//	test();
//	return 0;
//}