C++ 单向链表手动实现(课后作业版)
创始人
2024-02-06 18:54:28
0

单向链表,并实现增删查改等功能

首先定义节点类,类成员包含当前节点的值和下一个节点的地址

/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& link)           拷贝构造函数

~LinkList();     析构函数

LinkList& push_back(T n);    在尾部添加一个元素

LinkList& push_front(T n);     在头部添加一个元素

LinkList& insert(int pos, int n, T* arr);   在pos处插入n个元素

LinkList& pop_front();    删除第一个节点

LinkList& pop_back();    删除最后一个节点

LinkList& remove(int pos, int num);     删除pos开始的num个元素

T& operator[](int n);     重载[ ]运算符,返回第n个节点的值

T& at(int n);                 与[ ]一样,只不过会检查索引是否越界

LinkList& replace(int pos, int n, T* arr);    替换n个节点

int getLen() {return len;}     返回长度,因为len是private

void clear() {this->~LinkList();}    清除链表

void display();    显示链表所有元素

Node* getNode(int n);     返回第n个节点的指针,是private函数,在其他函数中经常用到

最后是各个成员函数的定义:

#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();
}


相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...