#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;

typedef struct node{
ElemType data;
struct node *prev, *next;

}Node;

//初始化双向链表
Node* initNode() {
Node* head = (Node*)malloc(sizeof(Node));
head->data = 0;
head->prev = NULL;
head->next = NULL;
return head;
}

//头插法
int insertHead(Node* L, ElemType e) {
Node* p = (Node*)malloc(sizeof(Node));
p->data = e;
p->prev = L;
p->next = L->next;
if (L->next != NULL) {
L->next->prev = p;
}
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;
p->prev = tail;
tail->next = p;
p->next = NULL;
return p;
}

//指定位置插入
void insertNode(Node* L, int pos, ElemType e) {
Node* p = L;
int i = 0;
while (i < pos - 1) {
p = p->next;
i++;
}
Node* q = (Node*)malloc(sizeof(Node));
q->data = e;
q->prev = p;
q->next = p->next;
p->next = q;
p->next->prev = q;
}

//删除节点
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;
q->next->prev = p;
free(q);
return 1;
}

int main() {
Node* list = initNode();
/insertHead(list, 1);
insertHead(list, 2);
insertHead(list, 3);
/
Node* tail = getTail(list);
tail = insertTail(tail, 1);
tail = insertTail(tail, 2);
tail = insertTail(tail, 3);
listNode(list);
insertNode(list, 2, 6);
listNode(list);
deleteNode(list, 3);
listNode(list);
return 0;
}