繁体   English   中英

初学者从结构数组中删除第一个元素(C)

[英]Beginner Removing first element from an array of structs (C)

我有一个结构数组(实际上它是一个按优先级排序的堆数组)。

 typedef struct {
    char name[MAX_CHARACTERS+1];
    int priority;
} person;
person p[MAX_HEAPSIZE+1];

并想要删除数组中的第一个元素。 我不确定如何使用或使用什么命令。

到目前为止,我一直在做

void remove(){
    swap(0, heapsize-1);
    strcpy(p[heapsize-1].name, p[MAX_HEAP_SIZE+1].name);
    p[heapsize-1].priority = p[MAX_HEAP_SIZE+1].priority;
}

这将交换数组中的第一个和最后一个非空元素。 然后它尝试将空元素处的数据复制到数组中的最后一个非空元素(我要删除的元素)。

但我认为它只复制 memory 位置。 有什么简单的地方我可以做

p[0] = NULL?

数组是 memory 的连续块。 因此,如果要删除第一个元素,则必须将以下所有元素向开头移动一个元素:

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

这是相当低效的。 弹出第一个元素是堆的常见操作,因此您通常会以相反的方式执行 - 删除数组的最后一个元素 - 这非常快,因为数组的其他元素不受影响。

void remove(void)
{
    heapsize--;
}

heapsize然后可以用作堆顶部元素的索引(当然,假设您保留了堆属性)。

如果你想用最后一个覆盖数组的第一个元素并将最后一个元素的 memory 清零,不再使用,你可以使用 memcpy 和 memset:

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

但是,将最后一个元素的 memory 清零并不是绝对必要的,因为您不应该首先访问它。 除了使用 memcpy 用最后一个元素覆盖第一个元素,还可以使用strcpy和分配优先级来完成(就像在你的remove一样); 使用 memcpy 更简单。

听起来您正在尝试实现堆排序。 您实际上不需要“删除”堆的第一个元素,甚至最后一个元素。

相反,算法是从 output 的第一个元素(具有最高优先级的元素)复制值,然后将节点从数组的“末尾”复制到第一个 position 准备将其冒泡到正确的 position。 数组的“结束”由当前 heap_size 指示。

要“删除”数组的最后一项,只需将 heap_size 减 1。

我依稀记得冒泡是通过检查子项在移动项目上的优先级,然后将其与具有最高优先级的那个交换来完成的。 对移动的项目重复此操作,直到该项目与其子项具有相同或更高的优先级。

找到一个项的子项的技巧很简单:它们是 2*i 和 2*i+1 处的节点,其中数组从 1 开始而不是 0。(是否为 2*(i+1)-1和 2*(1+1) 表示基于 0 的 arrays?请检查我的数学。或者只是浪费数组的一个元素以保持数学简单。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM