#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node* next;
}Node;

Node* initList() {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0;
head->next = NULL;
return head;
}

//头插法
int insertHead(Node* L, ElemType e)//L为头结点
{
Node* p = (Node*)malloc(sizeof(Node));
p->data = e;
p->next = L->next;
L->next = p;
return 1;
}

//遍历
int listNode(Node* L) {
Node* p = L->next;
while (p != NULL) {
printf(“%d “, p->data);
p = p->next;
}
printf(“\n”);
return 1;
}

//获取尾部节点
Node* getTail(Node* L) {
Node* p = L;
while (p->next != NULL) {
p = p->next;
}
return p;
}

//尾插法
Node* insertTail(Node* tail, ElemType e) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = e;
tail->next = p;
p->next = NULL;
return p;
}

//在指定位置插入
int insertNode(Node* L, int pos, ElemType e) {
Node* p = L;
int i = 0;
while (i < pos - 1) {
p = p->next;
i++;
if (p == NULL) {
return 0;
}
}//此时p为指定位置的前一个位置
Node* q = (Node*)malloc(sizeof(Node));
q->data = e;
q->next = p->next;
p->next = q;
return 1;
}

//删除节点
int deleteNode(Node* L, int pos) {
Node* p = L;
int i = 0;
while (i < pos - 1) {
p = p->next;
i++;
if (p == NULL) {
return 0;
}
}
Node* q = p->next;
p->next = q->next;
free(q);
return 1;
}

int main() {
Node* list = initList();
Node* tail = getTail(list);//先找到尾结点
/insertHead(list, 10);
insertHead(list, 20);
insertHead(list, 30);
/
tail = insertTail(tail, 10);//通过更新尾结点来持续进行尾插法
tail = insertTail(tail, 20);
tail = insertTail(tail, 30);
listNode(list);
insertNode(list, 2, 100);
listNode(list);
deleteNode(list, 3);
listNode(list);
return 0;
}