自己写的:(16分)
#include<bits/stdc++.h>
using namespace std;
struct node
{
string add;
int data;
string next;
};
//结构体数组按照某一项进行排序
bool cmp(node a,node b)
{
return a.data>b.data;
}
int main()
{
string d;
int n,k;
cin>>d>>n>>k;//printf读取不成功可以 试试cin
node no[n];
for(int i=0;i<n;i++)
{
cin>>no[i].add>>no[i].data>>no[i].next;
}
//以上可以成功读取
//创建一个新数组来保存按照地址排序后的
node non[n];
int j=0;
for(int i=0;i<n;i++)
{
if(d==no[i].add)
{
non[j].add=no[i].add;
non[j].data=no[i].data;
non[j].next=no[i].next;
}
}
//将第一个结点存入到链表当中(上面)
for(j=1;j<n;j++)
{
for(int i=0;i<n;i++)
{
if(non[j-1].next==no[i].add)
{
non[j].add=no[i].add;
non[j].data=no[i].data;
non[j].next=no[i].next;
}
}
}
//
// for(int i=0;i<n;i++)
// {
// cout<<non[i].add<<" "<<non[i].data<<" "<<non[i].next<<endl;
// }
//对新的结构体进行排序
// int i=0;
// while(i<=n-k){
// sort(non+i,non+k+i,cmp);
// i=k+i;
// }
// for(int i=0;i<=n-k;i=i+1+k)
// {
// sort(non+i,non+i+k,cmp);
// i=k+i;
// }
//先算出排序的次数
int c=n/k;
while(c)
{
int i=0;
sort(non+i,non+k+i,cmp);
i=k+1;
c--;
}
//排序好了 地址不对 用左下换右上
for(int i=1;i<n;i++)
{
non[i-1].next=non[i].add;
}
for(int i=0;i<n;i++)
{
cout<<non[i].add<<" "<<non[i].data<<" "<<non[i].next<<endl;
}
}
大神的:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int first, k, n, temp;
cin >> first >> n >> k;
int data[100005], next[100005], list[100005];
for (int i = 0; i < n; i++) {
cin >> temp;
cin >> data[temp] >> next[temp];
}
int sum = 0;//不一定所有的输入的结点都是有用的,加个计数器
while (first != -1) {
list[sum++] = first;
first = next[first];
}
// 按照地址形成了一个链表
for (int i = 0; i < (sum - sum % k); i += k)
reverse(begin(list) + i, begin(list) + i + k);
//前面已经按照地址形成了一个链表,现在逆序
for (int i = 0; i < sum - 1; i++)
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
return 0;
}
pat乙级反转链表(好难哦)(没理解代码)
最新推荐文章于 2022-02-05 17:39:01 发布