65,186
社区成员




template <class T> class ListNode
{
T data;
ListNode<T>* link;
public:
ListNode():link(NULL){}
ListNode(T value):link(NULL),data(value){}
~ListNode(){}
void SetLink(ListNode<T>* next);
ListNode<T>* GetLink();
T& GetData();
};
template <class T>
void ListNode<T>::SetLink(ListNode<T>* next)
{
link=next;
}
template <class T>
ListNode<T>* ListNode<T>::GetLink()
{
return link;
}
template <class T>
T& ListNode<T>::GetData()
{
return data;
}
template <class T> class List
{
ListNode<T>* head;
ListNode<T>* tail;
public:
List();
~List(){};
bool AddTail(T value);
bool RemoveTail();
bool InsertAt(int index,T value);
bool RemoveAt(int index);
T& GetAt(int index);
bool IsEmpty();
int GetCount();
void RemoveAll();
ListNode<T>* GetHead();
ListNode<T>* GetTail();
void SetTail(ListNode<T>* newtail);
ListNode<T>* GetNodeAt(int index);
ListNode<T>* GetCur();
ListNode<T>* TowardCur();
};
template <class T>
List<T>::List()
{
head=tail=new ListNode<T>;
tail->SetLink(NULL);
}
template <class T>
bool List<T>::AddTail(T value)
{
ListNode<T>* add=new ListNode<T> (value);
tail->SetLink(add);
tail=tail->GetLink();
tail->SetLink(NULL);
if(tail!=NULL)
{
return true;
}
else
return false;
}
template <class T>
bool List<T>::RemoveTail()
{
return RemoveAt(this->GetCount()-1);
}
template <class T>
bool List<T>::InsertAt(int index,T value)
{
if(index>this->GetCount()-1 || index<0)
{cout<<"A wrong position!\n";
return false;
}
ListNode<T>* current=head;
while(index)
{
current=current->GetLink();
--index;
}
ListNode<T>* add=new ListNode<T> (value);
add->SetLink(current->GetLink());
current->SetLink(add);
if(current->GetLink()!=NULL)
{
return true;
}
else
return false;
}
template <class T>
bool List<T>::RemoveAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{
cout<<"A wrong position!\n";
return false;
}
ListNode<T>* cur,*curPre;
cur=head;
curPre=cur->GetLink();
while(index)
{
cur=cur->GetLink();
curPre=curPre->GetLink()
--index;
}
if(tail==curPre)
{tail=cur;
}
cur->SetLink(curPre->GetLink());
if(curPre!=NULL)
{
return true;
}
else
return false;
}
template <class T>
T& List<T>::GetAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{cout<<" A wrong position!\n";}
ListNode<T>* cur;
cur=head->GetLink();
while(index)
{
cur=cur->GetLink();
--index;
}
return cur->GetData();
}
template <class T>
bool List<T>::IsEmpty()
{
return head->GetLink()==NULL;
}
template <class T>
int List<T>::GetCount()
{
int count=0;
ListNode<T>* current=head->GetLink();
while(current!=NULL)
{
++count;
current=current->GetLink();
}
return count;
}
template <class T>
void List<T>::RemoveAll()
{
ListNode<T>* cur;
while(head->GetLink()!=NULL)
{
cur=head->GetLink();
head->SetLink(cur->GetLink());
delete cur;
}
tail=head;
}
template <class T>
ListNode<T>* List<T>::GetHead()
{
return head;
}
template <class T>
ListNode<T>* List<T>::GetTail()
{
return tail;
}
template <class T>
void List<T>::SetTail(ListNode<T>* newtail)
{
tail=newtail;
}
template <class T>
ListNode<T>* List<T>::GetNodeAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{cout<<"A wrong position!\n";}
ListNode<T>* handle=head->GetLink();
while(index)
{
handle=handle->GetLink();
--index;
}
return handle;
}
template <class T>
ListNode<T>* List<T>::GetCur()
{
return cur;
}
template <class T>
ListNode<T>* List<T>::TowardCur()
{
cur=cur->GetLink();
return cur;
}
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
List<int> listFirst;
List<int> listSecond;
listFirst.AddTail(1);
listFirst.AddTail(6);
listFirst.AddTail(8);
listFirst.AddTail(9);
listFirst.AddTail(13);
listSecond.AddTail(0);
listSecond.AddTail(3);
listSecond.AddTail(4);
listSecond.AddTail(6);
listSecond.AddTail(11);
listSecond.AddTail(17);
while(listSecond.GetCount()!=0)
{
int indexFirst=0;
while(listSecond.GetAt(0)>listFirst.GetAt(indexFirst))
{
++indexFirst;
if(indexFirst==listFirst.GetCount())
{
break;
}
}
if(indexFirst==listFirst.GetCount())
{
listFirst.AddTail(listSecond.GetAt(0));
listSecond.RemoveAt(0);
}
else
{
listFirst.InsertAt(indexFirst,listSecond.GetAt(0));
listSecond.RemoveAt(0);
}
}
return 0;
}
[Quote=引用 5 楼 yiruirui0507 的回复:]
引用 2 楼 healer_kx 的回复:
模板的代码把实现和声明都放到一起吧,不要.cpp文件了。根本就不会支持这种分离了。
已经成功解决。请问你这里说的:模板的代码把实现和声明都放到一起吧,不要.cpp文件了,不支持这种分离??你的这句话是什么意思?能够举个简单的例子让我领悟一下?
[/Quote]
就是说,一般我们可以把类的声明之类的放在.h里,然后把实现放在.cpp里,比如:
test.h:
class A
{
public:
void fun();//这里是声明
};
test.cpp:
#include "test.h"
void A::fun()
{
//这里是实现
}
对于模板,很多编译器都不支持分离编译,需要把.h和.cpp合在一个.h里:
template <typename T>
class A
{
public:
void fun(T t1)
{
//实现和声明在一起
}
};
#include<stdio.h>
template <class T> class ListNode
{
T data;
ListNode<T>* link;
public:
ListNode():link(NULL){}
ListNode(T value):link(NULL),data(value){}
~ListNode(){}
void SetLink(ListNode<T>* next);
ListNode<T>* GetLink();
T& GetData();
};
template <class T>
void ListNode<T>::SetLink(ListNode<T>* next)
{
link=next;
}
template <class T>
ListNode<T>* ListNode<T>::GetLink()
{
return link;
}
template <class T>
T& ListNode<T>::GetData()
{
return data;
}
template <class T> class List
{
ListNode<T>* head;
ListNode<T>* tail;
public:
List();
~List(){};
bool AddTail(T value);
bool RemoveTail();
bool InsertAt(int index,T value);
bool RemoveAt(int index);
T& GetAt(int index);
bool IsEmpty();
int GetCount();
void RemoveAll();
ListNode<T>* GetHead();
ListNode<T>* GetTail();
void SetTail(ListNode<T>* newtail);
ListNode<T>* GetNodeAt(int index);
ListNode<T>* GetCur();
ListNode<T>* TowardCur();
};
template <class T>
List<T>::List()
{
head=tail=new ListNode<T>;
tail->SetLink(NULL);
}
template <class T>
bool List<T>::AddTail(T value)
{
ListNode<T>* add=new ListNode<T> (value);
tail->SetLink(add);
tail=tail->GetLink();
tail->SetLink(NULL);
if(tail!=NULL)
{
return true;
}
else
return false;
}
template <class T>
bool List<T>::RemoveTail()
{
return RemoveAt(this->GetCount()-1);
}
template <class T>
bool List<T>::InsertAt(int index,T value)
{
if(index>this->GetCount()-1 || index<0)
{cout<<"A wrong position!\n";
return false;
}
ListNode<T>* current=head;
while(index)
{
current=current->GetLink();
--index;
}
ListNode<T>* add=new ListNode<T> (value);
add->SetLink(current->GetLink());
current->SetLink(add);
if(current->GetLink()!=NULL)
{
return true;
}
else
return false;
}
template <class T>
bool List<T>::RemoveAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{
cout<<"A wrong position!\n";
return false;
}
ListNode<T>* cur,*curPre;
cur=head;
curPre=cur->GetLink();
while(index)
{
cur=cur->GetLink();
curPre=curPre->GetLink();
--index;
}
if(tail==curPre)
{tail=cur;
}
cur->SetLink(curPre->GetLink());
if(curPre!=NULL)
{
return true;
}
else
return false;
}
template <class T>
T& List<T>::GetAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{cout<<" A wrong position!\n";}
ListNode<T>* cur;
cur=head->GetLink();
while(index)
{
cur=cur->GetLink();
--index;
}
return cur->GetData();
}
template <class T>
bool List<T>::IsEmpty()
{
return head->GetLink()==NULL;
}
template <class T>
int List<T>::GetCount()
{
int count=0;
ListNode<T>* current=head->GetLink();
while(current!=NULL)
{
++count;
current=current->GetLink();
}
return count;
}
template <class T>
void List<T>::RemoveAll()
{
ListNode<T>* cur;
while(head->GetLink()!=NULL)
{
cur=head->GetLink();
head->SetLink(cur->GetLink());
delete cur;
}
tail=head;
}
template <class T>
ListNode<T>* List<T>::GetHead()
{
return head;
}
template <class T>
ListNode<T>* List<T>::GetTail()
{
return tail;
}
template <class T>
void List<T>::SetTail(ListNode<T>* newtail)
{
tail=newtail;
}
template <class T>
ListNode<T>* List<T>::GetNodeAt(int index)
{
if(index>this->GetCount()-1 || index<0)
{cout<<"A wrong position!\n";}
ListNode<T>* handle=head->GetLink();
while(index)
{
handle=handle->GetLink();
--index;
}
return handle;
}
template <class T>
ListNode<T>* List<T>::GetCur()
{
return cur;
}
template <class T>
ListNode<T>* List<T>::TowardCur()
{
cur=cur->GetLink();
return cur;
}
#include "List.h"
#include<iostream>
using namespace std;
int main()
{
List<int> listFirst;
List<int> listSecond;
listFirst.AddTail(1);
listFirst.AddTail(6);
listFirst.AddTail(8);
listFirst.AddTail(9);
listFirst.AddTail(13);
listSecond.AddTail(0);
listSecond.AddTail(3);
listSecond.AddTail(4);
listSecond.AddTail(6);
listSecond.AddTail(11);
listSecond.AddTail(17);
while(listSecond.GetCount()!=0)
{
int indexFirst=0;
while(listSecond.GetAt(0)>listFirst.GetAt(indexFirst))
{
++indexFirst;
if(indexFirst==listFirst.GetCount())
{
break;
}
}
if(indexFirst==listFirst.GetCount())
{
listFirst.AddTail(listSecond.GetAt(0));
listSecond.RemoveAt(0);
}
else
{
listFirst.InsertAt(indexFirst,listSecond.GetAt(0));
listSecond.RemoveAt(0);
}
}
for(int i=0;i<=listFirst.GetCount()-1;i++)
cout<<listFirst.GetAt(i);
return 0;
}