代码如下,通过map把开始的输入转化了两个链表
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<cmath>
#pragma warning(disable:4996)
using namespace std;
struct node {
int data;//数据
string addr;//map容器中表示下一个地址,vector中代表当前地址
node() = default;
node(int a, string s) { data = a;addr = s; }
};
bool visited[50000];//判断是否重复
map<string, node> all;//保存开始的输入 (string、node.data、node.addr)的形式
vector<node> r1, r2;//两个输出
int main()
{
string first;
int N;
cin >> first >> N;
for (int t = 0;t < N;t++)//保存输入
{
char str1[6], str2[6];
int tem;
scanf("%s %d %s", str1, &tem, str2);
all[string(str1)].addr = str2;all[string(str1)].data = tem;
}
while (first != "-1")//把输入转换到两个输出容器
{
if (visited[abs(all[first].data)]) r2.push_back(node(all[first].data, first));
else
{
visited[abs(all[first].data)] = true;
r1.push_back(node(all[first].data, first));
}
first = all[first].addr;
}
unsigned int t;
for (t = 0;t+1 < r1.size();t++)//输出
printf("%s %d %s\n", r1[t].addr.c_str(), r1[t].data, r1[t + 1].addr.c_str());
if(t<r1.size())printf("%s %d -1\n", r1[t].addr.c_str(), r1[t].data);
for (t = 0;t+1 < r2.size();t++)
printf("%s %d %s\n", r2[t].addr.c_str(), r2[t].data, r2[t + 1].addr.c_str());
if(t<r2.size())printf("%s %d -1\n", r2[t].addr.c_str(), r2[t].data);
}