A1133 Splitting A Linked List (25分)

#include<cstdio>
#include<string>
#include<iostream>
#include<vector>
#include <algorithm>//fill()在里面 
#include <cmath>
#include<queue>
#include<unordered_set>
#include<set> 
#include <cstdlib>//貌似是free,malloc等函数的头文件 
using namespace std;

//A1133 对比A1052 
const int INF=1e9; //fill(map[0],map[0]+maxn*maxn,INF); 
const int maxn=100010;
//链表节点存储结构 
struct node{
	int data;
	int next;
	int id;
}temp;
//由于要利用下标,所以使用数组或者申明了大小的变长数组 
node crude[maxn];
vector<node> list,ans;
//list存放链表数据,ans存放最后排序之后的结果 

int main(){
	int head,n,k;//k划分list list划分为三段(-,0)[0,k],(k,+):一组内的数字的相对位置不变 
	scanf("%d%d%d",&head,&n,&k);
	//address非负五位数
	//考察静态表示链表 
	int pos;
	while(n--){
		//得根据头结点把在该链表上的节点选出来
		 scanf("%d",&pos);
		 scanf("%d%d",&crude[pos].data,&crude[pos].next); 
		 crude[pos].id=pos;
	} 
//	int index=0;
	for(int i=head;i!=-1;i=crude[i].next){
		//i迭代的是下标地址;按链表的顺序放入容器中 
		list.push_back(crude[i]);
	}
	//划分链表三份 :暴力遍历??遍历三遍?反正是线性。。。 
	//[-,0)[0,k](k,+]
	for(int i=0;i<list.size();i++){
		if(list[i].data<0){
			ans.push_back(list[i]);
		}
	}
	for(int i=0;i<list.size();i++){
		if(list[i].data<=k && list[i].data>=0){
			ans.push_back(list[i]);
		}
	}
	for(int i=0;i<list.size();i++){
		if(list[i].data>k){
			ans.push_back(list[i]);
		}
	}
	//输出
	int last=ans.size()-1;
	for(int i=0;i<ans.size()-1;i++){
		//用cout就输不出格式了 
//		cout<<ans[i].id<<" "<<ans[i].data<<" "<<ans[i+1].id<<endl;//ans[i].next 缺了head的next节点 
		printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id); 
	} 
	//输出最后一行:不能用ans[last].next:因为最后一个节点在最开始的初始化next可能不是-1 
//	cout<<ans[last].id<<" "<<ans[last].data<<" "<<ans[last].next<<endl;//ans[i].next 缺了head的next节点 
		printf("%05d %d -1",ans[last].id,ans[last].data); 
	 
	 
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值