Aditya Hugay
Aditya Hugay

Reputation: 11

Why am I getting this runtime error: member access within null pointer of type 'Solution::node' (solution.cpp)

I was solving a question on leetcode 1409. Queries on a Permutation With Key, but I am getting this runtime error I don't know why. I am unable to debug this error.

Problem Statement:Given the array queries of positive integers between 1 and m, you have to process all queries[i] (from i=0 to i=queries.length-1) according to the following rules:

In the beginning, you have the permutation P=[1,2,3,...,m].
For the current i, find the position of queries[i] in the permutation P (indexing from 0) and then move this at the beginning of the permutation P. Notice that the position of queries[i] in P is the result for queries[i].

Return an array containing the result for the given queries.

My approach: I created a linkedlist to store the integers form 1 to m. Then according to each query, I pass it to a function getpos() which returns the position of that query in the list and then updates it as per the directions given in problem statement. This return value is then added to a result vector which is supposed to be the final answer after all queries are processed.

I have added comments to better understand my code

class Solution {
public:
    struct node {
        int data;
        node* next = NULL;
    };
    node* addnode(node* head, int data) {
        if(head == NULL) {
            head = new node;
            head->data = data;
        }
        else {
            node* temp = head;
            while(temp->next != NULL) { temp = temp->next; }
            temp->data = data;
        }
        return head;
    }
    int getpos(node** head, int data) { //To get position of given query
        int count = 0;
        node* temp = *head;
        node* prev;
        while(temp->data != data) {     //runtime error:member access within null pointer of type 'Solution::node' (solution.cpp); SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:32:21
            prev = temp;
            temp = temp->next;
            count++;
        }
        prev->next = temp->next; //searched node deleted
        temp->next = *head;      //add the searched node to beginning of the list
        *head = temp;            //udapate head
        return count;            //we have position stored in count;
    }
    
    vector<int> processQueries(vector<int>& queries, int m) {
        node* head = NULL;
        for(int i=0;i<m;i++) { head = addnode(head,i+1); }
        int n = queries.size();
        vector<int> result;
        for(int i=0;i<n;i++) { result.push_back(getpos(&head,queries[i])); }
        return result;
    }
};

Please debug and explain the cause of the error. I face many runtime errors which I fail to debug.

Upvotes: 0

Views: 2016

Answers (1)

john
john

Reputation: 87997

Your add_node function is bugged. Just take a deep breath and look at the code. add_node should allocate a node using new every time it is called. Ask yourself how many times and under what circumstances your version allocates a new node?

I'm sure you can see that your code only allocates a new node when head equals NULL, therefore it must be bugged.

Incidentally if you wanted a linked list why didn't you use std::list? You would have avoided the mistake you made.

Upvotes: 1

Related Questions