數據結構練習--雙向鏈表的實現

自上次實現單向鏈表之後,開始看雙向鏈表,無非就是增加了一個逆序的節點,這次編程比上次能嚴禁和結構清晰一些,也是慢慢編程應該培養的東西

#include<iostream>
using namespace std;
template<class T>
class Node
{
public:
T data;
Node<T>*next;
Node<T>*prior;
};
template<class T>
class myslist
{
private:
Node<T>*phead;
Node<T>*ptail;
unsigned int length;
public:
myslist();
~myslist();
bool IsEmpty();
int GetLength();
void Output();
void add_head(T e);
void add_tail(T e);
Node<T>*GetNode(int pos);
void add_x(int pos,T e);
void DeleteNode(int pos);
};
template<class T>
myslist<T>::myslist()
{
phead=NULL;
ptail=NULL;
length=0;
};
template<class T>
bool myslist<T>::IsEmpty()
{
if(length==0)
return true;
else
return false;
};
template<class T>
myslist<T>::~myslist()
{
cout<<"Debug:析構函數"<<endl;
Node<T>*p1=phead;
Node<T>*p2;
while(p1!=ptail)
{
p2=p1;
p1=p1->next;
delete(p2);
}
delete(ptail);
};
template<class T>
int myslist<T>::GetLength()
{
return length;
};
template<class T>
void myslist<T>::Output()
{
cout<<"-------------------------------------------"<<endl;
cout<<"鏈表中的元素:";
Node<T>*p=phead;
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<"\n-------------------------------------------"<<endl;
};
template<class T>
void myslist<T>::add_head(T e)
{
Node<T>*p=new Node<T>();
p->data=e;
if(length==0)
{
p->next=phead;
p->prior=phead;
phead=p;
ptail=p;
}
else
{
p->next=phead;
p->prior=phead->prior;
phead=p;
}
length++;
};
template<class T>
void myslist<T>::add_tail(T e)
{
Node<T>*p=new Node<T>();
p->data=e;
if(ptail==NULL)
{
phead=p;
ptail=p;
}
else
{
ptail->next=p;
p->prior=ptail;
ptail=p;
}
length++;
};
template<class T>
Node<T>*myslist<T>::GetNode(int pos)
{
if(pos>length||pos<0)
return NULL;
Node<T>*p=phead;
for(int i=0;i<(pos-1);++i)
{
p=p->next;
}
return p;

};
template<class T>
void myslist<T>::add_x(int pos,T e)
{
if(pos<=1)
{
return  add_head(e);
}
else if(pos>length)
{
return add_tail(e);
}
else
{
Node<T>*p1=GetNode(pos-1);
Node<T>*p2=GetNode(pos);
Node<T>*p=new Node<T>();
p->data=e;
p->next=p2;
p->prior=p1;
p2->prior=p;
p1->next=p;
length++;
}
};
template<class T>
void myslist<T>::DeleteNode(int pos)
{
if(pos<1||pos>length)
return;
Node<T>*p1=GetNode(pos-1);
Node<T>*p2=GetNode(pos);
if(p2==ptail)
{
delete p2;
length--;
ptail=p1;
ptail->next=NULL;
}
else
{
p1->next=p2->next;
p2->next->prior=p1;
delete p2;
length--;
}
};
int main()
{
  myslist<int> ilist;
  ilist.add_head(8);
  ilist.add_head(9);
  ilist.add_tail(7);
  ilist.GetNode(2);
  ilist.add_x(2,6);
  ilist.DeleteNode(2);
  cout<<(ilist.IsEmpty()?"鏈表為空?":"鏈表不空")<<endl;
    cout<<"鏈表長度為:"<<ilist.GetLength()<<endl;
  ilist.Output();
  return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章