#ifndef _LIST_H
#define _LIST_H
template <class T>
class Node
{
public:
Node<T> *prev; // 上一个节点
Node<T> *next; // 下一个节点
T data; // 当前这个节点的数据
};
template <class T>
class List
{
private:
Node<T> *head; // 头节点
Node<T> *tail; // 尾节点
int length; // 列表长度
public:
List();
~List();
void push_back(T e); // 在尾部添加
void push_front(T e); // 在头部添加
void pop_back(); // 删除最后一个节点
void remove(T data); // 移除制定的节点
T front(); // 获取第一个节点
T back(); // 获取最后一个节点
int size(); // 获取列表长度
T operator[](int i); // 重写[]取值
};
template <typename T>
List<T>::List()
{
head = new Node<T>;
tail = new Node<T>;
head -> prev = NULL;
head -> next = tail;
tail -> prev = head;
tail -> next = NULL;
length = 0;
}
template <typename T>
void List<T>::push_back(T e)
{
// 创建一个新节点
Node<T> *newNode = new Node<T>();
newNode -> data = e;
tail -> prev -> next = newNode;
newNode -> prev = tail -> prev;
newNode -> next = tail;
tail -> prev = newNode;
++ length;
}
template <typename T>
void List<T>::push_front(T e)
{
Node<T> *newNode = new Node<T>();
newNode -> data = e;
head -> next -> prev = newNode;
newNode -> next = head -> next;
head -> next = newNode;
newNode -> prev = head;
++ length;
}
template <typename T>
void List<T>::pop_back()
{
if (length <= 0)
{
std::cout << "列表为空...";
return;
}
Node<T> *p = tail; // 尾巴
if (tail -> prev != NULL)
{
p = p -> prev;
p -> prev -> next = tail;
tail -> prev = p -> prev;
delete p;
-- length;
return;
}
}
template <typename T>
void List<T>::remove(T data)
{
if (length <= 0)
{
std::cout << "列表为空...";
return;
}
Node<T> *p = head;
while(p -> next != tail)
{
p = p -> next;
if (p -> data == data)
{
Node<T> *temp = p -> prev;
temp -> next = p -> next;
p -> next -> prev = temp;
delete p;
-- length;
return;
}
}
}
template <typename T>
T List<T>::front()
{
if (length <= 0)
{
std::cout << "列表为空...";
return head -> data;
}
return head -> next -> data;
}
template <typename T>
T List<T>::back()
{
if (length <= 0)
{
std::cout << "列表为空...";
return tail -> data;
}
return tail -> prev -> data;
}
template <typename T>
T List<T>::operator[](int index)
{
if (index < 0)
{
std :: cout << "索引下标越界...";
return head -> data;
}
int i = 0;
Node<T> *p = head;
while (p -> next != tail)
{
p = p -> next;
if (i == index)
{
return p -> data;
}
++ i;
}
return tail -> data;
}
template <typename T>
int List<T> :: size()
{
return length;
}
template <typename T>
List<T>::~List()
{
if (length == 0)
{
delete head;
delete tail;
head = NULL;
tail = NULL;
return;
}
Node<T> *p;
while (head -> next != NULL)
{
p = head;
head = head -> next;
delete p;
}
delete head;
head = NULL;
}
#endif
#include <iostream>
#include "list.h"
#include <string>
using namespace std;
class StuInfo
{
private:
string sno; // 学号
string sname; // 姓名
int age; // 年龄
public:
StuInfo() {}
StuInfo(string sno, string sname, int age):sno(sno), sname(sname), age(age){}
void setSno(string sno)
{
this -> sno = sno;
}
void setSname(string sname)
{
this -> sname = sname;
}
void setAge(int age)
{
this -> age = age;
}
string getSno()
{
return sno;
}
string getSname()
{
return sname;
}
int getAge()
{
return age;
}
void show()
{
cout << "\n\t" << sno << "\t" << sname << "\t" << age << endl;
}
};
int main()
{
List<StuInfo> list;
list.push_back(StuInfo("101", "张三", 20));
list.push_back(StuInfo("102", "李四", 18));
list.push_front(StuInfo("103", "王五", 17));
for (int i = 0, len = list.size(); i < len; ++ i) {
list[i].show();
}
return 0;
}