2013-10-19 33 views
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); 

回答

2

我覺得你的問題是,你只使用一個參考指針在一個地方,但不在其他地方。看看BuildHeap簽名:

void BuildHeap(HEAP* p, ELEMENT *A) 

在這裏,當你調用BuildHeap,作爲第一個參數傳遞p指針的一份拷貝。隨後調用Resize會修改該副本,但BuildHeap的調用方仍然有其自己的未修改的指針。你可能想改變BuildHeap(可能還有其他方法)簽名使用的引用,以及:

void BuildHeap(HEAP*& p, ELEMENT *A) 

這就是說,你可能希望在您使用一個指針,它是一個成員變量,因此考慮使用類你不必一直手動傳遞它。

+0

BuildHeap的調用方不保存任何類型的返回,但堆確實得到修改。這就是我使用指針開始的原因。如果它只有一個副本,那麼當堆不超過容量時堆是如何建立的? – Johnny

+0

@Johnny我不確定我可以按照你的想法,尤其是考慮到你不想顯示你的其他代碼。有些東西對我來說沒有意義,比如「保存任何類型的回報」。而且,你使用指針的原因和你處理它們的方式看起來很奇怪,但是再次看到更多的代碼很難給出更好的建議。 –

+0

我的意思是該函數返回void,但仍然修改堆。在我實現指針之前,我可以訪問堆並對其進行排序的唯一方法是返回一個HEAP對象。現在我想更進一步,並根據需要調整堆的大小,而不返回指針(即修改指針)。我已經能夠像以前一樣通過從main調用函數時返回一個指針來實現這一點,但這並不理想。我認爲問題在於我試圖修改指針本身,而不是指針指向的數據,這是與以前不同的一組情況。謝謝。 – Johnny