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值,需要习惯这种思维方式。

相关推荐
仍然.9 分钟前
算法题目---前缀和
算法
计算机安禾10 分钟前
【C语言程序设计】第34篇:文件的概念与文件指针
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
大熊背13 分钟前
双目拼接摄像机中简单的亮度差校正原理
人工智能·算法·双目拼接·亮度差消除
CoovallyAIHub23 分钟前
AAAI 2026 | 上海AI Lab发布RacketVision,首次为球拍运动标注球拍姿态
深度学习·算法·计算机视觉
大熊背24 分钟前
双目拼接摄像机中简单的色差校正原理
人工智能·算法·isppipeline·双目拼接
CoovallyAIHub32 分钟前
中文语音识别该用谁?6 个开源模型 + 2 个配套工具,一文理清
深度学习·算法·计算机视觉
会编程的土豆36 分钟前
【数据结构与算法】 二叉树做题
开发语言·数据结构·c++·算法
木禾ali0th39 分钟前
告别大模型“裸奔”:开源项目 ClawVault 架构与核心能力解析
算法·安全
Storynone39 分钟前
【Day28】LeetCode:509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
python·算法·leetcode
DeepModel1 小时前
【统计检验】方差分析(ANOVA)
算法