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

更多推荐