0
我正在嘗試調整堆對象的大小,以便程序可以繼續,如果用戶嘗試構建超過堆容量的堆。我能夠返回一個指向新堆的指針,但是這對於我的程序的其他部分不起作用。我想直接改變指針p
指向的位置。這是我的嘗試。它編譯但指針仍然指向舊的位置。請幫我修復此代碼,以便我不必從我的BuildHeap
函數返回指針。我會發布我的所有代碼,但這是作業,我不希望我的作品被複制。如何通過引用傳遞指針來更改指針所指向的位置?
HEAP* Initialize(int n) {
HEAP* p;
p = new HEAP;
p->size = 0;
p->capacity = n;
p->H = new ELEMENT[p->capacity+1]; //first address not used, so we need +1 here
return p;
}
void Resize(int n, HEAP*& ptr) { //pass pointer by reference
ptr = Initialize(n);
}
void BuildHeap(HEAP* p, ELEMENT *A) {
int length = A[0].key; //length = array size stored in A[0]
if(length <= p->capacity) {
p->size = length;
for(int i = 1; i <= length; i++) {
p->H[i].key = A[i].key; //copy ELEMENT array into heap object's H array
}
for(int i = (length)/2; i >= 1; i--)
MaxHeapify(p, i);
}
else {
cout << "Error: Heap capacity exceeded. Resizing heap.\n";
Resize(length, p); //initialize a new, larger heap
BuildHeap(p, A);
cout << "Heap built with new heap capacity of " << p->capacity << ".\n";
}
}
編輯:我能夠通過檢查來解決我的問題,如果需要的指針,甚至稱BuildHeap之前可以更改:
if(length > p->capacity) { //resize heap if capacity is exceeded
cout << "Error: Heap capacity exceeded. Resizing heap.\n";
p = Initialize(length);
}
BuildHeap(p, A);
BuildHeap的調用方不保存任何類型的返回,但堆確實得到修改。這就是我使用指針開始的原因。如果它只有一個副本,那麼當堆不超過容量時堆是如何建立的? – Johnny
@Johnny我不確定我可以按照你的想法,尤其是考慮到你不想顯示你的其他代碼。有些東西對我來說沒有意義,比如「保存任何類型的回報」。而且,你使用指針的原因和你處理它們的方式看起來很奇怪,但是再次看到更多的代碼很難給出更好的建議。 –
我的意思是該函數返回void,但仍然修改堆。在我實現指針之前,我可以訪問堆並對其進行排序的唯一方法是返回一個HEAP對象。現在我想更進一步,並根據需要調整堆的大小,而不返回指針(即修改指針)。我已經能夠像以前一樣通過從main調用函數時返回一個指針來實現這一點,但這並不理想。我認爲問題在於我試圖修改指針本身,而不是指針指向的數據,這是與以前不同的一組情況。謝謝。 – Johnny