Как мне изменить, куда указывает указатель, передавая его по ссылке?

Я пытаюсь изменить размер объекта кучи, чтобы программа могла продолжить работу, если пользователь пытается построить кучу, которая превышает емкость кучи. Я могу вернуть указатель, который указывает на новую кучу, но это не очень хорошо работает с другими частями моей программы. Я хотел бы напрямую изменить, где мой указатель 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);

0

Решение

Я думаю, что ваша проблема в том, что вы используете ссылку на указатель только в одном месте, но не в других. Посмотрите на подпись BuildHeap:

void BuildHeap(HEAP* p, ELEMENT *A)

Здесь, когда вы звоните BuildHeapкопия указателя, переданного в качестве первого аргумента p сделан. Ваш последующий звонок Resize изменяет эту копию, но вызывающий BuildHeap все еще имеет свой собственный, неизмененный указатель. Вы можете изменить подпись BuildHeap (и, возможно, другие методы) также использовать ссылки:

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

Тем не менее, вы можете рассмотреть возможность использования класса, в котором вы используете указатель, который является переменной-членом, поэтому вам не нужно все время передавать его вручную.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]