📄 s57recordset.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 + -