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