/* 静态链表 */
#include<cstdio>
#include<cstring>
const int M = 10010;
struct NODE
{
char data;
int next;
bool flag;
}node[M];
int main()
{
for(int i=0;i< M;i++)
node[i].flag = false;
int s1, s2, n;
scanf("%d%d%d", &s1, &s2, &n);
for(int i=0; i<n; i++)
{
int add, nextadd;
char data;
scanf("%d %c %d", &add, &data, &nextadd);
node[add].data = data;
node[add].next = nextadd;
}
int p;
for(p=s1; p != -1; p=node[p].next)
node[p].flag = true;
for(p=s2; p != -1; p=node[p].next)
if(node[p].flag == true)
{
printf("%05d\n", p);
break;
}
if(p == -1)
printf("-1\n");
return 0;
}
#include<cstdio>/* 按其他顺序输出静态链表 */
#include<iostream>
#include<algorithm>
using namespace std;
const int M = 100010;
struct NODE
{
int address, data, next;
bool flag;
}node[M];
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<M ;i++)
node[i].flag = false;//无效结点
int n, begin, address;
scanf("%d%d", &n, &begin);//个数, 开始地址
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, p = begin;//使p为第一个结点地址
while(p != -1)//可能输入地址不一定在链表中,(不连续),单独执行此步
{
node[p].flag = true;//标记有效结点
count++;//个数
p = node[p].next;//移到下一个结点
}
if(count == 0)//新链表没有结点输出 0 -1
{
printf("0 -1\n");
return 0;
}
sort(node, node + M, cmp);//注意是大范围的排序
printf("%d %05d\n", count, node[0].address);
for(int i=0; i<count;i++)
{
if(i != count -1)//防止-1被%05d化,提前判断
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);
}
return 0;
}/* 5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345
-------------------
5 12345
12345 -1 33333
00001 0 22222
11111 100 -0001
22222 1000 12345
33333 100000 -1*/
静态链表相关
最新推荐文章于 2024-07-12 18:56:03 发布