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

📄 s57recordset.cpp

📁 国际海图标准S-57格式数据读取源码VC
💻 CPP
字号:
#include "StdAfx.h"
#include ".\s57recordset.h"

template <class T> CS57RecordSet<T>::CS57RecordSet(int ValCnt,T val)
{
	iSetSize=ValCnt;
	SetNode<T> *pSet1,*pSet2;
	
	va_list arg_ptr;
	va_start(arg_ptr,val);
	Head=pSet1=pSet2=new   SetNode<T>;
	Head->val=val;
	Head->pre=NULL;
	for(int   i=1;i<ValCnt;i++)
	{
		pSet2=new   SetNode<T>;
		pSet1->next=pSet2;
		pSet2->pre=pSet1;
		pSet2->val=static_cast<T>va_arg(arg_ptr,T);
		pSet1=pSet2;
	}
	pSet1->next=NULL;
	
	va_end(arg_ptr);   
	//return   *this;   
}

  /*-------------------------------------------------------------   
      拷贝构造函数   
  --------------------------------------------------------------*/   
template<class T>CS57RecordSet<T>::CS57RecordSet(const   CS57RecordSet<T>&   ms)
{
	if((iSetSize=ms.iSetSize)==0)
	{
		Head=NULL;
		return;
	}
	
	SetNode<T> *pre,*curr,*msSetNode;
	msSetNode=ms.Head;
	Head=pre=curr=new   SetNode<T>;
	Head->val=msSetNode->val;
	Head->pre=NULL;
	while((msSetNode=msSetNode->next)!=NULL)
	{
		curr=new   SetNode<T>;
		curr->val=msSetNode->val;
		pre->next=curr;
		curr->pre=pre;
		pre=curr;
	}
	curr->next=NULL;
}

  /*-----------------------------------------------------------   
      析构函数   
  -----------------------------------------------------------*/ 
template<class T>  CS57RecordSet<T>::~CS57RecordSet()
{
	SetNode<T> *p=Head;
	while(Head!=NULL)
	{
		if(p->next!=NULL)
		{
			Head=p->next;
			delete   p;
			iSetSize--;
			p=Head;
		}
		else
		{
			delete   p;
			iSetSize=0;
			Head=NULL;
		}
	}
}   
  /*---------------------------------------------------   
    查找函数:确定某一元素是否在集合中,如果在返回元   
    素的地址,第一个参数为查找集合,第二个参数为查找元素   
    此函数为类内函数   bool   Find(T   val)为接口函数   
  ----------------------------------------------------*/
template<class T> SetNode<T>* CS57RecordSet<T>::Find(CS57RecordSet<T>& ms,T val)
{
	SetNode<T>*curr;
	curr=ms.Head;
	while(curr!=NULL)
	{
		if(curr->val==val)
			return   curr;
		else
			curr=curr->next;
	}
	return   NULL;
}   
    
  //----------------------------------------------------------  
template<class T> bool CS57RecordSet<T>::Find(T val)
{
	SetNode<T>*curr;
	curr=Head;
	while(curr!=NULL)
	{
		if(curr->val==val)
			return   true;
		else
			curr=curr->next;
	}
	return false;
}   

//---------------------------------------------------------
template<class T> int CS57RecordSet<T>::Capacity() const
{
	return   iSetSize;
}

//---------------------------------------------------------
template <class T> bool CS57RecordSet<T>::InsertItem(T val)
{
	SetNode<T>*   p=new   SetNode<T>;
	p->val=val;
	p->next=Head;
	Head->pre=p;
	Head=p;
	Head->pre=NULL;
	iSetSize++;
	return   true;
}

 //---------------------------------------------------------------- 
