您的位置:首页 > 编程语言 > C语言/C++

PAT甲级 1133 Splitting A Linked List (25分) C++

2020-06-24 04:26 89 查看

1133 Splitting A Linked List (25分)

题目大意:给定链表,把负数放在最前面,小于等于k的数放中间,大于k的放最后(相同条件的数按照链表原来的相对顺序排列)

tips:

  1. 使用map存放node的address,方便把结点串起来(寻找下一结点位置);
  2. 把负数放到vector的前面,大于k的放到vector后面(也可以用一个独立的vector存放)(倒序输出),把中间部分的数放到另一个vector中,最后按照一定顺序输出所有数。
#include<iostream>                  //输入输出流头文件
#include<map>                       //map映射容器
#include<vector>                    //变长数组容器
using namespace std;                //标准命名空间
int n,k,e,pre=0;
string add,nextadd,s;
struct node{
int elem;
string add,nextadd;
node(){}
node(string add,int elem,string nextadd):add(add),elem(elem),nextadd(nextadd){}
};
int main(){                         //主函数
cin>>s>>n>>k;
int last=n-1;
map<string,node> l;
node startnode;
vector<node> ordernode(n),innode;
for(int i=0;i<n;i++){
cin>>add>>e>>nextadd;
l[add]=(node(add,e,nextadd));
if(add==s) startnode=(node(add,e,nextadd));
}
while(1){
if( startnode.elem<0) ordernode[pre++]=startnode;
else if(startnode.elem>k) ordernode[last--]=startnode;
else innode.push_back(startnode);
if(startnode.nextadd=="-1") break;
startnode=l[startnode.nextadd];
}
for(int i=0;i<pre;i++)   printf("%s %d %s\n",&ordernode[i].add[0],ordernode[i].elem,(i+1<pre?&ordernode[i+1].add[0]:(innode.size()>0?&innode[0].add[0]:(last==n-1?"-1":&ordernode[n-1].add[0]))));
for(int i=0;i<innode.size();i++) printf("%s %d %s\n",&innode[i].add[0],innode[i].elem,i+1<innode.size()?&innode[i+1].add[0]:(last==n-1?"-1":&ordernode[n-1].add[0]));
for(int i=n-1;i>last;i--)printf("%s %d %s\n",&ordernode[i].add[0],ordernode[i].elem,i-1>last?&ordernode[i-1].add[0]:"-1");
return 0;                       //返回0,如果不返回0,PAT会报错
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: