数据结构之单链表

/***************************************************************************

* file name : LinkNode.h
* created : 2011/11/02
* description :
* author : Gavin Dai XLX
* update :

****************************************************************************/
#ifndef __LINKNODE_H
#define __LINKNODE_H

#include <iostream>
using namespace std;

template <class T>
class SingleList;

template <class T>
class ListNode
{
private:

 friend class SingleList<T>;

 ListNode() : m_pnext(NULL){ }
 
 ListNode(const T item, ListNode<T> *next = NULL) : m_data(item), m_pnext(next) { }

 ~ListNode() { m_pnext = NULL; }

public:

 T getData();

 friend ostream& operator<<(ostream& , ListNode<T>&);

private:

 T m_data;
 
 ListNode<T>* m_pnext;
};

template <class T>
T ListNode<T>::getData()
{
 return this->m_data;
}

template <class T>
ostream& operator<<(ostream& os, ListNode<T>& out)
{
 os<<out.m_data;
 return os;
}

#endif

 

/***************************************************************************

* file name : SingleList.h
* created : 2011/11/02
* description :
* author : Gavin Dai XLX
* update :

****************************************************************************/

#ifndef __SINGLELIST_H
#define __SINGLELIST_H

#include "LinkNode.h"

template <class T>
class SingleList
{

public:
 //----------------------------------------------------
 // Name: SingleList::SingleList - public
 // Description: Construct function, construct a link list contain a head node
 // Arguments: None
 // Return Value: None
 //----------------------------------------------------
 SingleList() : head(new ListNode<T>()) { }

 ~SingleList()
 {
  makeEmpty();
  delete head;
 }

 void makeEmpty();

 int length();

 ListNode<T>* find(T value);

 //ListNode<T>* find(int n);

 bool insert(T item, int n = 0);

 T remove(int n = 0);

 bool removeAll(T item);

 T get(int n);

 void print();

private:

 ListNode<T> *head;

};

template <class T>
void SingleList<T>::makeEmpty()
{
 ListNode<T> *pdel;
 while(head->m_pnext != NULL)
 {
  pdel = head->m_pnext;
  head->m_pnext = pdel->m_pnext;
  delete pdel;
 }
}

template <class T>
int SingleList<T>::length()
{
 ListNode<T> *pmove = head->m_pnext;
 int count = 0;
 while(pmove != NULL)
 {
  pmove = pmove->m_pnext;
  count++;
 }
 return count;
}

//template <class T>
//ListNode<T>* SingleList<T>::find(int n)
//{
// if (n < 0)
// {
//  cout<<" The n is out of boundary"<<endl;
//  return NULL;
// }
// ListNode<T> *pmove = head->m_pnext;
// for (int i = 0; i < n && pmove; i++)
// {
//  pmove = pmove->m_pnext;
// }
// if (pmove == NULL)
// {
//  cout<<"The n is out of boundary"<<endl;
//  return NULL;
// }
// return pmove;
//
//}

template <class T>
ListNode<T>* SingleList<T>::find(T value)
{
 ListNode<T>* pmove = head->m_pnext;
 while(pmove != NULL)
 {
  if (pmove->m_data == value)
  {
   return pmove;
  }
  pmove = pmove->m_pnext;
 }
 return pmove;

}
//----------------------------------------------------------
// Name; SingleList::insert - public
// Description: insert item before node n.
// Arguments: item - the node value you want to insert, n - insert before n.
// Return Value:
//-----------------------------------------------------------
template <class T>
bool SingleList<T>::insert(T item, int n = 0)
{
 if (n < 0)
 {
  cout<<"The n is illegal"<<endl;
  return false;
 }
 ListNode<T>* pmove = head;
 ListNode<T>* pnode = new ListNode<T>(item);
 if (pnode == NULL)
 {
  cout<<"Application error!"<<endl;
  return false;
 }
 for (int i = 0; i < n && pmove; i++)
 {
  pmove = pmove->m_pnext;
 }
 if (pmove == NULL)
 {
  return false;
  
 }
 pnode->m_pnext = pmove->m_pnext;
 pmove->m_pnext = pnode;
 return true;
}

template <class T>
bool SingleList<T>::removeAll(T item)
{
 ListNode<T>* pmove = head;
 ListNode<T>* pdel = head->m_pnext;
 while(pdel != NULL)
 {
  if (pdel->m_data == item)
  {
   pmove->m_pnext = pdel->m_pnext;
   delete pdel;
   pdel = pmove->m_pnext;
   continue;
  }
  pmove = pmove->m_pnext;
  pdel = pdel->m_pnext;
 }
 return true;
}

template <class T>
T SingleList<T>::remove(int n = 0)
{
 if(n < 0)
 {
  cout<<"can't find the element"<<endl;
  exit(1);
 }
 ListNode<T> *pmove = head, *pdel;
 for (int i = 0; i < n && pmove->m_pnext; i++)
 {
  pmove = pmove->m_pnext;
 }
 if (pmove->m_pnext == NULL)
 {
  cout<<"cant't find the element"<<endl;
  exit(1);
 }
 pdel = pmove->m_pnext;
 pmove->m_pnext = pdel->m_pnext;
 T temp = pdel->m_data;
 delete pdel;
 return temp;
}

template <class T>
T SingleList<T>::get(int n)
{
 if (n < 0)
 {
  cout<<"The n is out of boundry"<<endl;
  exit(1);
 }
 ListNode<T> *pmove = head->m_pnext;
 for (int i = 0; i < n; i++)
 {
  pmove = pmove->m_pnext;
  if (NULL == pmove)
  {
   cout<<"The n is out of boundary"<<endl;
   exit(1);
  }
 }
 return pmove->m_data;
}

template <class T>
void SingleList<T>::print()
{
 ListNode<T>* pmove = head->m_pnext;
 cout<<"head ";
 while(pmove)
 {
  cout<<"-->"<<pmove->m_data;
  pmove = pmove->m_pnext;
 }
 cout<<"--->over"<<endl<<endl<<endl;
}
#endif

 

/***************************************************************************

* file name : main.cpp
* created : 2011/11/02
* description :
* author : Gavin Dai XLX
* update :

****************************************************************************/
#include "SingleList.h"

int main()
{
 SingleList<int> list;
 for (int i = 0; i < 20; i++)
 {
  list.insert(3 * i, i);
 }
 list.print();
 list.insert(12,8);
 list.print();
 cout<<"find"<<list.find(18)<<endl;
 //list.removeAll(12);
 cout<<list.remove(3)<<endl;
 list.print();
 list.makeEmpty();
 

 cout<<"the length of the list "<<list.length();
 system("pause");
 return 1;
}

posted on 2011-11-03 11:12  Gavin Dai  阅读(242)  评论(0编辑  收藏  举报