#include<iostream.h>
#include"SingleNode.h"
template<class T>
class SingleLinkedList
{
public:
SingleNode<T> *head; // 單鏈表頭結點
SingleLinkedList(); //構造空單鏈表
SingleLinkedList(T value [],int n); //構造由指定數組提供元素的單鏈表
~SingleLinked(); //析構
bool isEmpty(); //判斷單鏈表是否爲空
int GetLength (); //求單鏈表長度
SingleLinkedList <T> *GetNode (int i); //求第i個結點指針
T GetElem (int i); //求第i個節點的元素
bool SetElem ( int i, T x); //設置第i個結點的元素
friend ostream&operator << (ostream& out,SingleLinkedList<T>&List); //友元輸出單鏈表所有元素
SingleNode<T> *InsertElem (int i, T x); // 插入x作爲第i個結點,返回新插入結點指針
bool RemoveElem (int i, T& Old); // 刪除第i個結點,被刪除元素存放在Old變量中
void ClearList (); //清空單鏈表
};
template<class T>
SingleLinkedList <T>::SingleLinkedList()
{
this->head = NULL;
}
template <class T>
SinglekedList<T>::SinglekedList(T value[],int n)
{
head = NULL;
if(n>0)
{
head =h new SingleNode<T>(value[0]);
SinglekedNode<T> *read = head;//指向單鏈表最後一個元素
int i=1;
while(i<n)
{
read->next = new SingleNode<T>(value[i++]);
read=read->next
}
}
}
template <class T>
SingleLinked<T>::~SingLinkedList()
{
ClearList();
}
template<class T>
bool SingLinkedList<T>::isEmpty()
{
return head==NULL;
}
template<class T>
int SingleLinkedList<T>::GetLength() //單鏈表遍歷
{
int i=0;
SingleNode<T> *p=head;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
template<class T>
SingleNode<T>*SingleLinkedList<T>::GetNode(int i) //求第i個結點指針
{
if(i<0)
return NULL;
int j=0;
SingleNode<T> *p=head;
while(p!=NULL&&j<i)
{
j++;
p=p->next;
}
return p;
}
template<class T>
T SingleLinkedList<T>::GetElem(int i)
{
SingleNode<T> *p = GetNode(i);
if(p!=NULL)
return p->data;
throw "單鏈表空或參數i指定元素序號無效";
}
template <class T>
bool SingleLinkedList<T>::SetElem(int i, T x)//設置第i個結點元素爲x
{
SingleNode<T>*p = GetNode(i);
if(p!=NULL)
{
p->data = x;
return true;
}
else
return false;
}
template<class T>
ostream &operator<<(ostream &out, SingleLinkedList<T>&List)
{
SingleNode<T> *p = List.head;
out <<"(";
while(p != NULL)
{
out <<p->data;
p = p->next;
if(p!= NULL)
out<<" ,";
}
out<<")\n";
return out;
}
template<class T>
void SingleLinkedList<T>::ClearList()
{
SingleNode<T> *p=head;
while(p!=NULL)
{
SingleNode<T> *q=p;
p=p->next;
delete q;
}
head = NULL;
}
template <class T>
SingleNode<T> *SingleLinkedList<T>::InsertElem(int i,T x) //單鏈表插入操作
{
SingleNode<T> *q=NULL;
if(head == NULL || i< 0) //頭插入
{
q = new SingleNode<T>(x, head);
head = q;
}
else //單鏈表不空且i>=1
{
int j = 0;
SingleNode<T> *p = head; //尋找插入位置
while(p ->next!=NULL&&j<i-1)
{
j++;
p = p-> next;
} // 循環停止時,p指向第i-1個結點或鏈表最後一個結點
q= new SingleNode<T>(x,p->next); //插入x作爲p結點的後繼結點
p->next =q;
}
return q;
}
template<class T>
bool SingleLinkedList<T>::RemoveElem (int i,T& Old) //刪除第i個結點,被刪除元素存放在Old變量中
{
if(head!=NULL && i>=0)
if(i == 0) //頭刪除
{
SingleNode<T> *q =head;
Old = q->head;
head = head ->next;
delete q; // 釋放結點佔用的存儲單元
return true;
}
else // 中間/尾刪除
{
SingleNode<T> *p =GetNode(i-1); //p指向待刪除結點的前驅結點
if(p!=NULL && p->next!=NULL)
{
SingleNode<T> *q=p->next; // q結點爲p結點的後繼結點
Old = q->data;
p->next =q->next; //刪除p的後繼結點q
delete q;
return true;
}
}
return false;
}
#define _CRT_SECURE_NO_WARNINGS
#include"SingleLinkedList.h"
void ConcatList(SingleLinkedList<char>&Lista, SingleLinkedList<char>&Listb)
{
if(Lista.head==NULL)
Lista.head = Listb.head;
elae
{
SingleNode<char> *p=Lista.head;
while(p->next!=NULL)
p=p->next;
p->next=Listb.head;
}
Listb.head=NULL;
}
void main()
{
SingleLinkedList<char>Lista("abc",3);
SingleLinkedList<char>Listb("xy",2);
cout<<"Lista:"<<Lista<<"\n";
cout<<"Listb:"<<Listb<<"\n";
ConcatList(Lista,Listb);
cout<<"Lista+Listb:"<<Lista<<"\n";
}