单向链表,并实现增删查改等功能
首先定义节点类,类成员包含当前节点的值和下一个节点的地址
/node definition
template
class Node {
public:T value;Node* next;Node() {}Node(const T& value) {this->value = value;next = nullptr;}Node(const T& value, const Node& next) {this->value = value;this->next = next;}
};
然后是链表类的定义,主要包含了增删查改等功能
//linklist definition
template
class LinkList {
public:Node* headnode;LinkList();LinkList(const T* arr, int len); //array initialLinkList(const LinkList& link);~LinkList();LinkList& push_back(T n);LinkList& push_front(T n);LinkList& insert(int pos, int n, T* arr);LinkList& pop_front();LinkList& pop_back();LinkList& remove(int pos, int num);T& operator[](int n);T& at(int n);LinkList& replace(int pos, int n, T* arr);int getLen() {return len;}void clear() {this->~LinkList();}void display();
private:int len = 0;Node* getNode(int n);};
各个函数解释:
LinkList(); 默认构造函数
LinkList(const T* arr, int len); 一般构造函数
LinkList(const LinkList
~LinkList(); 析构函数
LinkList
LinkList
LinkList
LinkList
LinkList
LinkList
T& operator[](int n); 重载[ ]运算符,返回第n个节点的值
T& at(int n); 与[ ]一样,只不过会检查索引是否越界
LinkList
int getLen() {return len;} 返回长度,因为len是private
void clear() {this->~LinkList();} 清除链表
void display(); 显示链表所有元素
Node
最后是各个成员函数的定义:
#include
using namespace std;//node definition
template
class Node {
public:T value;Node* next;Node() {}Node(const T& value) {this->value = value;next = nullptr;}Node(const T& value, const Node& next) {this->value = value;this->next = next;}
};//linklist definition
template
class LinkList {
public:Node* headnode;LinkList();LinkList(const T* arr, int len); //array initialLinkList(const LinkList& link);~LinkList();LinkList& push_back(T n);LinkList& push_front(T n);LinkList& insert(int pos, int n, T* arr);LinkList& pop_front();LinkList& pop_back();LinkList& remove(int pos, int num);T& operator[](int n);T& at(int n);LinkList& replace(int pos, int n, T* arr);int getLen() {return len;}void clear() {this->~LinkList();}void display();
private:int len = 0;Node* getNode(int n);};//default constructor
template
LinkList::LinkList() {headnode = nullptr;len = 0;
}//normal constructor
template
LinkList::LinkList(const T* arr, int len) {Node* temp = nullptr;Node* node = nullptr;if ( len < 0 ) {cout << "[error]: illegal length of LinkList" << endl;exit(0);}for ( int i = len-1; i >= 0; i-- ) {node = new Node(i);node->value = *(arr+i);node->next = temp;temp = node;node = nullptr;}headnode = temp;this->len = len;
}//copy constructor
template
LinkList::LinkList(const LinkList& link) {this->len = link.getLen();this->headnode = link.headnode;link.headnode = nullptr;
}//deconstructor
template
LinkList::~LinkList() {this->len = 0;Node* temp = headnode;while ( headnode ) {temp = headnode;headnode = headnode->next;delete temp;temp = nullptr;}
}//display all elements in Linklist
template
void LinkList::display() {Node *node = headnode;for ( int i = 0; i < len; i++ ) {cout << node->value << " ";node = node->next;}cout << endl;
}//add one node at the last position
template
LinkList& LinkList::push_back(T n) {Node *node = this->getNode(len-1);if ( node->next == nullptr ) {Node *temp = new Node(n);node->next = temp;this->len++;}return *this;
}//add one node at the first position
template
LinkList& LinkList::push_front(T n) {Node* node_new = new Node(n);node_new->next = headnode;headnode = node_new;this->len++;return *this;
}//insert elements to LinkList
template
LinkList& LinkList::insert(int pos, int n, T* arr) {if ( pos > len-1 || len < 0 ) {cout << "[error]: illegal insert position, please check again" << endl;exit(0);}Node* node_N = getNode(pos-1); //前半部分Node* temp = node_N->next; //后半部分Node* node_new = nullptr; //新增加的for ( int i = 0; i < n; i++ ) {node_new = new Node (arr[n-1-i]);node_new->next = temp;temp = node_new;node_new = nullptr;}node_N->next = temp;this->len += n;return *this;
}//delete the first element
template
LinkList& LinkList::pop_front() {if ( this->len == 0 ) {cout << "[error]: LinkList don't has any element" << endl;exit(0);}headnode = getNode(1);this->len--;return *this;
}//delete the last element
template
LinkList& LinkList::pop_back() {if ( this->len == 0 ) {cout << "[error]: LinkList don't has any element" << endl;exit(0);}Node* temp = getNode(len-2);temp->next = nullptr;this->len--;return *this;
}//get the last node pointer
template
Node* LinkList::getNode(int n) {if ( n > len-1 || n < 0) {cout << "[error]: index out of range" < *node = headnode;for( int i = 0; i < n; i++ ) {node = node->next;}return node;
}//remove n elements
template
LinkList& LinkList::remove(int pos, int num) {if ( pos > len-1 || len < 0 ) {cout << "[error]: illegal remove position, please check again" << endl;exit(0);} else if ( pos + num > len) {cout << "[error]: remove index out of range" << endl;exit(0);}Node* node_N = getNode(pos-1);node_N->next = getNode(pos+num);this->len -= num;return *this;
}template
T& LinkList::operator[](int n) {if ( n > len-1 || n < 0 ) {cout << "[error]: index out of range" << endl;exit(0);}return this->getNode(n)->value;
}template
LinkList& LinkList::replace(int pos, int n, T* arr) {if ( pos > len-1 || len < 0 ) {cout << "[error]: illegal remove position, please check again" << endl;exit(0);} else if ( pos + n > len) {cout << "[error]: remove index out of range" << endl;exit(0);}Node* temp = nullptr;if ( pos == 0 )temp = headnode;elsetemp = this->getNode(pos-1);for ( int i = 0; i < n; i++ ) {temp->value = arr[i];temp = temp->next;}return *this;
}int main(){int arr[]{1,2,4,5,0};LinkList link(arr, sizeof(arr)/sizeof(int));link.display();link.push_back(34);link.display();link.push_front(10);link.display();link.insert(3,4,arr);link.display();link.pop_front();link.display();link.pop_back();link.display();link.remove(2,3);link.display();cout << link[2] << endl;int a[] = {6,5,2};link.replace(2, sizeof(a)/sizeof(int), a);link.display();link.clear();cout << link.getLen() << endl;link.display();
}