PTA B1025 反转链表 (25 分)(静态链表)

题目链接:点击这里

PTA B1025 反转链表 (25 分)(静态链表)_第1张图片
PTA B1025 反转链表 (25 分)(静态链表)_第2张图片
PTA B1025 反转链表 (25 分)(静态链表)_第3张图片

PTA B1025 反转链表 (25 分)(静态链表)_第4张图片 PTA B1025 反转链表 (25 分)(静态链表)_第5张图片

其实,前一半部分还像是个静态链表题,后一半部分输出的时候就是个模拟题嘛^ _ ^,各种边界处理。。。

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 100010;
int a[maxn];

//定义静态链表 
struct Node
{
	int address;
	int data;
	int next;
	int order;	//记录结点在链表上的序号,无效节点记为maxn 
}node[maxn];

bool cmp(Node a,Node b)
{
	return a.order < b.order;
}

int main()
{
	//初始化全部为无效节点 
	for(int i=0;i<maxn;i++)
		node[i].order = maxn;
	
	int begin,n,k;
	scanf("%d%d%d",&begin,&n,&k);
	int address;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&address);
		scanf("%d%d",&node[address].data,&node[address].next);
		node[address].address = address;
	}
	
	int count = 0;	//count计数有效结点的数目 
	int p = begin;//遍历链表,找出单链表的所有有效节点 
	while(p!=-1)
	{
		node[p].order = count++;
		p = node[p].next;
	}
	//按order从头到尾顺序排列 
	sort(node,node+maxn,cmp);
	
	//有效节点为前count个节点
	//单链表已经形成,下面是按要求输出
	 
	for(int i=0;i<count/k;i++)//枚举完整的count/k块 
	{
		for(int j=(i+1)*k-1;j>i*k;j--)	//第i块倒着输出 
			printf("%05d %d %05d\n",node[j].address,node[j].data,node[j-1].address);
		
		//下面是每一块的最后一个节点的next地址的处理 
		printf("%05d %d ",node[i*k].address,node[i*k].data);
		if(i<count/k-1)	//如果不是最后一块,就指向下一块的最后一个节点 
		{
			printf("%05d\n",node[(i+2)*k-1].address);
		}
		else	//是最后一块 
		{
			if(count%k==0)	//恰好是最后一个结点,输出-1 
			{ 
				printf("-1\n");
			} 
			else	//剩下不完整的块按原先的顺序输出 
			{
				printf("%05d\n",node[(i+1)*k].address);
				//剩下不完整的块按原先的顺序输出 
				for(int i=count/k*k;i<count;i++)
				{
					printf("%05d %d ",node[i].address,node[i].data);
					if(i<count-1)
						printf("%05d\n",node[i+1].address);
					else	//防止-1被%05d化 
						printf("-1\n");
				} 
			}	
		}
	}
	return 0;
}

你可能感兴趣的:(链表与邻接表)