C++数据结构(2)链表模板
·
#include <iostream>
#include <stdexcept>
using namespace std;
#define eleType int
//链表节点
struct LinkNode {
eleType data;//数据域
LinkNode* next;//指针域
LinkNode(eleType x):data(x),next(NULL){}//构造函数
};
//链表
class LinkedList {
private:
LinkNode* head;//头节点
int size;//链表大小
public:
LinkedList():head(NULL),size(0){}
~LinkedList();
void insert(int i, eleType value);//增
void remove(int i);//删
void update(int i, eleType value);//改
LinkNode* find(eleType value);//查
LinkNode* get(int i);//查
void print();
};
LinkedList::~LinkedList() {
LinkNode* curr = head;
while (curr != NULL) {
LinkNode* tmp = curr;
curr = curr->next;
delete tmp;
}
}
void LinkedList::insert(int i, eleType value) {
//判断是否合法
if (i<0 || i>size) {
throw std::out_of_range("Invalid position");
}
LinkNode* newNode = new LinkNode(value);
if (i == 0) {
//插入链表头情况
newNode->next = head;
head = newNode;
}else{
//其他
LinkNode* curr = head;
for (int j = 0; j < i - 1; j++) {//
curr = curr->next;
}
newNode->next = curr->next;//插入元素指向下一个元素
curr->next = newNode;//原来的元素指向插入元素
}
size++;
}
void LinkedList::remove(int i) {
if (i < 0 || i >= size) {
throw std::out_of_range("Invalid position");
}
if (i == 0) {
LinkNode* temp = head;
head = head->next;
delete temp;
}else {
LinkNode* curr = head;
for (int j = 0; j < i - 1; j++) {
curr = curr->next;
}
LinkNode* temp = curr->next;
curr->next = temp->next;
delete temp;
}
size--;
}
LinkNode* LinkedList::find(eleType value) {
LinkNode* curr = head;
while (curr && curr->data != value) {//如果当前节点不为空且当前节点数据不等于value
curr = curr->next;//则指向后继节点
}
return curr;
}
LinkNode* LinkedList::get(int i) {
//判断是否合法
if (i<0 || i>size) {
throw std::out_of_range("Invalid position");
}
LinkNode* curr = head;
for (int j = 0; j < i; j++) {
curr = curr->next;
}
return curr;
}
void LinkedList::update(int i, eleType value) {
get(i)->data = value;
}
void LinkedList::print() {
LinkNode* curr = head;
while (curr) {
cout << curr->data << " ";
curr = curr->next;
}
cout << endl;
}
测试用例:
int main() {
LinkedList List;
List.insert(0, 10);
List.insert(1, 20);
List.insert(2, 30);
List.insert(3, 40);
List.insert(4, 50);
List.insert(5, 60);
List.print();
List.remove(1);
List.print();
List.update(2, 100);
List.print();
LinkNode* temp = List.find(10);
cout << temp->data << endl;
return 0;
}
更多推荐



所有评论(0)