單鏈表(合併單鏈表)

        鏈式結構由於每個結點只有一個指向直接後繼的指針域,因此當訪問過一個結點後,只能接着訪問它的後繼結點,而無法訪問它的前驅結點,這樣的單項鍊表稱爲單向鏈表。 

 單鏈表遍歷:
        單鏈表遍歷是從單鏈表頭指針head開始訪問,沿着next指針所指示的方向依次訪問每一個結點,且每個結點只能訪問依次,直到最後一個結點爲止。遍歷時注意,不要改變head指針的指向。因此一般設置另外的一個指針變量如p,p從head開始依次訪問一個結點,直到鏈表結束,此時p = NULL,完成依次遍歷

單鏈表插入:
       插入結點是將值爲x的新結點插入到單鏈表的第i個結點位置上,在插入時,需要先找到第i-1個結點,再在其後插入新結點。假設要在單鏈表的倆個數據域爲A何B的結點之間插入一個數據域爲X的結點,已知p指向數據域爲A的結點,q指向數據域爲x的結點,爲了插入結點*q,需要修改結點*p中的指針域,使其指向結點*q,而結點*q的指針域應該指向數據域爲B的結點。
 
單鏈表刪除操作:
       單鏈表的刪除操作是將單鏈表的第i個結點刪除。先在單鏈表中找到第i-1個結點,再刪除其後的結點。若要刪除結點B,僅需要修改結點A的指針域。假設p是指向結點A的指針,只需要將*p結點的指針域(p->next)指向原來*p結點的下一個結點(p->next)的下一個結點P->next = p->next- >next;或者
q= q->next;
p->next =q ->next;
delete q;

template <class T>  //單鏈表結點類
 class SingleNode
{
    public:
        T date;    //數據域
    SingleNode<T> *next;   //指針域

SingleNode ()   //構造控結點
      {
        this ->next = NULL;  //data域未初始化
      }

        SingleNode(T data, SingleNode<T> *next = NULL)  //構造數據結點
     {
       this->data = data;
       this->next = next;
 }
};

#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";
}

發佈了46 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章