#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
    int element;
    struct ListNode *next;
};

typedef struct ListNode *Node;
void initList(Node head)
{
    head->next = NULL;
}
_Bool insertList(Node head, int element, int index)
{
    if (index < 1)
        return 0;
    while (--index)
    {
        head = head->next;
        if (head == NULL)
            return 0;
    }
    Node node = malloc(sizeof(struct ListNode));
    if (node == NULL)
        return 0;            // 创建一个新的结点,如果内存空间申请失败返回0
    node->element = element; // 将元素保存到新创建的结点中
    node->next = head->next; // 先让新插入的节点指向原本位置上的这个结点
    head->next = node;       // 接着将前驱结点指向新的这个结点
    return 1;
}
void printList(Node head)
{
    while (head->next)
    {
        head = head->next;
        printf("%d ", head->element); // 因为头结点不存放数据,所以从第二个开始打印
    }
}
_Bool deleteList(Node head, int index)
{
    // head就是头结点,index依然是待删除的结点位序
    if (index < 1)
        return 0;
    while (--index)
    {
        head = head->next;
        if (head == NULL)
            return 0;
    }
    if (head->next == NULL)
        return 0;
    head->next = head->next->next; // 直接让前驱结点指向下一个的下一个结点
    return 1;
}
// 取对应位置上的元素:
int getList(Node head, int index)
{
    if (index < 1)
        return -1; // 如果小于0那肯定不合法,返回-1
    do
    {
        head = head->next; // 因为不算头结点,所以使用do-while语句
        if (head == NULL)
            return -1; // 如果已经超出长度那肯定也不行
    } while (--index);
    return head->element;
}
// 接着是查找对应元素的位置:
int findList(Node head, int element)
{
    head = head->next; // 先走到第一个节点
    int i = 1;         // 计数器
    while (head)
    {
        if (head->element == element)
            return i;
        head = head->next;
        i++;
    }
    return -1;
}
int sizeList(Node head)
{
    int i = 0;
    while (head->next)
    {
        head = head->next;
        i++;
    }
    return i;
}
int main()
{
    struct ListNode head;
    initList(&head);
    for (int i = 1; i < 4; ++i)
    {
        insertList(&head, i * 100, i); // 依次插入3个元素
    }
    int size = sizeList(&head);
    deleteList(&head, 3); // 这里我们尝试删除一下第一个元素
    printList(&head);     // 打印一下看看
    int num1 = getList(&head, 1);
    int index = findList(&head, 200);
    printf("%d %d %d", num1, index, size);
}