代碼通俗易通,如下
List.h
#include<stdio.h><br />template <class T> class ListNode<br />{<br /> T data;<br /> ListNode<T>* link;<br /> public:<br /> ListNode():link(NULL){}<br /> ListNode(T value):link(NULL),data(value){}<br /> ~ListNode(){}<br /> void SetLink(ListNode<T>* next);<br /> ListNode<T>* GetLink();<br /> T& GetData();</p><p>};<br />template <class T><br />void ListNode<T>::SetLink(ListNode<T>* next)<br />{<br /> link=next;<br />}<br />template <class T><br />ListNode<T>* ListNode<T>::GetLink()<br />{<br /> return link;<br />}<br />template <class T><br />T& ListNode<T>::GetData()<br />{<br /> return data;<br />}</p><p>template <class T> class List<br />{<br /> ListNode<T>* head;<br /> ListNode<T>* tail;<br /> public:<br /> List();<br /> ~List(){};<br /> bool AddTail(T value);<br /> bool RemoveTail();<br /> bool InsertAt(int index,T value);<br /> bool RemoveAt(int index);<br /> T& GetAt(int index);<br /> bool IsEmpty();<br /> int GetCount();<br /> void RemoveAll();<br /> ListNode<T>* GetHead();<br /> ListNode<T>* GetTail();<br /> void SetTail(ListNode<T>* newtail);<br /> ListNode<T>* GetNodeAt(int index);<br /> ListNode<T>* GetCur();<br /> ListNode<T>* TowardCur();<br />}; </p><p>template <class T><br />List<T>::List()<br />{<br /> head=tail=new ListNode<T>;<br /> tail->SetLink(NULL);<br />}<br />template <class T><br />bool List<T>::AddTail(T value)<br />{<br />ListNode<T>* add=new ListNode<T> (value);<br />tail->SetLink(add);<br />tail=tail->GetLink();<br />tail->SetLink(NULL);<br />if(tail!=NULL)<br />{<br /> return true;<br />}<br />else<br />return false;<br />}<br />template <class T><br />bool List<T>::RemoveTail()<br />{<br /> return RemoveAt(this->GetCount()-1);</p><p>}<br />template <class T><br />bool List<T>::InsertAt(int index,T value)<br />{<br /> if(index>this->GetCount()-1 || index<0)<br /> {cout<<"A wrong position!/n";<br /> return false;<br /> }<br /> ListNode<T>* current=head;<br /> while(index)<br /> {<br /> current=current->GetLink();<br /> --index;<br /> }<br /> ListNode<T>* add=new ListNode<T> (value);<br /> add->SetLink(current->GetLink());<br /> current->SetLink(add);</p><p> if(current->GetLink()!=NULL)<br /> {<br /> return true;<br /> }<br /> else<br /> return false;<br />}<br />template <class T><br />bool List<T>::RemoveAt(int index)<br />{<br /> if(index>this->GetCount()-1 || index<0)<br /> {<br /> cout<<"A wrong position!/n";<br /> return false;<br /> }<br />ListNode<T>* cur,*curPre;<br />cur=head;<br />curPre=cur->GetLink();<br />while(index)<br />{<br /> cur=cur->GetLink();<br /> curPre=curPre->GetLink();<br /> --index;<br />}<br />if(tail==curPre)<br />{tail=cur;<br />}<br />cur->SetLink(curPre->GetLink());<br />if(curPre!=NULL)<br />{<br /> return true;<br />}<br />else<br />return false;<br />}<br />template <class T><br />T& List<T>::GetAt(int index)<br />{<br /> if(index>this->GetCount()-1 || index<0)<br /> {cout<<" A wrong position!/n";}<br /> ListNode<T>* cur;<br /> cur=head->GetLink();<br /> while(index)<br /> {<br /> cur=cur->GetLink();<br /> --index;<br /> }<br /> return cur->GetData();<br />}<br /> template <class T><br /> bool List<T>::IsEmpty()<br /> {<br /> return head->GetLink()==NULL;<br /> }<br /> template <class T><br /> int List<T>::GetCount()<br /> {<br /> int count=0;<br /> ListNode<T>* current=head->GetLink();<br /> while(current!=NULL)<br /> {<br /> ++count;<br /> current=current->GetLink();<br /> }<br /> return count;<br /> }<br /> template <class T><br /> void List<T>::RemoveAll()<br /> {<br /> ListNode<T>* cur;<br /> while(head->GetLink()!=NULL)<br /> {<br /> cur=head->GetLink();<br /> head->SetLink(cur->GetLink());<br /> delete cur;<br /> }<br /> tail=head;<br /> }<br />template <class T><br />ListNode<T>* List<T>::GetHead()<br />{<br /> return head;<br />}<br />template <class T><br />ListNode<T>* List<T>::GetTail()<br />{<br /> return tail;<br />}<br />template <class T><br />void List<T>::SetTail(ListNode<T>* newtail)<br />{<br /> tail=newtail;<br />}<br />template <class T><br />ListNode<T>* List<T>::GetNodeAt(int index)<br />{<br /> if(index>this->GetCount()-1 || index<0)<br /> {cout<<"A wrong position!/n";}<br /> ListNode<T>* handle=head->GetLink();<br /> while(index)<br /> {<br /> handle=handle->GetLink();<br /> --index;<br /> }<br /> return handle;<br />}<br />template <class T><br />ListNode<T>* List<T>::GetCur()<br />{<br /> return cur;<br />}<br />template <class T><br />ListNode<T>* List<T>::TowardCur()<br />{<br /> cur=cur->GetLink();<br /> return cur;<br />}
List.cpp
#include "List.h"<br />#include<iostream><br />//#include<stdio.h><br />using namespace std;<br />int main()<br />{<br /> List<int> listFirst;<br /> List<int> listSecond;<br /> listFirst.AddTail(1);<br /> listFirst.AddTail(6);<br /> listFirst.AddTail(8);<br /> listFirst.AddTail(9);<br /> listFirst.AddTail(13);<br /> listSecond.AddTail(0);<br /> listSecond.AddTail(3);<br /> listSecond.AddTail(4);<br /> listSecond.AddTail(6);<br /> listSecond.AddTail(11);<br /> listSecond.AddTail(17);<br /> while(listSecond.GetCount()!=0)<br /> {<br /> int indexFirst=0;<br /> while(listSecond.GetAt(0)>listFirst.GetAt(indexFirst))<br /> {<br /> ++indexFirst;<br /> if(indexFirst==listFirst.GetCount())<br /> {<br /> break;<br /> }<br /> }<br /> if(indexFirst==listFirst.GetCount())<br /> {<br /> listFirst.AddTail(listSecond.GetAt(0));<br /> listSecond.RemoveAt(0);</p><p> }<br /> else<br /> {<br /> listFirst.InsertAt(indexFirst,listSecond.GetAt(0));<br /> listSecond.RemoveAt(0);<br /> }<br /> }<br />for(int i=0;i<=listFirst.GetCount()-1;i++)<br />cout<<listFirst.GetAt(i)<<endl;<br />listFirst.InsertAt(2,32);<br />for(int j=0;j<=listFirst.GetCount()-1;j++)<br />cout<<listFirst.GetAt(j)<<endl;<br /> return 0;<br />}<br />
學過C語言+物件導向思想的+對指標有點理解的就完全OK了!