#include <iostream>
#include <stdexcept>
using namespace std;
#define eleType double
struct ListNode {
eleType data;
ListNode* next;
ListNode(eleType x):data(x),next(nullptr){}
};
class LinkedList {
private:
ListNode* head;
int size;
public:
LinkedList() :head(nullptr), size(0){}
~LinkedList();
void insert(int i, eleType value);
void remove(int i);
ListNode* find(eleType value);
ListNode* get(int i);
void update(int i, eleType value);
void print();
};
LinkedList::~LinkedList() {
ListNode* curr = head;
while (curr) {
ListNode* temp = curr;
curr = curr->next;
delete temp;
}
}
void LinkedList::insert(int i, eleType value) {
if (i<0 || i>size) {
throw std::out_of_range(“Invalid position”);
}
ListNode* newNode = new ListNode(value);
if (i == 0) {
newNode->next = head;
head = newNode;
}
else {
ListNode* 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) {
ListNode* temp = head;
head = head->next;
delete temp;
}
else {
ListNode* curr = head;
for (int j = 0; j < i – 1; j++) {
curr = curr->next;
}
ListNode* temp = curr->next;
curr->next =temp->next;
delete temp;
}
size–;
}
ListNode* LinkedList::find(eleType value) {
ListNode* curr = head;
while (curr != nullptr && curr->data != value) {
curr = curr->next;
}
return curr;
}
ListNode* LinkedList::get(int i) {
if (i < 0 || i >= size) {
throw std::out_of_range(“Invalid position”);
}
ListNode* curr = head;
for (int j = 0; j < i; j++) {
curr = curr->next;
}
return curr;
}
void LinkedList::update(int i, eleType value) {
if (i < 0 || i >= size) {
throw std::out_of_range(“Invalid position”);
}
get(i)->data = value;
}
void LinkedList::print() {
ListNode* curr = head;
while (curr!=nullptr) {
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.print();
list.remove(3);
list.print();
cout << list.find(20)->data << endl;
cout << list.get(2)->data << endl;
list.update(1, 666);
list.print();
return 0;
}