#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct d{
int data;
struct d*next;
}ListNode;
ListNode*BuySLTNode(int x);
void STLPrint(ListNode*head);
void SLTXinsert(ListNode**head,int x,int y);
void SLTdelet(ListNode**head,int x);
int main() {
int input = 0;
int s1,s2,s3;
char array[20];
ListNode*css = NULL;
scanf("%d",&input);
while(input--)
{
scanf("%s",array);
if(strcmp(array,"insert")==0)
{
scanf("%d%d",&s1,&s2);
SLTXinsert(&css,s1,s2);
}
else if(strcmp(array,"delete")==0)
{
scanf("%d",&s3);
SLTdelet(&css,s3);
}
}
STLPrint(css);
}
ListNode*BuySLTNode(int x)
{
ListNode*newNode = (ListNode*)malloc(sizeof(ListNode));
if(newNode==NULL)
{
perror("malloc");
exit(-1);
}
newNode->data = x;
newNode->next = NULL;
return newNode;
}
void SLTXinsert(ListNode**head,int x,int y)
{
ListNode*newNode = BuySLTNode(y); //如果当前链表为空,则为头结点
if(*head==NULL)
{
newNode->next = NULL;
*head= newNode;
return ;
}
ListNode*cur = *head;
ListNode*prev = NULL;
while(cur!=NULL&&cur->data!=x)
{
prev = cur;
cur = cur->next;
}
if(cur==NULL)
{
newNode->next = NULL;
prev->next = newNode;
}
else{
newNode->next = cur;
if(prev==NULL)
{
*head=newNode;
}
else{
prev->next = newNode;
}
}
}
void STLPrint(ListNode*head)
{
if(head==NULL)
{
printf("NULL");
}
ListNode*cur = head;
while(cur)
{
printf("%d ",cur->data);
cur = cur->next;
}
}
void SLTdelet(ListNode**head,int x)
{
//如果要删除的节点是链表的头节点,它没有更新 *head 指向新的头节点。修复这个问题的方法是,在删除头节点时,将 *head 更新为指向下一个节点。
ListNode*cur = *head;
ListNode*prev = NULL;
while(cur&&cur->data==x)
{
*head = cur->next;
free(cur);
return;
}
while(cur&&cur->data!=x)
{
prev=cur;
cur = cur->next;
}
if(cur!=NULL)
{
prev->next = cur->next;
free(cur);
}
}