题目:
小王子有一天迷上了排队的游戏,桌子上有标号为 1-10 按顺序摆放的 10 个玩具,现在小王子想将它们按自己的喜好进行摆放。小王子每次从中挑选一个好看的玩具放到所有玩具的最前面。已知他总共挑选了 M 次,每次选取标号为 X 的玩具放到最前面,求摆放完成后的玩具标号。
给出一组输入,M=8 共计排了 8 次,这 8 次的序列为 9,3,2,5,6,8,9,8。 求最终玩具的编号序列。
思路:
输入:
挑选的次数:n
排前玩具的标号:x
输出:
每次摆放后的顺序
过程:
首先,根据输入所给的x遍历链表,寻找该结点,然后将其删除,然后,在头结点后插入一个值为x的新结点,最后,整体输出新链表即可。
知识补充
链表,是线性表的链式存储结构,特点的是链表中元素的逻辑次序和物理次序不一定相同。
链表是由若干个结点组成,其中,一个结点是由数据域和指针域组成。
- 数据域:数据元素的映像
- 指针域:指示后继元素存储位置
代码:
#include <iostream>
using namespace std;
//先定义结点型数据——结构体
struct Node
{
int data;//数据域,存储本结点的数据
Node* next;//指针域,指向下一个结点
};
//有头结点的单链表
Node *head=new Node;
//创建一个单链表,并赋值
//尾插结点法
void init_end()
{
head->next=NULL;
for(int i=10;i>0;i--)
{
Node* temp=new Node;
temp->data=i;
temp->next=head->next;
head->next=temp;
}
}
//输出链表
void show()
{
for(Node *temp=head->next;temp!=NULL;temp=temp->next)
{
cout << temp->data << " ";
}
cout << endl;
}
//查询并删除结点
void inquire(int x)
{
Node *precursor=head;
for(Node *temp=head->next;temp!=NULL;temp=temp->next)
{
if(temp->data==x)
{
precursor->next=temp->next;
delete temp;
return;
}
precursor=temp;
}
}
//插入结点
void insert(int x)
{
Node *temp=new Node;
temp->data=x;
temp->next=head->next;
head->next=temp;
}
int main()
{
int n,x;
init_end();
cin >> n; //n表示排队的次数
for(int i=1;i<=n;i++)
{
cin >> x;//x表示所排的玩具标号
inquire(x);
insert(x);
show();
}
return 0;
}
写博客的目的是为了记录自己所学的知识,如果本文中的内容能帮到大家的话,就更完美啦!!!
当然,如果有错误,麻烦大家评论区告知一下!!!我会积极改进的。3Q3Q