#include <iostream>
#include<stdexcept>
using namespace std;
#define eleType int
struct ListNode //创建链表结点
{
eleType data;
ListNode *next;
ListNode(eleType x):data(x),next(NULL){}//初始化列表
};
class LinkedList{ //创建链表,私有公有
private:
ListNode* head;
int size;
public:
LinkedList():head(NULL),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!=NULL)
{
ListNode *tmp=curr;
curr=curr->next;
delete tmp;
}
}
void LinkedList::insert(int i,eleType value){
if(i<0||i>size){
throw std::out_of_range("Invaild");
}
ListNode* newNode = new ListNode(value);//星号放左边放右边都行
if(i==0){
newNode->next=head; //插在头的位置
head= newNode;
}else{
ListNode *curr = head; //插在i位置,从头开始一直将curr找到第i个位置
for(int j=0;j<i-1;j++){
curr=curr->next;
}
newNode->next=curr->next; //插入,注意顺序
curr->next = newNode;
}
++size;
cout<<value<<endl;
}
void LinkedList::remove(int i){
if(i<0||i>size){
throw std::out_of_range("Invaild");
}
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;
}
}
ListNode *LinkedList::find(eleType value){
ListNode *curr=head;
while(curr&&curr->data!=value){
curr=curr->next;
}
return curr;
}
ListNode *LinkedList::get(int i){
if(i<0||i>size){
throw std::out_of_range("Invaild");
}
ListNode *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(){
ListNode *curr=head;
while (curr!=NULL){
std::cout << curr->data;
curr=curr->next;
if(curr){
cout<<"";
}else{
cout<<endl;
}
}
}
int main(){
LinkedList list;
list.insert(0,10);
list.insert(1,20);
list.insert(2,30);
list.insert(3,40);
list.insert(3,50);
list.print();
return 0;
}