# include <stdio.h>
# include <stdlib.h>
typedef int E;
/**
* 双向链表增删
* @return
*/
struct ListNode{
E e;
struct ListNode * next; //指向下一节点的指针
struct ListNode * prev; //指向上一节点的指针
};
typedef struct ListNode * Node;
//指针初始化
void initNode(Node head){
head -> next = head -> prev = NULL;
}
//插入操作
_Bool insertNode(Node head,E e,int index){
if(index < 1) return 0;
while(--index){
head = head -> next;
if(head == NULL) return 0;
}
//此时head为其前驱节点
Node node = malloc(sizeof(struct ListNode)); //创捷一个新的节点,并为其分配内存
//处理请求失败
if(node == NULL) return 0;
node -> e = e;
//首先处理后继节点
if(head -> next){ //如果后继节点存在,则按流程
node -> next = head -> next;
head -> next -> prev = node;
}else{ //如果后继节点不存在,则直接将新节点的后继指针置为NULL
node -> next = NULL;
}
head -> next = node;
node -> prev = head;
return 1;
}
//删除操作
_Bool deleteNode(Node head,int index){
if(index < 1) return 0;
//寻找前驱节点
while(--index){
head = head -> next;
if(head == NULL) return 0;
}
//此时head为前驱节点
//不能删除不存在的节点
if(head -> next == NULL) return 0;
if(head -> next -> next){ //待删除节点不是末尾节点
head ->next = head -> next -> next;
head -> next -> prev = head;
}else{ //待删除节点是末尾节点
head -> next = NULL;
}
return 1;
}
//打印链表
void printNode(Node head){
while(head -> next){
head = head -> next;
printf("%d ",head -> e);
}
printf("\n");
}
int main(){
int n,m,e,k;
struct ListNode head;
initNode(&head);
//插入n个节点
scanf("%d",&n);
for(int i = 0;i < n;i++){
insertNode(&head,(i+1)*10,i+1);
}
printNode(&head);
//在第m个位置插入e
scanf("%d%d",&m,&e);
insertNode(&head,e,m);
printNode(&head);
//删除第k个节点
scanf("%d",&k);
deleteNode(&head,k);
printNode(&head);
}