Удалить один элемент из struct [duplicate]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

1
задан coril 14 August 2011 в 23:00
поделиться

2 ответа

Массив - это непрерывный блок памяти. Поэтому, если вы хотите удалить первый элемент, вам нужно переместить все следующие элементы в начало по одному элементу:

void remove(void)
{
    memmove(&p[0], &p[1], (MAX_HEAPSIZE - 1) * sizeof(person));
}

Это довольно неэффективно. Появление первого элемента - это обычная операция с кучей, поэтому вы обычно делаете это наоборот - удалите последний элемент массива - это очень быстро, потому что другие элементы массива не затронуты.

void remove(void)
{
    heapsize--;
}

heapsize можно затем использовать как индекс верхнего элемента кучи (если вы, конечно же, сохраните свойство кучи).

Если вы хотите перезаписать первый элемент массива с последним и обнулить память последнего элемента, который больше не используется, вы можете использовать memcpy и memset:

void remove(void)
{
    memcpy(&p[0], &p[heapsize - 1], sizeof(person));
    memset(&p[heapsize - 1], 0x00, sizeof(person));
}

Обнулить память последнего элемент не является строго необходимым, хотя, потому что вы не должны обращаться к нему в первую очередь. Вместо того, чтобы переписать первый элемент последним с помощью memcpy, его также можно выполнить с помощью strcpy и назначения приоритета (как в вашем remove); использование memcpy просто проще.

3
ответ дан Antti 24 August 2018 в 08:40
поделиться

Похоже, вы пытаетесь реализовать сортировку кучи. Вам фактически не нужно «удалять» первый элемент кучи или даже последний.

Вместо этого алгоритм должен скопировать значения из первого элемента (элемент с наивысшим приоритет) для вывода, а затем для копирования узла из «конца» массива в первую позицию при подготовке к его пузырьку в правильное положение. «End» массива обозначается текущим значением heap_size.

Чтобы «удалить» последний элемент массива, просто уменьшите heap_size на 1.

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

Трюк для поиска детей элемента легко: они являются узлами в 2 * i и 2 * i +1, где массив начинается с 1 вместо 0. (Будет ли это 2 * (i + 1) -1 и 2 * (1 + 1) для массивов на основе 0? Проверьте мою математику, пожалуйста. элемент массива, чтобы математика была простой.)

0
ответ дан UncleO 24 August 2018 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: