自從我真的使用C以來已經有一段時間了,所以我很抱歉,如果這是顯而易見的事情,我只是忘記指針如何工作。基本上,我有一個鏈接列表結構,其中每個鏈接都有一個分數。我試圖編寫一個遍歷我的列表並刪除最低分數的鏈接的算法。我的結構看起來像這樣:C - 瞭解指向指針的指針並修改內存位置的值
typedef struct linkedList_tag {
struct linkedList_tag *next;
int score;
} LinkedList;
typedef struct head_tag {
int size;
struct linkedList_tag *next;
} Head;
其中Head是列表中默認的第一個鏈接。我現在的算法看起來大致是這樣的:
void removeLowest(Head *head)
{
LinkedList** lowestPrev;
LinkedList* current;
int lowestScore;
if (head->next != NULL) {
head->size--;
lowestPrev = &head->next;
current = head->next;
lowestScore = current->score;
while (current != NULL) {
if (current->score < lowestScore) {
lowestPrev = ¤t;
lowestScore = current.score;
}
current = current->next;
}
*lowestPrev = (*lowestPrev)->next;
}
}
現在,我知道這個代碼將不能工作,我想我明白它在做什麼。我不明白的是如何修改代碼來完成我的預期目標。
我的意圖是將指針的內存位置存儲到變量「lowestPrev」中的最低得分節點,然後將最低得分節點之後的節點的指針值分配給該內存位置。所以,我每次遇到比我現在的得分最低得分較低的節點,我會拿着它的點的存儲位置的變量:
if (current->score < lowestScore) {
lowestPrev = ¤t;
lowestScore = current.score;
}
,並在年底,我將分配的指針值在這個存儲位置下一個環節:
*lowestPrev = (*lowestPrev)->next;
然而,似乎「lowestPrev」(如果我正確理解這一點)不會簡單的保留它最初分配給它的內存位置,但更新它的值每它指向的指針被更新的時間,在這裏:
current = current->next;
我是否正確理解此行爲,如果是這樣,我如何修改我的代碼以完成我所說明的目標?
不能寫一個完整的答案,但一個快速提示 - 你永遠'free'ing被去除的節點。這是一個內存泄漏 – Fureeish
你不需要不同的結構頭和列表,只有一個名爲list_node的結構,例如 –
'lowestScore = current.score;' - >'lowestScore = current-> score;' –