本文主要是介绍链表思想的题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
P1160 队列安排
用数组和结构题模拟链表
#include <bits/stdc++.h>
using namespace std;
int n, m, k, p, x, head;
struct node
{int data;int pre;int next;
}a[100010];
//将x插到y的左边
void insert(int x, int y)
{//如果y左边没有同学 if(a[y].pre==0){head=x;a[y].pre=x;a[x].next=y;}else{ //y左边有同学 int temp=a[y].pre; //记录y同学左边的同学temp a[temp].next=x; //将temp同学的右侧标记为x同学 a[x].pre=temp; //将x同学的左侧标记为temp同学a[x].next=y; //将x同学的右侧标记为y同学a[y].pre=x; //将y同学的左侧标记为x同学 }
}
void push_back(int x, int y)
{//如果y右边没有同学 if(a[y].next==0){a[y].next=x;a[x].pre=y;}else{ //y右边有同学 int temp=a[y].next; //记录y同学右边的同学temp a[temp].pre=x; //将temp同学的左侧标记为x同学 a[x].next=temp; //将x同学的右侧标记为temp同学a[x].pre=y; //将x同学的左侧标记为y同学a[y].next=x; //将y同学的右侧标记为x同学 }
}
int main()
{scanf("%d", &n);for(int i=1; i<=n; ++i){a[i].data=i;}head=1; //头部位置 for(int i=2; i<=n; ++i){scanf("%d %d", &k, &p);if(p==0){ //将i号同学插到k同学的左边 insert(i, k);}else{ //将i号同学插到k同学的右边 push_back(i, k);}}scanf("%d", &m);for(int i=1; i<=m; ++i){scanf("%d", &x);a[x].data=0;}while(a[head].next!=0){if(a[head].data!=0){printf("%d ", a[head].data); }head=a[head].next;}if(a[head].data!=0){printf("%d", a[head].data);}return 0;
}
这篇关于链表思想的题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!