链表的基本操作
#include <iostream>
using namespace std;
template <class T>
class LinkNode {
public:
T data;
LinkNode<T>* link;
LinkNode()
{
data = 0;
link = NULL;
}
LinkNode(const T& el)
{
data = el;
link = NULL;
}
};
template <class T>
class LinkList {
private:
LinkNode<T>* head, * tail;
public:
LinkList()
{
head = tail = NULL;
}
~LinkList()
{
clear();
}
void createLink();
int getSize() const;
bool isEmpty() const;
void clear();
int findNode(const T& value);
void deleteValue(const T& value);
LinkNode<T>* setPos(int pos);
bool insertPos(const int i, const T value);
bool deletePos(const int i);
int reFindPos(const int K);
void printList();
};
template <class T>
void LinkList<T>::createLink()
{
LinkNode<T>* s = new LinkNode<T>;
LinkNode<T>* p;
this->head = s;
this->tail = s;
this->tail->link = NULL;
cout << "输入以 0 为结束" << endl;
T value;
cin >> value;
if (value == 0)
return;
s->data = value;
cin >> value;
while (value != 0 && value != '0')
{
LinkNode<T>* p = new LinkNode<T>(value);
this->tail->link = p;
tail = p;
cin >> value;
}
}
template <class T>
int LinkList<T>::getSize() const
{
int count = 0;
LinkNode<T>* p = head->link;
if (isEmpty())
return 0;
while (p != NULL) {
p = p->link;
count++;
}
return count;
}
template <class T>
bool LinkList<T>::isEmpty() const
{
if (head->link == NULL) {
return true;
}
return false;
}
template <class T>
void LinkList<T>::clear()
{
LinkNode<T>* p;
while (head != NULL) {
p = this->head;
head = this->head->link;
delete p;
}
head = tail = NULL;
}
template <class T>
int LinkList<T>::findNode(const T& value)
{
LinkNode<T>* p = this->head;
int count = -1;
if (p->data == value)
return count++;
while (p->link)
{
count++;
if (p->data == value)
return count;
p = p->link;
}
if(p==tail)
return -1;
}
template <class T>
void LinkList<T>::deleteValue(const T& value)
{
LinkNode<T>* p = this->head;
LinkNode<T>* s = this->head;
if (p == head && p->data == value)
{
head = p->link;
delete p;
}
p = p->link;
while (this->findNode(value) != -1)
{
if (p->data == value)
{
if (p == tail)
{
s->link = NULL;
tail = s;
delete p;
}
else
{
s->link = p->link;
delete p;
break;
}
}
p = p->link;
s = s->link;
}
}
template <class T>
LinkNode<T>* LinkList<T>::setPos(int pos)
{
if (pos == -1)
return head;
int count = 0;
LinkNode<T>* p = this->head->link;
while (p != NULL && count < pos) {
p = p->link;
count++;
}
return p;
}
template <class T>
bool LinkList<T>::insertPos(const int i, const T value)
{
LinkNode<T>* p, * s, * n;
int num = this->getSize();
if (i > num + 1)
{
cout << "插入操作不允许" << endl;
return false;
}
else
{
p = this->setPos(i);
s = this->setPos(i - 1);
n = new LinkNode<T>;
n->data = value;
if (i == 0)
{
n->link = head;
head = n;
}
else if (i == num + 1)
{
tail->link = n;
tail = n;
}
else
{
s->link = n;
n->link = p;
}
return true;
}
}
template <class T>
bool LinkList<T>::deletePos(const int i)
{
LinkNode<T>* p, * s;
int num = this->getSize();
if (i < 0 || i>num)
{
cout << "非法删除点" << endl;
return false;
}
else
{
p = this->setPos(i);
s = this->setPos(i - 1);
if (i == 0)
{
head = p->link;
delete p;
}
else if (i == num)
{
tail = s;
s->link = NULL;
delete p;
}
else
{
s->link = p->link;
delete p;
}
return true;
}
}
template <class T>
int LinkList<T>::reFindPos(const int K)
{
LinkNode<T>* p = head;
int count = -1;
if (K < 0)
{
cout << "非法输入" << endl;
return count;
}
else if (K > this->getSize())
{
cout << "表长不够" << endl;
return count;
}
else
{
while (p)
{
if (count + K == this->getSize())
return p->data;
p = p->link;
}
}
}
template <class T>
void LinkList<T>::printList()
{
LinkNode<T>* p = this->head;
while (p != NULL) {
cout << p->data << " ";
p = p->link;
}
cout << endl;
}
int main()
{
LinkList<int> l;
l.createLink();
l.printList();
int value0, value1, value2, pos0, pos1, pos2;
cin >> value0 >> value1 >> value2 >> pos0 >> pos1 >> pos2;
cout << "值为" << value0 << "的结点位置:" << l.findNode(value0) << endl;
l.deleteValue(value1);
l.printList();
l.insertPos(pos0, value2);
l.printList();
l.deletePos(pos1);
l.printList();
cout << "倒数第" << pos2 << "个结点的值" << l.reFindPos(pos2) << endl;
return 0;
}