#include<iostream>
using namespace std;
typedef struct ListNode
 {
     int val;
     struct ListNode* next;
 }ListNode;
//创建
 ListNode* ListCreate()
 {
     ListNode* head = (ListNode*)malloc(sizeof(ListNode));
head->next = NULL;
    return head;
 }
//尾部添加
 void AddAtTail(ListNode* obj, int val)
 {
     ListNode* cur = obj;
    while(cur->next != NULL)
     {
         cur = cur->next;
     }
ListNode* nTail = (ListNode*)malloc(sizeof(ListNode));
    nTail->val = val;
     nTail->next = NULL;
     cur->next = nTail;
 }
//头部添加
 void AddAtHead(ListNode* obj, int val)
 {
     ListNode* nhead = (ListNode*)malloc(sizeof(ListNode));
     nhead->val = val;
     nhead->next = obj->next;
     obj->next = nhead;
 }
 //指定索引处添加
 void AddAtIndex(ListNode* obj, int index, int val)
 {
     if(index == 0)
     {
         AddAtHead(obj, val);
         return;
     }
ListNode* cur = obj->next;
    for(int i = 1; cur != NULL; i++)
     {
         if(i == index)
         {
             ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
             newNode->val = val;
             newNode->next = cur->next;
             cur->next = newNode;
             return;
         }
         else
         {
             cur = cur->next;
         }
     }
 }
//指定索引处删除
 void DeleteAtIndex(ListNode* obj, int index)
 {
     if(index == 0)
     {
         ListNode* tmp = obj->next;
         if(tmp != NULL)
         {
             obj->next = tmp->next;
             free(tmp);
         }
        return;
     }
ListNode* cur = obj->next;
    for(int i = 1; cur != NULL && cur->next != NULL; i++)
     {
         if(i == index)
         {
             ListNode* tmp = cur->next;
             if(tmp != NULL)
             {
                 cur->next = tmp->next;
                 free(tmp);
             }
             return;
         }
         else
         {
             cur = cur->next;
         }
     }
 }
//全部删除
 void ListFree(ListNode* obj)
 {
     while(obj != NULL)
     {
         ListNode* tmp = obj;
         obj = obj->next;
         free(tmp);
     }
     obj->next = NULL;
 }
//修改指定索引的值
 void ChangeAtIndex(ListNode* obj, int index, int val)
 {
     ListNode* cur = obj->next;
    for(int i = 0; cur != NULL; i++)
     {
         if(i == index)
         {
             cur->val = val;
             return;
         }
         else
         {
             cur = cur->next;
         }
     }
 }
//查询指定位置的值
 int CheckAtIndex(ListNode* obj, int index)
 {
     ListNode* cur = obj->next;
     for(int i = 0; cur != NULL; i++)
     {
         if(i == index)
         {
             return cur->val;
         }
         else
         {
             cur = cur->next;
         }
     }
 }
int main()
 {
     ListNode* head = ListCreate();
    for(int i = 1; i < 10; i++)
     {
         //在尾部添加
         AddAtTail(head, i);
     }
ListNode* obj = head->next;
    while(obj != NULL)
     {
         cout << obj->val << endl;
         obj = obj->next;
     }
    //测试在头部添加
     //AddAtHead(head, 100);
    //测试在指定位置3添加
     //AddAtIndex(head, 3, 300);
    //测试在指定位置0添加
     //AddAtIndex(head, 0, 0);
    //测试在指定位置删除
     //DeleteAtIndex(head, 3);
    //测试修改指定位置数据
     //ChangeAtIndex(head, 3, 0);
    //测试查询指定位置的值
     int Data = CheckAtIndex(head, 3);
cout << "data = " << Data << endl;
ListNode* obj1 = head->next;
    while(obj1 != NULL)
     {
         cout << obj1->val << endl;
         obj1 = obj1->next;
     }
     return 0;
 }
  










