#include<iostream>
#include<string>
using namespace std;
template<typename DataType>
struct Node
{
DataType data;
Node<DataType>* next;
};
template<typename DataType>
class LinkList
{
public:
LinkList();
~LinkList();
void insert(DataType a);
void printList();
void gl();
void lg();
void gg();
private:
Node<DataType>* first;
};
template<typename DataType>
LinkList<DataType>::LinkList()//初始化
{
first = new Node<DataType>;
first->next = nullptr;
}
template<typename DataType>
LinkList<DataType>::~LinkList()//销毁
{
Node<DataType>* p = first;
while (first != NULL)
{
first = first->next;
delete p;
p = first;
}
}
template<typename DataType>
void LinkList<DataType>::insert(DataType a)//头插法
{
Node<DataType>* p = first, * s = nullptr;
s = new Node<DataType>;
s->data = a;
s->next = p->next;
p->next = s;
}
template<typename DataType>
void LinkList<DataType>::printList()//历遍
{
Node<DataType>* p = first->next;
cout << "head addr:(" << first << ")\t";
while (p != NULL)
{
cout << p->data << "\t";// "(" << p << ")" <<
p = p->next;
}
cout << "[" << p << "]";
cout << endl;
}
template<typename DataType>
void LinkList<DataType>::gl()//大到小
{
for (int i = 0; i <= 5; i++)
{
Node<DataType>* p = first->next;
while (p->next != nullptr)
{
while (p->data <= p->next->data)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
}
p = p->next;
}
}
}
template<typename DataType>
void LinkList<DataType>::lg()//小到大
{
for (int i = 0; i <= 5; i++)
{
Node<DataType>* p = first->next;
while (p->next != nullptr)
{
while (p->data >= p->next->data)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
}
p = p->next;
}
}
}
template<typename DataType>
void LinkList<DataType>::gg()//倒置
{
for (int i = 0; i <= 3; i++)
{
Node<DataType>* p = first->next;
while (p->next != nullptr)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
p = p->next;
}
}
for (int i = 0; i <= 2; i++)
{
Node<DataType>* p = first->next->next;
while (p->next != nullptr)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
p = p->next;
}
}
for (int i = 0; i <= 1; i++)
{
Node<DataType>* p = first->next->next->next;
while (p->next != nullptr)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
p = p->next;
}
}
for (int i = 0; i <= 0; i++)
{
Node<DataType>* p = first->next->next->next->next;
while (p->next != nullptr)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
p = p->next;
}
}
}
int main()
{
LinkList<int> l1;
LinkList<int> l2;
LinkList<int> l3;
l1.insert(1);
l1.insert(5);
l1.insert(3);
l1.insert(9);
l1.insert(7);
l1.gl();
l2.insert(2);
l2.insert(1);
l2.insert(3);
l2.insert(6);
l2.insert(8);
l2.lg();
l1.printList();
l2.printList();
l2.gg();
l2.printList();
return 0;
}
以下是对倒置函数的尝试修改没有成功。
template<typename DataType>
void LinkList<DataType>::gg()
{
for (int x=0;x<=3;x++)
{
Node<DataType>* s = first->next;
for (int i = 0; i <=3-x; i++)
{
Node<DataType>* p =s;
while (p->next != nullptr)
{
int x = p->data;
p->data = p->next->data;
p->next->data = x;
p = p->next;
}
}
s = s->next;
}