有头链表实现
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
struct student
{
string name;
int age;
int num;
};
template<typename T>
struct Node
{
T data;
Node<T>* next;
Node()
{
this->next = nullptr;
}
Node(T data)
{
this->data = data;
this->next = nullptr;
}
Node(T data, Node<T>* nextNode)
{
this->data = data;
this->next = nextNode;
}
};
template<class T>
class myList
{
public:
myList()
{
this->size = 0;
this->headNode = new Node<T>();
}
void push_front(T data);
void push_back(T data);
void push_appoint(T data, int pos);
void pop_front();
void pop_back();
void pop_appoint(T posData);
void printList();
int listSize();
bool empty();
~myList()
{
delete headNode;
}
protected:
private:
int size;
Node<T>* headNode;
public:
Node<T>* begin()
{
return headNode->next;
}
Node<T>* end()
{
Node<T>* curNode = headNode->next;
while (curNode != nullptr)
{
curNode = curNode->next;
}
return curNode;
}
class iterator
{
public:
iterator(Node<T>* pMove = nullptr){}
void operator=(Node<T>* pMove)
{
this->pMove = pMove;
}
bool operator!=(Node<T>* pMove)
{
return this->pMove != pMove;
}
iterator& operator++(int)
{
this->pMove = this->pMove->next;
return (*this);
}
T operator*()
{
return this->pMove->data;
}
protected:
private:
Node<T>* pMove;
};
};
template <typename T>
void myList<T>::push_front(T data)
{
Node<T>* newNode = new Node<T>(data,headNode->next);
headNode->next = newNode;
size++;
}
template <typename T>
void myList<T>::push_back(T data)
{
Node<T>* newNode = new Node<T>(data);
Node<T>* curNode = headNode;
while (curNode->next != nullptr)
{
curNode = curNode->next;
}
curNode->next = newNode;
size++;
}
template <typename T>
void myList<T>::push_appoint(T data, int pos)
{
Node<T>* curNode = headNode->next;
Node<T>* preNode = headNode;
while (curNode != nullptr && --pos)
{
preNode = curNode;
curNode = curNode->next;
}
Node<T>* newNode = new Node<T>(data, curNode);
preNode->next = newNode;
size++;
}
template <typename T>
void myList<T>::pop_front()
{
if (!empty()) {
Node<T>* delNode = headNode->next;
headNode->next = delNode->next;
delete delNode;
size--;
}
else
{
cout << "表为空,节点删除失败!" << endl;
return;
}
}
template <typename T>
void myList<T>::pop_back()
{
if (!empty()) {
Node<T>* preNode = headNode;
Node<T>* delNode = headNode->next;
while (delNode->next != nullptr)
{
preNode = delNode;
delNode = delNode->next;
}
preNode->next = nullptr;
delete delNode;
size--;
}
else
{
cout << "表为空,节点删除失败!" << endl;
return;
}
}
template <typename T>
void myList<T>::pop_appoint(T posData)
{
if (!empty()) {
Node<T>* preNode = headNode;
Node<T>* delNode = headNode->next;
while (delNode != nullptr && delNode->data != posData)
{
preNode = delNode;
delNode = delNode->next;
}
if (delNode != nullptr)
{
preNode->next = delNode->next;
delete delNode;
size--;
}
else
{
cout << "没有找到指定数据,删除失败!" << endl;
return;
}
}
else
{
cout << "表为空,节点删除失败!" << endl;
return;
}
}
ostream& operator<<(ostream& out,student stu)
{
cout << stu.name << "\t"
<< stu.age << "\t"
<< stu.num;
cout << endl;
return out;
}
template <typename T>
void myList<T>::printList()
{
Node<T>* curNode = headNode->next;
while (nullptr != curNode) {
cout << curNode->data << "\t";
curNode = curNode->next;
}
cout << endl;
}
template <typename T>
int myList<T>::listSize()
{
return size;
}
template <typename T>
bool myList<T>::empty()
{
return size == 0;
}
int main()
{
myList<int> listInt;
for (int i = 0; i < 10; i++)
{
listInt.push_front(520 + i);
}
listInt.printList();
listInt.push_back(1213);
listInt.printList();
listInt.push_appoint(666, 2);
listInt.printList();
listInt.pop_front();
listInt.printList();
listInt.pop_back();
listInt.printList();
listInt.pop_appoint(524);
listInt.pop_appoint(777);
listInt.printList();
myList<int>::iterator iter;
for (iter = listInt.begin(); iter != listInt.end(); iter++)
{
cout << *iter << "\t";
}
cout << endl;
system("pause");
return 0;
}