PAT 1133 C++

1.题意

按照题意指定,将一个单链表重组。重组要求如下:

  • 节点值为负数的在单链表第一部分
  • 节点值在[0,k] 之间的在单链表的第二部分
  • 剩余的在单链表的第三部分

2.分析

使用三个while(root!=-1)循环依次将结果写入到 set<node>中,这样就可以保证按照顺序存储。

3.代码

#include<cstdio>
#include<set>
#include<iostream>

using namespace std;
struct node{
	int address;
	int next = -1;
	int data;
	int order;
	bool operator<(const node &n)const{
		return n.order > order;
	}
};

node n[100005];
int main(){
	int root,N,K;//N是总结点数; K是范围值
	scanf("%d %d %d",&root,&N,&K);
	int i ,j;	
	int address;
	for(i = 0;i< N ;i++){
		scanf("%d",&address);
		scanf("%d %d",&n[address].data,&n[address].next);
		n[address].address = address;
	} 
	int tempRoot = root;
	
	set<node> res; 
	node tempNode;
	int index = 0;
	while(tempRoot!=-1){//=-1表示到头 
		if(n[tempRoot].data < 0){
			tempNode.address = tempRoot;
			tempNode.data = n[tempRoot].data;			
			tempNode.order = index;
			index ++;
			res.insert(tempNode);//放入set中 
		}
		tempRoot = n[tempRoot].next; 
	}
	
	tempRoot = root;
	while(tempRoot != -1){//放入 值 <= K的元素
		if(n[tempRoot].data <= K && n[tempRoot].data >= 0){
			tempNode.address = tempRoot;
			tempNode.data = n[tempRoot].data;	
			tempNode.order = index;
			index++;		
			res.insert(tempNode);//放入set中 
		}
		tempRoot = n[tempRoot].next; 	
	}
	
	tempRoot = root;
	while(tempRoot != -1){//放入 值 <= K的元素
			if(n[tempRoot].data > K){
			tempNode.address = tempRoot;
			tempNode.data = n[tempRoot].data;
			tempNode.order = index;
			tempNode.next = -1;
			index++;			
			res.insert(tempNode);//放入set中 
		}
		tempRoot = n[tempRoot].next; 	
	}
	
	set<node>::iterator nextIt;
	set<node>::iterator backIt;
	for(set<node>::iterator it = res.begin();it!=res.end();it++){
		backIt=it;
		nextIt=++it;
		if(nextIt!=res.end())	printf("%05d %d %05d\n",backIt->address,backIt->data,nextIt->address);		
		else 	printf("%05d %d -1\n",backIt->address,backIt->data);	
		it=backIt;
	}
} 

4.测试用例

00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

5.执行结果

PAT 1133 C++版_c

6.总结

在整个代码中,需要注意的问题有:

  • set的遍历过程中,需要使用一个backItnextIt。因为需要输出下一个节点的address
  • 因为set中存放的是自定义的类型node,所以在定义结构体node时也需要重载运算符<