Я пытаюсь изменить размер объекта кучи, чтобы программа могла продолжить работу, если пользователь пытается построить кучу, которая превышает емкость кучи. Я могу вернуть указатель, который указывает на новую кучу, но это не очень хорошо работает с другими частями моей программы. Я хотел бы напрямую изменить, где мой указатель 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
:
void BuildHeap(HEAP* p, ELEMENT *A)
Здесь, когда вы звоните BuildHeap
копия указателя, переданного в качестве первого аргумента p
сделан. Ваш последующий звонок Resize
изменяет эту копию, но вызывающий BuildHeap
все еще имеет свой собственный, неизмененный указатель. Вы можете изменить подпись BuildHeap
(и, возможно, другие методы) также использовать ссылки:
void BuildHeap(HEAP*& p, ELEMENT *A)
Тем не менее, вы можете рассмотреть возможность использования класса, в котором вы используете указатель, который является переменной-членом, поэтому вам не нужно все время передавать его вручную.
Других решений пока нет …