链表

//头文件:
//顺序存储方式:
#include <iostream.h>
template <class T>
class LinearList
{
 private:  
  int MaxSize;
  int length;
  T *element;
 public:
  LinearList(int maxListSize = 10);
  ~LinearList() {delete [] element;}
  bool IsEmpty() const {return length == 0;}
  bool IsFull() const {return length == MaxSize;}
  int Length() const {return length;}
  bool Find(int k, T &item) const;
  int Search(const T &item) const;
  void Delete(int k, T &item);
  void Insert(int k, const T &item); 
};
//源文件:
#include "LinearList.h"
template <class T>
LinearList<T>::LinearList(int maxListSize)
{
 MaxSize = maxListSize;
 element = new T[MaxSize];
 length = 0;
}
template <class T>
bool LinearList<T>::Find(int k, T &item) const
{
 if( k < 0 || k > length - 1 || length == 0) 
 { 
  cout<<"unreasonabe position!"<<endl;
  return false;
 }
 item = element[k];
 return true;
}
template <class T>
int LinearList<T>::Search(const T &item) const
{
 for(int i = 0; i < length; i++)
  if(item == element[i])
   return i;
 return -1;
}
template <class T>
void LinearList<T>::Delete(int k, T &item)
{
 for(int i = k+1; i < length; i++)
  element[i-1] = element[i];
 length--;
 return;
}
template <class T>
void LinearList<T>::Insert(int k, const T &item)
{
 if(IsFull ())
 {
  cout<<"The list is full"<<endl;
  exit(1);
 }
 if(k < 0 || k > length-1)
 {
  cout<<"The node does not exist"<<endl;
  exit(1);
 }
 for(int i = length - 1; i >= k + 1; i --)
 {
  element[i+1] = element[i];
 }
 element[K+1] = item;
 length ++;
 return;
}
//单链表:链式存储
//头文件:
#include <iostream.h>
#ifndef SLNODE
#define SLNODE
template <class T>
struct SLNode
{
 T data;
 SLNode<T> *next; 
 
 SLNode (SLNode *nextNode = NULL) {next = nextNode;}
 SLNode (const T& item, SLNode *nextNode = NULL ) {data = item; next = nextNode;}
};
template <class T>
class SLList
{
private:
 SLNode <T> *head;
 SLNode <T> *tail;
 SLNode <T> *currptr;
 
 int size;
 
public:
 SLList (void);
 
 SLList (T &item);
 ~SLList(void);
 
 void SetEnd();
 
 void Prev();
 
 bool IsEmpty(void) const {return head->next == NULL;}
 
 int length(void) const {return size;}
 
 bool Find(int k, T &item) const;
 
 int Search(const T &item) const;
 
 void Delete(int k, T &item);
 
 bool Delete(T &de_item);
 
 bool DeleteFromHead(T &de_item);
 
 bool DeleteFromTail(T &de_item);
 
 void Insert(const T &item);
 
 void InsertFromHead(const T &item);
 
 void InsertFromTail(const T &item);
};
#endif
//源文件:
#include "SLList.h"
template <class T>
SLList<T>::SLList()
{
 head = tail = currptr = new SLNode <T>();
 size = 0;
}
template <class T>
SLList<T>::SLList(T &item)
{
 tail = currptr = new SLNode <T>(item);
 head = new SLnode <T>(currptr);
 size = 1;
}
template <class T>
SLList<T>::~SLList()
{
 while(!IsEmpty())
 {
  currptr = head->next;
  head->next = currptr->next;
  delete currptr;
 }
 delete head;
}
template <class T>
void SLList<T>::SetEnd()
{
 currptr = tail;
}
template <class T>
void SLList<T>::Prev()
{
 SLNode <T>*temp = head;
 for(; temp != NULL; )
  if(temp->next == currptr)
  {
   currptr = temp;
   break;
  }
}
template <class T>
void SLList<T>::Insert(const T &item)
{
 currptr->next = new SLNoode <T>(item, currptr->next); 
 if(tail == currptr)
  tail = currptr->next;
 size ++;
}
template <class T>
bool SLList<T>::Delete(T &de_item)//删除当前结点的后继结点将其data值返回给变量de_item
{
 if(currptr == tail || IsEmpty())
 {
  cout<<"No next node or empty list!"<<endl;
  return false;
 }
 SLNode <T>*temp = currptr->next;
 currptr->next = temp->next;
 size --;
 de_item = temp->data;
 if(temp == tail)
  tail = currptr;
 delete temp;
 return true;
}
template <class T>
bool SLList<T>::DeleteFromHead(T &de_item)
{
 if(IsEmpty())
 {
  cout<<"Empty List!"<<endl;
  return false;
 }
 SLNode <T> *temp = head->next;
 head->next = temp->next;
 size --;
 if(temp == tail) tail = head;
 delete temp;
 return true;
}
template <class T>
bool SLList<T>::DeleteFromTail(T &de_item)
{
 if(IsEmpty())
 {
  cout<<"Empty list!"<<endl;
  return false;
 }
 SetEnd();
 Prev();
 de_item = tail->data;
 currptr->next = NULL;
 size --;
 delete tail;
 tail = currptr;
 return true;
}

