题目:在清华举办美食节的某一天的早上10点钟,有N个人试图去生煎包处排队,10点前发生了M个事件,事件大概分为以下4种
有人从队尾进入队伍
有人插队
有人等不及了从队伍中离开
要求10点钟时整个队伍的情况
输入格式:
输入第一行有两个用空格隔开的数N,M
接下来有M行,按时间先后顺序每行表述一个事件
I x:表示编号为x的人从队尾进入队伍
C x y:表示编号为x的人插队,排在y前一位
L x:表示编号为x的人从队伍中离开(这个人有可能还会回来)
我们保证同一时刻队伍里不会出现两个编号相同的人,也不会让没有进入队伍的人离开队伍且数据合法。
输出格式:
输出1行,表示队首到队尾所有人的编号,用空格隔开;如果队伍没有人输出“Bai Ren Zhan”(不含引号)
输入样例:
4 4
I 1
I 2
C 3 2
C 4 1
输出样例:
注意末尾有空格!
4 1 3 2
数据规模和约定
N<=100000,M<=100000
错误答案:
#include "stdio.h"
#include <stdlib.h>
struct Node
{
int data;
struct Node * next;
};
int main()
{
int N,c,d,M,i=0,k=0,j;
char type;
struct Node * head,*newnode,*L,*L1,*L3;
scanf("%d",&N);//数据数量
j=N;//记录n个数
head=(struct Node *)malloc(sizeof(struct Node));
head->next=NULL;//第一个结点为空
scanf("%d",&M);//m个操作
while(M>0)
{
getchar();
scanf("%c",&type);//操作指示符
if(type=='I'||type=='C')//插入操作
{
if(type=='I'){
scanf("%d",&d);
newnode=(struct Node *)malloc(sizeof(struct Node));//新节点
newnode->data=d;//赋值
L=head->next;//指向第一个结点
if(L==NULL){//插入第一个结点
k++;
newnode->next=head->next;
head->next=newnode;
L=newnode;
}
else {
while(L->next!=NULL)//从第一个结点遍历链表
{
L=L->next;
}
k++;//结点数++
L->next=newnode;//新节点指向该结点的后继结点
newnode->next=NULL;
newnode->data=d;//赋值
L=newnode;
}
}
if(type=='C'){
L=head->next;
scanf("%d %d",&d,&c);
newnode=(struct Node *)malloc(sizeof(struct Node));//新节点
newnode->data=d;//赋值
if(c==1){
newnode->next=head->next;
head->next=newnode;
L=newnode;
k++;
}
else if(c>0&&c<=j+k)//j+K=老结点+新建结点数
{
while(L!=NULL)//从第一个结点遍历链表
{
i++;//记录到第几个了
if(i==c-1)//找到了
break;
L=L->next;
}
newnode->next=L->next;//新节点指向该结点的后继结点
newnode->data=d;//赋值
L->next=newnode;
L=newnode;//新节点变为新的后继节点
k++;//长度加一
i=0;//归零,下次重新查找
}
}
}
if(type=='L')//删除
{
scanf("%d",&d);
L=head;
L1=L->next;
while(L1!=NULL){
if(L1->data==d){
L->next=L1->next;
free(L1);
break;
}
L=L1;
L1=L1->next;
}
}
M--;
}
L3=head->next;
while(L3!=NULL)
{
printf("%d ",L3->data);
L3=L3->next;
}
return 0;
}
运行这个测试用例是对的,但是pta报段错误,为什么啊