Массив - это непрерывный блок памяти.Поэтому, если вы хотите удалить первый элемент, вы должны переместить все следующие элементы в начало на один элемент:
void remove(void)
{
memmove(&p[0], &p[1], (MAX_HEAPSIZE - 1) * sizeof(person));
}
Это довольно неэффективно.Выделение первого элемента - это обычная операция с кучей, поэтому вы обычно делаете это наоборот - удаляете последний элемент массива - что очень быстро, потому что другие элементы массива не затрагиваются. *Затем можно использовать 1004 *
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 проще.