template <class T>
void SLList<T>::InsertFromHead(const T &item)
{
 if(IsEmpty())
 {
  head->next = new SLNode <T>(item, head->next);
  tail = head->next;
 }
 else 
  head->next = new SLNode <T>(item, head->next);
 size ++;
}
template <class T>
void SLList<T>::InsertFromTail(const T &item)
{
 tail->next = new SLNode <T>(item, NULL);
 tail = tail->next;
 size ++;
}
//双链表:链式存储:
//头文件:
#include "SLList.h"
template <class T>
struct DLNode
{
 T data;
 DLNode <T> *left, *right;
 DLNode() {left = right = NULL;}
 DLNode(const T &item, SLNode *L = NULL, SLNode *R = NULL)
 {
  data = item;
  left = L;
  right = R;
 }
};
template <class T>
class DLList
{
private:
 DLNode <T> *head;
 DLNode <T> *tail;
 DLNode <T> *currptr;
 int size;
public:
 DLList (void);
 DLList (T &item);
 ~DLList(void);
 bool IsEmpty(void) const;
 int length(void) const {return size;}
 bool Find(int k, T &item) const;
 int Search(const T &item) const;
 void Delete(int k, T &item);
 bool Delete(T &de_item);
 bool DeleteFromHead(T &de_item);
 bool DeleteFromTail(T &de_item);
 bool DeleteFromCur(T &de_item);
 void Insert(const T &item);
 void InsertFromHead(const T &item);
 void InsertFromTail(const T &item);
 bool DeleteRight(T &de_item);
};
//源文件:
#include "DList.h"

template <class T>
bool DLList<T>::IsEmpty(void) const
{
 return head->right == NULL;
}
template <class T>
void DLList<T>::Insert(const T &item)
{
 if(IsEmpty())
 {
  tail = head->right = new DLNode<T> (item, head, NULL);
  size ++;
  return;
 }
 DLNode *p = new DLNode <T>(item, currptr, currptr->right);
 currptr->right->left = p;
 currptr->right = p;
 size ++;
 if(currptr == tail) tail = p;
}
template <class T>
void DLList<T>::InsertFromTail(const T &item)
{
 tail = tail->right = new DLNode<T> (item, tail, NULL);
 size++;
}
template <class T>
void DLList<T>::InsertFromHead(const T &item)
{
 if (IsEmpty())
 {
  tail = head->right = new DLNode <T> (item, head, NULL);
  size ++;
  return;
 }
 DLNode *p = new DLNode<T> (item, head, head->right); //1,2 steps finished
 head->right->left = p;//3 step
 head->right = p;//4 step
 size++; 
}
template <class T>
bool DLList<T>::DeleteFromTail(T &de_item)
{
 if(IsEmpty() || currptr == head) return false;
 de_item = currptr->data;
 currptr->left->right = currptr->right;
 if (currptr == tail)
 {
  tail = currptr->left;
 }
 else
 {
  currptr->right->left = currptr->left;
 }
 size --;
 currptr = currptr->left;
 delete currptr->right; //delete current point 
}
template <class T>
bool DLList<T>::DeleteFromHead(T &de_item)
{
 if (IsEmpty())
 {
  cout<<"Empty list"<<endl;
  return false;
 }
 DLNode <T> *temp = head->right;
 head->right = temp->right;
 size -- ;
 de_item = temp->data;
 if (temp == tail) tail = head;
 delete temp;
 return true; 
}
template <class T>
bool DLList<T>::DeleteFromCur(T &de_item)
{
 if (IsEmpty())
 {
  cout<<"Empty List"<<endl;
  return false;
 }
 DLNode <T> *temp = currptr = tail;
 currptr = currptr->left;
 de_item = tail->data;
 currptr->right = NULL;
 size --;
 delete temp; //i modify think of not deleting tail point
 tail = currptr;
 return true;
}
template <class T>
bool DLList<T>::DeleteRight(T &de_item)//delete right node of current node
{
 if (IsEmpty() || currptr->right == NULL) return;
 
 DLNode <T> *temp = currptr->right;
 de_item = temp->data;
 if (tail == temp) tail = currptr;
 else
  temp->right->left = currptr;
 currptr->right = temp->right;
 delete temp;
 size --;
 return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值