1052 Linked List Sorting (25分)测试点4答案错误

①最后一个测试点错误,且只有一分,一般是特值没有处理好,考虑到如果恋上没有结点也应该输出0,-1.
②***if里注意是两个=,老是错
③应该注意并非所有结点都一定在初始给定的链上,用flag先标志一遍,再排序的同时将有效结点移动左端
④用%05d输出前端补0的五位整数
⑤本题最后输出的next会改变,有必要单独再节点中存储地址。

时隔半年,我又做了一遍!使用静态链表插入排序,好像不能原地进行,因为会断链。由于不带头结点,也不是循环链表,所以头结点尾结点都要单独处理,经过判断后分为三种情况进行插入,难免有些累赘,最后只拿了21分!有几个问题:
1⃣️判断到达最后一个结点的条件一开始写的是londe[p].next!=-1,后来发现这样处理不到最后一个结点,后来又改成lnode[p].adddress!=-1,但是又回取执行lnode[-1]这个结构体,最后的解决办法是:

for(lnode[p].address!=-1)
if(p==-1)
break;

2⃣️插入第一个结点与插入中间结点区别,都是当前要插入的结点小于res的结点,那么怎么区分开来?
第一个办法是设置了标志位,标志已经插入首部,比后边也不用插了,后来发现更好的应该是党插入一个结点时就应该break,结束本次插入;
3⃣️解读:

for(i=0;i<100000;i++){
         lnode[i].address=-1;
         res[i].next=-1;
     }

lnode中没有初始化到的点,默认为0,但是0可能是数组下标,因此应该初始化为-1来判断lnode中的结点已经遍历完成。
在lnode中的最后一个结点,未必是res中的最后一个结点,本应给res最后一个元素赋值-1的,算是暴力法吧

#include<iostream>
#include<iomanip>
using namespace std;
struct node{
    int data,address,next;
}lnode[100000],res[100000];
int main(){
    int i,j,n,root;
    cin>>n>>root;
    if(n==0)
        cout<<"0 -1";
    for(i=0;i<100000;i++){
         lnode[i].address=-1;
         res[i].next=-999;
     }
    for(i=0;i<n;i++){
        cin>>j;
        lnode[j].address=j;
        cin>>lnode[j].data>>lnode[j].next;
    }
    res[root].data=lnode[root].data;
    res[root].address=lnode[root].address;
    int root1=root;
    root=lnode[root].next;
    if(n>1)
    {for(int p=root;lnode[p].address!=-1;p=lnode[p].next){
        int q,pre;
        for(q=root1,pre=root1;q!=-1;q=res[q].next){   //两个链表首结点可能不同
            if(lnode[p].data<res[root1].data){
                res[p].next=root1;        //没有前驱结点,只管后继和值域,不带头结点
                res[p].data=lnode[p].data;
                root1=p;
                res[root1].address=root1;
                break;
            }
            if(lnode[p].data<=res[q].data){              //中间结点的插入操作
                res[pre].next=p;
                res[p].data=lnode[p].data;
                res[p].next=res[q].address;
                res[p].address=p;
                break;
            }
            if(q!=root1)
                pre=res[pre].next;
        }
        if(q==-1){
            res[p].data=lnode[p].data;
            res[p].address=p;
            res[pre].next=p;
        }
        if(lnode[p].next==-1)
            break;
      }
    }
    cout<<n<<" "<<setw(5)<<setfill('0')<<root1<<endl;
    if(n>0)
    {for(int q=root1;res[q].address!=-1;q=res[q].next){
        cout<<setw(5)<<setfill('0')<<res[q].address<<" "<<res[q].data<<" ";
        if(res[q].next!=-1)
            cout<<setw(5)<<setfill('0')<<res[q].next<<endl;
        else{
            cout<<"-1"<<endl;break;
        }
    }
    }
    return 0;
}






#include<algorithm>
using namespace std;
struct node {
    int address, data, next, flag = 0;
}n[100010];
bool cmp(node a, node b)
{
    if (a.flag == b.flag) return a.data < b.data;
    else
        return a.flag > b.flag;
}
int main()
{
    int m, s1, count = 0;
    cin >> m >> s1;
    for (int i = 0; i < m; i++)
    {
        int ad;
        cin >> ad;
        cin >> n[ad].data >> n[ad].next;
        n[ad].address = ad;
    }
    for (int p = s1; p != -1; p = n[p].next)
    {
        n[p].flag = 1;
        count++;
    }
    sort(n, n + 100000, cmp);
    if(count==0)
    {
        printf("0 -1\n");
        return 0;
    }
    printf("%d %05d\n", count, n[0].address);
    for (int i = 0; i < count; i++)
    {
        if (i == count - 1)
            printf("%05d %d -1\n", n[i].address, n[i].data);
        else
        {
            printf("%05d %d %05d\n", n[i].address, n[i].data,n[i+1].address);
        }
    }
    return 0;
} ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值