template<class T> bool CS57RecordSet<T>::DeleteItem(T   val)
{
	SetNode<T>* pre,*curr;
	curr=Head;
	while(curr!=NULL)
	{
		if(curr->val==val)
		{
			if(curr->pre==NULL)
			{
				Head=Head->next;
				Head->pre=NULL;
				delete   curr;
				iSetSize--;
				return   true;
			}
			else
			{
				(curr->pre)->next=curr->next;
				//pre->next=curr->next;
				(curr->next)->pre=curr->pre;
				delete   curr;
				iSetSize--;
				return   true;
			}
		}
		else
		{
			curr=curr->next;
		}
	}
	return   false;
}   
  //---------------------------------------------------------
template<class T> void CS57RecordSet<T>::DisplayItems() const
{
	if(Head==NULL   ||   iSetSize==0)
	{
		cout<<"{}"<<endl;
		return;
	}
	SetNode<T>*p=Head;
	cout<<"{"<<p->val;
	p=p->next;
	while(p!=NULL)
	{
		cout<<","<<p->val;
		p=p->next;
	}
	cout<<"}"<<endl;
}   


//-------------------------------------------------------
template<class T> CS57RecordSet<T> CS57RecordSet<T>::operator+(CS57RecordSet<T>&   ms)
{
	int   size=0;
	SetNode<T>*   curr,*temp,*pre,*ResultHead;
	temp=Head;
	while(temp!=NULL)
	{
		if(Find(ms,temp->val)==NULL)
		{
			size++;
			curr=new   SetNode<T>;
			if(size==1)
			{
				curr->val=temp->val;
				pre=ResultHead=curr;
				ResultHead->pre=NULL;
				ResultHead->next=NULL;
			}
			else
			{
				curr->val=temp->val;
				pre->next=curr;
				curr->pre=pre;
				curr->next=NULL;
				pre=curr;
			}
		}
		temp=temp->next;
	}
	temp=ms.Head;
	size+=ms.iSetSize;
	while(temp!=NULL)
	{
		curr=new   SetNode<T>;
		curr->val=temp->val;
		curr->pre=pre;
		pre->next=curr;
		curr->next=NULL;
		pre=curr;
		temp=temp->next;
	}
	CS57RecordSet<T> Result;
	Result.iSetSize=size;
	Result.Head=ResultHead;
	
	return Result;
}   
  //-------------------------------------------------------
template<class T> CS57RecordSet<T>   CS57RecordSet<T>::operator-(CS57RecordSet<T>&   ms)
{
	int   size=0;
	SetNode<T>*   curr,*temp,*pre,*ResultHead;
	temp=Head;
	while(temp!=NULL)
	{
		if(Find(ms,temp->val)==NULL)
		{
			size++;
			curr=new   SetNode<T>;
			if(size==1)
			{
				curr->val=temp->val;
				pre=ResultHead=curr;
				ResultHead->pre=NULL;
				ResultHead->next=NULL;
			}
			else
			{
				curr->val=temp->val;
				pre->next=curr;
				curr->pre=pre;
				curr->next=NULL;
				pre=curr;
			}
		}
		temp=temp->next;
	}
	CS57RecordSet<T> Result;
	Result.iSetSize=size;
	Result.Head=ResultHead;
	return   Result;
}   

//-----------------------------------------------------------------------------
template<class T> CS57RecordSet<T> CS57RecordSet<T>::operator*(CS57RecordSet<T>&   ms)
{
	int   size=0;
	SetNode<T>*   curr,*temp,*pre,*ResultHead;
	temp=Head;
	while(temp!=NULL)
	{
		if(Find(ms,temp->val)!=NULL)
		{
			size++;
			curr=new   SetNode<T>;
			if(size==1)
			{
				curr->val=temp->val;
				pre=ResultHead=curr;
				ResultHead->pre=NULL;
				ResultHead->next=NULL;
			}
			else
			{
				curr->val=temp->val;
				pre->next=curr;
				curr->pre=pre;
				curr->next=NULL;
				pre=curr;
			}
		}
		temp=temp->next;
	}
	CS57RecordSet<T> Result;
	Result.iSetSize=size;
	Result.Head=ResultHead;
	return   Result;
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -