数据结构练习--双向链表的实现

自上次实现单向链表之后,开始看双向链表,无非就是增加了一个逆序的节点,这次编程比上次能严禁和结构清晰一些,也是慢慢编程应该培养的东西

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值