#include <iostream>
using namespace std;
struct DblNode
{
int data;
DblNode* llink;
DblNode* rlink;
};
template<class T>
class DblList {
public:
DblList()
{
first = new DblNode;
first->rlink = first->llink=first;
length = 0;
}
DblList<T>* getFirst()const { return first;}
int doublelink_insert( T x, int d);
int doublelink_getlength(DblList<T>* ptr);
void print(int d);
bool remove(int i, T& x, int d);
private:
DblNode* first;
int length; //表的结点个数
};
template<class T>
int DblList<T>::doublelink_getlength(DblList<T>* ptr)
{
return ptr->leghth;
}
//带头结点的双向链表
template<class T>
int DblList<T>::doublelink_insert( T x, int d)//d用来记录方向
{
DblNode* p = first;
int m = 0;
DblNode* s = new DblNode;
s->data = x;
while (x!=0)
{
cin >> x;
s = new DblNode;
s->data = x;
if (d == 0)
{
s->rlink = p;
s->llink = p->llink;
p->llink = s;
s->llink->rlink = s;
}
else
{
//插入第I个结点的右侧
s->rlink = p->rlink;
p->rlink == s;
s->rlink->llink = s;
s->llink = p;
}
}
return true;
}
template<class T>
void DblList<T>::print(int d)
{
DblNode* p = first->rlink;
if (d == 0) {
p = first->rlink;
while (p->rlink != first)
{
cout << p->data << " ";
p = p->rlink;
}
cout << endl;
}
else
{
p = first->llink;
while (p->llink != first->llink)
{
cout << p->data << " ";
p = p->llink;
}
cout << endl;
}
}
template<class T>
bool DblList<T>::remove(int i, T& x, int d)
{
DblNode* p = first;
int m = 0;
while (m < i)
{
if (d == 0)
{
p = p->rlink;
}
else
{
p = p->llink;
}
m++;
}
if (p == first)
{
return false;
}
p->rlink->llink = p->llink;
p->llink->rlink = p->rlink;
x = p->data;
delete p;
return true;
}
int main()
{
DblList<int > list;
int i = 5,m=0;
list.doublelink_insert(i, m);
list.print(m+1);
list.print(m );
if (list.remove(1, i, m))
{
cout << i << endl;
};
list.print(m);
return 0;
}
双向循环链表(带头结点)
最新推荐文章于 2023-12-02 14:32:53 发布