簡體   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