题意:给出N个结点的地址address、数据域data及指针域next,然后给出链表的首地址,要求把在这个链表上的结点按data值从小到大输出。
思路:
- 定义静态链表。节点性质由变量flag定义,用以表示是否为有效节点,即是否出现在链表中,true表示有效节点。
- 读入数据
- 对链表进行遍历,并标记有效元素,记录有效元素个数
- 调用sort函数,由先定义好的cmp函数,对链表进行排序,先判断是否为有效元素,然后进行比较,把有效节点都移至数组最左端。
- 依据题目进行输出
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100000;
struct Node
{
//记录当前节点地址,数值,下一个节点的地址
int add, key, next;
//是否为有效节点
bool flag;
//初始化
Node(int a = 0, int k = 0,int n=0,bool f=false):add(a),key(k),next(n),flag(f){}
};
//排序函数,将有效节点全部移至最左端并根据节点数值大小进行排序
bool cmp(Node A, Node B)
{
//首先判断是否为有效节点
if (A.flag && B.flag) return A.key < B.key;
else return A.flag > B.flag;
}
Node datas[maxn];
int main()
{
int num, first, count = 0;
scanf("%d %d", &num, &first);
//读入节点数据
for (int i = 0,a,d,n;i < num;i++)
{
scanf("%d %d %d", &a, &d, &n);
datas[a].key = d;
datas[a].next = n;
datas[a].add = a;
}
//遍历链表,并标记有效节点,得出有效节点数目
while (first != -1)
{
datas[first].flag = true;
first = datas[first].next;
count++;
}
//考虑特殊情况,没有有效节点
if (count == 0) printf("0 -1");
else
{
//对链表进行排序
sort(datas, datas + maxn, cmp);
//按要求进行输出
printf("%d %05d\n", count, datas->add);
for (int i = 0;i < count;i++)
{
if (i == count - 1)
{
printf("%05d %d %d\n", datas[i].add, datas[i].key, -1);
}
else printf("%05d %d %05d\n", datas[i].add, datas[i].key, datas[i + 1].add);
}
}
return 0;
}```