PTA 1052 Linked List Sorting

个人学习记录,代码难免不尽人意。

A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the structures according to their key values in increasing order.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive N (<10 5) and an address of the head node, where N is the total number of nodes in memory and the address of a node is a 5-digit positive integer. NULL is represented by −1.

Then N lines follow, each describes a node in the format:

Address Key Next

where Address is the address of the node in memory, Key is an integer in [−10 5,10 5], and Next is the address of the next node. It is guaranteed that all the keys are distinct and there is no cycle in the linked list starting from the head node.

Output Specification:

For each test case, the output format is the same as that of the input, where N is the total number of nodes in the list and all the nodes must be sorted order.

Sample Input:

5 00001

11111 100 -1

00001 0 22222

33333 100000 11111

12345 -1 33333

22222 1000 12345

Sample Output:

5 12345

12345 -1 00001

00001 0 11111

11111 100 22222

22222 1000 33333

33333 100000 -1

cpp 复制代码
#include <cstdio>
#include<algorithm>
using namespace std;
struct Node{
	int address;
	int next;
	int data;
	bool flag;
}node[100010];
bool cmp(Node a,Node b){
	if(a.flag==false||b.flag==false){
		return a.flag>b.flag;
	}else{
		return a.data<b.data;
	}
	
}
int main(){
   for(int i=0;i<100010;i++){
   	node[i].flag=false;
   }
   int n,begin;
   scanf("%d %d",&n,&begin);
   for(int i=0;i<n;i++){
   	int address,next;
   	int data;
   	scanf("%d %d %d",&address,&data,&next);
   	node[address].address=address;
   	node[address].data=data;
   	node[address].next=next;
   	//node[address].flag=true;这个地方不能直接赋true,因为题目中给的数据可能不在链表上! 
   } 
   int count=0;
   int p=begin;
   while(p!=-1){
   	node[p].flag=true;
   	count++;
   	p=node[p].next;
   } 
   if(count==0)
   printf("0 -1");
   else{
   	sort(node,node+100010,cmp);
   	printf("%d %05d\n",count,node[0].address);
   	for(int i=0;i<count;i++){
   		if(i!=count-1){
   			printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
		   }
		else{
			printf("%05d %d -1\n",node[i].address,node[i].data);
		}
	   }
   }
}

本题采用了静态链表的方法,需要注意的是在链表节点内部存储了其地址,因为链表排序只改变节点的next值,而其本身的address不发生改变。所以最后输出的时候,next输出的是物理存储上的下一个节点的address值而不是next值,需要习惯这种思维方式。

相关推荐
wljy13 小时前
牛客每日一题(2026.4.30) 整数域二分
c语言·c++·算法·蓝桥杯·二分
水蓝烟雨4 小时前
3335. 字符串转换后的长度 I
算法·leetcode
Dxy12393102164 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
westdata-Tm4 小时前
洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
算法·深度优先·dfs
南宫萧幕4 小时前
MATLAB/Simulink 从零打通:HEV 能量管理 GA 联合仿真保姆级建模指南
开发语言·算法·matlab·汽车·控制·pid
小雅痞4 小时前
[Java][Leetcode middle] 15. 三数之和
java·算法·leetcode
图码4 小时前
矩阵数据结构入门指南:声明、初始化与基本操作
运维·数据结构·线性代数·算法·矩阵
Navigator_Z4 小时前
LeetCode //C - 1030. Matrix Cells in Distance Order
c语言·算法·leetcode
无敌昊哥战神4 小时前
【回溯算法巅峰之作】LeetCode 51. N皇后问题详解与常见避坑指南 (C/C++/Python)
c语言·算法·leetcode
mftang4 小时前
BSS段、Data段、Text段的具体含义和数据特性
数据库·算法