Как отсортировать массив структур с указателями на один и тот же массив - PullRequest
0 голосов
/ 11 июля 2019

У меня есть массив структур (вершин), у каждой структуры есть имя, цвет, количество соседей и массив указателей (соседей), все указатели ссылаются на вершину в основном массиве структур. Я хочу сделать некоторые переупорядочения на основе имени, цвета и т. Д., И проблема в том, что всякий раз, когда я переупорядочиваю основной массив структур, каждый массив соседей теряет реальный адрес соседей (из-за переключения позиции).

Я ДО использую qsort(), и я не могу изменить структуры данных.

Вот вся структура данных:

struct VerticeSt {
    int vertice;
    int color;
    int cantVecinos;
    struct VerticeSt* (*vecinos)[];
};

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Подумайте дважды, прежде чем перемещать структуру, на которую ссылаются другие узлы. Когда вы сортируете массив вершин, все грани и ребра, которые на них указывают, должны быть актуализированы, чтобы указывать на новое место, куда вы их переместили. Или вы потеряете всю свою структуру данных. По этой причине гораздо интереснее использовать массив указателей и отсортировать массив вместо целых структур. Вы можете иметь три или четыре массива указателей, показывающих различные порядки, не нарушая вашу сетку. И копирование указателя дешевле, чем копирование всей структуры.

0 голосов
/ 11 июля 2019

Если я правильно понимаю, вопрос:

Как мне синхронизировать 2 структуры данных, если я сортирую одну из них?

Текущий статус:

sort()
{
    ...
    swap(a,b);
    ...
}

, что, конечно, не касается второй структуры данных, что приводит к потере синхронизации.

Я бы использовал следующий алгоритм для их синхронизации:

sort()
{
    ...
    swap(*pa, *pb);
    swap( pa,  pb);
    ...
}

Разница между ними заключается в добавлении еще одной строки кода для обработки второй структуры данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...