天天看點

連結清單

template <class T>

class ListNode

{

  T data;

  ListNode<T> * link;

public:

  ListNode();

  ListNode(T value);

  ~ListNode();

  void SetLink(ListNode<T>* next);

  ListNode<T> * GetLink();

  T& Getdata();

};

void ListNode<T>::SetLink(ListNode<T> *next)

  link=next;

}

ListNode<T> * ListNode<T>::GetLink()

  return link;

T& ListNode<T>::Getdata()

  return data;

ListNode<T>::ListNode()

  link=NULL;

ListNode<T>::ListNode(T value)

  data=value;

#include "ListNode.h"

template <class T>    

class List

  ListNode<T> * first;

  ListNode<T> * tail;

  List();

  bool AddTail(T value);

  bool RemoveTail();

  bool Insert(int index,T value);

  bool Remove(int index);

  T& Get(int index);

  bool IsEmpty();

  int GetCount();

  void RemoveAll();

  ListNode<T> * GetHead();

  ListNode<T> * GetTail();

  void SetTail(ListNode<T> * newTail);

  ListNode<T> * GetNode(int index);

  ListNode<T> * GetCur();

  ListNode<T> * GetCurNext();

List<T>::List()

  first=tail=new ListNode<T>;

  tail->SetLink(NULL);

bool List<T>::AddTail(T value)

  ListNode<T> * add=new ListNode<T>(value);

  tail->SetLink(add);

  tail=tail->GetLink();

  if(tail!=NULL)

    return true;

  else

    return false;

bool List<T>::RemoveTail()

  return Remove(this->GetCount()-1);

bool List<T>::Insert(int index, T value)

  if(index<0 || index>this->GetCount()-1)

  {

    cout<<"插入位置錯誤!"<<endl;

  }

  ListNode<T> * curr=first;

  while(index)

    curr=curr->GetLink();

    --index;

  add->SetLink(curr->GetLink());

  curr->SetLink(add);

  if(curr->GetLink() !=NULL)

bool List<T>::Remove(int index)

    cout<<"删除位置錯誤!"<<endl;

  ListNode<T> * cur,* curpre;

  cur=first;

  curpre=cur->GetLink();

    cur=cur->GetLink();

    curpre=curpre->GetLink();

  if(tail==curpre)

    tail=cur;

  cur->SetLink(curpre->GetLink());

  if(curpre!=NULL)

T& List<T>::Get(int index)

    cout<<"傳回位置錯誤!"<<endl;

  ListNode<T> * cur;

  cur=first->GetLink();

  return cur->Getdata();

bool List<T>::IsEmpty()

  return first->GetLink()==NULL;

int List<T>::GetCount()

  int count=0;

  while(cur!=NULL)

    count++;

  return count;

void List<T>::RemoveAll()

  while(first->GetLink()!=NULL)

    cur=first->GetLink();

    first->SetLink(cur->GetLink());

    delete cur;

  tail=first;

ListNode<T> * List<T>::GetHead()

  return first;

ListNode<T> * List<T>::GetTail()

  return tail;

void List<T>::SetTail(ListNode<T> *newTail)

  tail=newTail;

ListNode<T> * List<T>::GetNode(int index)

    cout<<"位置錯誤!"<<endl;

  return cur;

ListNode<T> * List<T>::GetCurNext()

  cur=this->GetCur();

  cur=cur->GetLink();

兩個順序連結清單合并:

#include <iostream>

#include "List.h"

using namespace std;

int main()

  List<int> listFirst;

  List<int> listSecond;

  listFirst.AddTail(1);

  listFirst.AddTail(5);

  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.Get(0)>listFirst.Get(indexFirst))

    {

      ++indexFirst;

      if(indexFirst==listFirst.GetCount())

      {

        break;

      }

    }

    if(indexFirst==listFirst.GetCount())

      listFirst.AddTail(listSecond.Get(0));

      listSecond.Remove(0);

    else

      listFirst.Insert(indexFirst,listSecond.Get(0));

  for(int i=0;i<listFirst.GetCount();i++)

    cout<<listFirst.Get(i)<<endl;

  return 0;

}

繼續閱讀