排序阵列会使指针链接错误

Sorting an array makes pointers link wrongly

本文关键字:链接 错误 指针 阵列 排序      更新时间:2023-10-16

因此,我正在执行具有一些整数和指针的对象的算法。每当我进行排序时,指针都会开始行动奇怪,并链接到错误的索引。

这是我的代码

#include<iostream>
#include<stdio.h>
using namespace std;
class person
{
public:
    int knots, time, ID;
    int untie, status = 1;
    person *next = NULL;
};
///DEBUG
void print(person *a, int p)
{
        for (int i = 0; i < p; i++)
        {
            cout<<a[i].ID<<": "<<a[i].knots<<" "<<a[i].time<<" "<<a[i].untie<<" "<<a[i].status<<" Next: "<<a[i].next->ID<<endl;
        }
        cout<<endl;
}
int main()
{
    int p;
    scanf("%dn", &p);
    while (p != -1)
    {
        person *people = new person[p];
        for (int i = 0; i < p; i++)
        {
            people[i].ID = i+1;
            scanf("%d ", &people[i].knots);
            if (i)
            {
                people[i-1].next = &people[i];
            }
        }
        people[p-1].next = &people[0];
            scanf("/n");
        for (int i = 0; i < p; i++)
        {
            scanf("%d ", &people[i].time);
            if (i)
            {
                people[i-1].untie = people[i-1].time * people[i].knots;
            }
        }
        people[p-1].untie = people[p-1].time * people[0].knots;
        print(people, p);
        ///SORTING
        for (int i = 0; i < p-1; i++)
        {
            for (int j = i; j < p; j++)
            {
                if (people[j].untie < people[i].untie)
                {
                    person x = people[j];
                    people[j] = people[i];
                    people[i] = x;
                }
            }
        }
        print(people, p);
        for (int i = 0; i < p; i++)
        {
            if (people[i].status)
            {
                if (people[i].next->untie == people[i].untie)
                {
                    people[i].next->status = 2;
                }
                else
                    people[i].next->status = 0;
                if (people[i].status == 2)
                    people[i].status = 0;
            }
        }
        print(people, p);
    }
}

排序工作正常,但是问题在于我将"下一步"链接到错误的对象时。我使用链接的原因是即使在排序之后保持订单。

                person x = people[j];
                people[j] = people[i];
                people[i] = x;

这是因为您在上面的排序代码中交换值,而struct中记录的地址person *next尚未更改。

因此,旧的地址仍在struct person内部,而该地址中的内容在交换过程中已经修改,这导致了不一致。