要求:建立双循环列表:
逆置前,正向输出:
头结点地址 每个结点地址 每个结点值
逆置后,正向输出
头结点地址 每个结点地址 每个结点值
代码:
双向链表:
template<typename T>
struct Node
{
T data;
Node* next;
Node* prior;
};
双循环列表:
template<typename T>
class CircleList
{
public:
CircleList();
~CircleList();
int getlength()const;
void push(T element);
void pop();
void deleteelement(int index);
void insert(int index, T element);
T& operator[](int index);
void print();
void transfrom();
private:
Node<T>* head;
int length;
};
用到的主要函数:print(打印结点地址与值)与transform(逆置函数)
void print()
{
cout << "头结点地址:" << head << endl;
Node<T>* p = head;
if (length > 0)
{
for (int i = 1; i <= length;i++)
{
p = p->next;
cout << "第" << i << "个结点的地址:" << p << ",结点数值:" << p->data << endl;
}
}
}
void transfrom()
{
Node<T>* s = head;
for (int i = 0; i <= length; i++)
{
Node<T>* p = s->prior;
Node<T>* n = s->next;
s->prior = n;
s->next = p;
s = s->prior;
}
}
main函数:
CircleList<int> list;
for (int i = 1; i <=10; i++)
{
list.push(i);
}
list.print();
list.transfrom();
list.print();
return 0;
全部源代码:
#include<iostream>
#include<cstdlib>
using namespace std;
template<typename T>
struct Node
{
T data;
Node* next;
Node* prior;
};
template<typename T>
class CircleList
{
public:
CircleList():length(0)
{
head = new Node<T>;
head->next = head;
head->prior = head;
}
~CircleList()
{
while (length) pop();
delete head;
}
int getlength()const { return length; }
void push(T element)
{
Node<T>* s = new Node<T>;
s->data = element;
head->prior->next = s;
s->prior = head->prior;
s->next = head;
head->prior = s;
length++;
}
void pop()
{
Node<T>*s = new Node<T>;
s = head->prior;
s->next = head;
head->prior = s->prior;
delete s;
length--;
}
void deleteelement(int index)
{
if (index <= 0 || index > length)
{
cout << "输入错误,抛出" << endl;
exit(8);
}
int i = 0;
Node<T>*p = head;
while (i != index )
{
p = p->next;
i++;
}
Node<T>* s = new Node<T>;
s = p;
s->prior->next = s->next;
s->next->prior = s->prior;
delete s;
length--;
}
void insert(int index, T element)
{
if (index > length || index <= 0)
{
cout << "输入错误,抛出" << endl;
exit(8);
}
int i = 0;
Node<T>*p = head;
while (i != index - 1 && p != NULL)
{
p = p->next;
i++;
}
Node<T>* s = new Node<T>;
s->data = element;
s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s;
length++;
}
T& operator[](int index)
{
if (index <= 0 || index > length)
{
cout << "输入错误,抛出" << endl;
exit(8);
}
int i = 0;
Node<T>* p = head;
while (i != index)
{
p = p->next;
i++;
}
return p->data;
}
void print()
{
cout << "头结点地址:" << head << endl;
Node<T>* p = head;
if (length > 0)
{
for (int i = 1; i <= length;i++)
{
p = p->next;
cout << "第" << i << "个结点的地址:" << p << ",结点数值:" << p->data << endl;
}
}
}
void transfrom()
{
Node<T>* s = head;
for (int i = 0; i <= length; i++)
{
Node<T>* p = s->prior;
Node<T>* n = s->next;
s->prior = n;
s->next = p;
s = s->prior;
}
}
private:
Node<T>* head;
int length;
};
int main()
{
CircleList<int> list;
for (int i = 1; i <=10; i++)
{
list.push(i);
}
list.print();
list.transfrom();
list.print();
return 0;
}