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