小王子有一天迷上了排队的游戏,桌子上有标号为 1-10的10个玩具,现在小王子将他们排成一列,可小王子还是太小了,他不确定他到底想把那个玩具摆在哪里,直到最后才能排成一条直线,求玩具的编号。已知他排了 M 次,每次都是选取标号为 X 个放到最前面,求每次排完后玩具的编号序列。要求一:采用单链表解决
输入描述 : 第一行是一个整数 M,表示小王子排玩具的次数。
随后 M 行每行包含一个整数 X,表示小王子要把编号为 X 的玩具放在最前面。
输出描述 : 共 M 行,第 i 行输出小王子第 i 次排完序后玩具的编号序列。
首先我们先创建结点
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct Node
{int data;
struct Node *next;
}LNode;
构建一个链表,将玩具的编号1-10放到链表中去
void head(LNode *&L) //初始化链表
{L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;}
void init(LNode *&L) //头插法插入1-10
{
for(int i=10;i>=1;i--)
{LNode *s;
s=(LNode *)malloc(sizeof(LNode));
s->data=i;
s->next=L->next;
L->next=s;
}}
查找想要玩具的编号,并放到最前面
void change(LNode *&L,int x)
{
LNode *before=L; //记录前驱结点
LNode *team=L->next;
while(team!=NULL)
{
if(team->data==x)
{before->next=team->next;
team->next=L->next;
L->next=team;
break;}
before=team;
team=before->next;
}}
将每次排完序的链表展示出来
void show(LNode *L)
{LNode *sh=L->next;
while(sh!=NULL)
{cout<<sh->data<<" ";
sh=sh->next;
}
cout<<endl;
}
主函数
int main()
{LNode *L;
head(L);
init(L);
int N;
cin>>N;
for(int i=1;i<=N;i++)
{int x;
cin>>x;
change(L,x);
show(L);
}
return 0;
}