0

I am getting a access violation error in my code when I try run it. The program is a priority queue that inserts a value and prints the heap after each insertion and min extract.

Header File:

#pragma once
/*
Header file for the priority queue class
*/
#ifndef PRIORITYQUEUE_H
#define PRIORITYQUEUE_H

class priorityQueue
{
private:
    int size;
    int *data;

public:
    static const int CAPACITY = 50;
    priorityQueue();//constructor
    ~priorityQueue();//destructor
    int getParent(int index);
    int getLeftChild(int index);
    int getRightChild(int index);
    void swap(int &, int &);
    void insert(int item); //enqueue - heap_insert
    void printArray(int []);
    void heapify(int index);

    //remove and return the smallest item currently in the priority queue
    int extractMin();//dequeue 
    bool empty() const;
    int min() const; //return the smallest item
};
#endif

Main Code:

#include <iostream>
#include "priorityQueue.h"
using namespace std;




int main()
{
    priorityQueue myqueue; //class object

    if (myqueue.empty())
        cout << "My priority Queue is empty\n" << endl; //prompt

    myqueue.insert(59); //Insert value into queue
    cout << "After inserting 59 Priority Queue has" << endl;

    myqueue.insert(41);
    cout << "After inserting 41 Priority Queue has" << endl;

    myqueue.insert(25);
    cout << "After inserting 25 Priority Queue has" << endl;

    myqueue.insert(12);
    cout << "After inserting 12 Priority Queue has" << endl;

    myqueue.insert(91);
    cout << "After inserting 91 Priority Queue has" << endl;

    myqueue.min();
    myqueue.extractMin();
    cout << "After extracting the minimum value Priority Queue has" << endl;


    myqueue.insert(34);
    cout << "After inserting 34 Priority Queue has" << endl;

    myqueue.insert(63);
    cout << "After inserting 63 Priority Queue has" << endl;

    myqueue.extractMin();
    cout << "After extracting the minimum value Priority Queue has" << endl;

    myqueue.insert(75);
    cout << "After inserting 75 Priority Queue has" << endl;

    myqueue.insert(85);
    cout << "After inserting 85 Priority Queue has" << endl;

    myqueue.extractMin();
    cout << "After extracting the minimum value Priority Queue has" << endl;




    cout <<"Minimum value is " ; 
    cout << myqueue.min() <<endl; //prints out heap min

    system("pause");
    return 0;
}
priorityQueue::priorityQueue() //constructor
{
    size = CAPACITY;
    &data[size];
}

priorityQueue::~priorityQueue() //destructor
{

}

int priorityQueue::getParent(int index) //finds parent
{
    return (index - 1) / 2;
}

int priorityQueue::getLeftChild(int index) //finds left child
{
    return (2 * index) + 1;
}

int priorityQueue::getRightChild(int index) //find right child
{
    return (2 * index) + 2;
}

void priorityQueue::swap(int& item1, int& item2) //swaps value of two variables
{

    int temp = item1;
    item1 = item2;
    item2 = temp;
}

void priorityQueue::heapify(int index) //heapifies the heap
{
    int largest = index;
    int l = getLeftChild(index);
    int r = getRightChild(index);

    if (l < size && data[l] > data[index])
    {
        largest = l;
    }

    if (r < size && data[r] > data[largest])
    {
        largest = r;
    }

    if (largest != index)
    {
        swap(data[index], data[largest]);
        heapify(data[size]);
    }


}

void priorityQueue::printArray(int []) //prints array
{
    for (int i = 0; i < CAPACITY; i++)
    {
        cout << data[i] << ", ";
    }
}

int priorityQueue::extractMin() //finds min and removes it
{
    int min = data[0];
    data[0] = data[size - 1];
    size - 1;
    heapify(data[size]);
    return min;
}

int priorityQueue::min() const // finds min
{
    return data[0];
}

bool priorityQueue::empty() const // checks if heap is empty
{
    if (data == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void priorityQueue::insert(int Item) //inserts values into heap
{
    size += 1;
    int i = size - 1;
    while (i > 0 && data[getParent(i)] < Item)
    {
        data[i] = data[getParent(i)];
        i = getParent(i);
    }
    data[i] = Item;
}
1
  • What did you believe "&data[size]" did, I'm just curious. Commented Apr 22, 2016 at 1:30

1 Answer 1

1

In your constructor, &data[size]; does nothing. You need to allocate some memory for it, possibly using new - data = new int[size] - or use a smart pointer.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.