2017-03-20 1 views
-2

Je suis en train de résoudre ce problème: https://www.hackerearth.com/practice/data-structures/trees/binary-and-nary-trees/practice-problems/algorithm/comrades-ii-6/pointeur invalide C de

Je suis sûr que l'algorithme est bon, mais je reçois des erreurs de pointeur non valide dans les mémoires. J'ai essayé de trouver l'erreur, mais sans fin. Voici le code:

#include <iostream> 
#include <vector> 
using namespace std; 

struct node{ 
    int value; 
    vector<struct node*> children; 
}; 

void handshakes(int n, struct node *node, long long int &hs, long long int &fb, int height){ 
    if((int)node->children.size() == 0){ 
     hs += height-1; 
     fb += n - height; 
    } 
    else{ 
     for(int i = 0; i < (int)node->children.size(); i++){ 
      handshakes(n, node->children[i], hs, fb, height+1); 
     } 
    } 
} 

int main() 
{ 
    int T; 
    cin >> T; 

     for(int t = 0; t < T; t++){ 
     int n; 
     cin >> n; 

     vector<struct node*> army; 
     army.resize(0); 
     for(int i = 0; i < n+1; i++){ 
      struct node *temp = (node *)malloc(sizeof(node)); 
      temp->value = i; 
      temp->children.resize(0); 
      army.push_back(temp); 
     } 

     int a; 
     for(int i = 0; i < n; i++){ 
      cin >> a; 

      for(int j = 0; j < (int)army.size(); j++){ 
       if(army[j]->value == i+1){ 
        army[a]->children.push_back(army[j]); 
        break; 
       } 
      } 
     } 
     long long int hs = 0; 
     long long int fb = 0; 
     handshakes(n, army[0], hs, fb, 0); 
     cout << hs << " " << fb/2 << endl; 
    } 

    return 0; 
} 

Je serais très reconnaissant si quelqu'un pouvait me aider. Je suis un peu frustré.

EDIT: L'erreur semble se produire lorsque n est grand.

+2

qu'est-ce qu'une «erreur de pointeur invalide»? – pm100

+2

Mon conseil est de développer ceci sur un système avec un IDE et d'utiliser votre débogueur. – drescherjm

+1

Quel est le point de 'resize (0)' juste après avoir créé un vecteur ?! – Arash

Répondre

2
for(int i = 0; i < n+1; i++){ 
    struct node *temp = (node *)malloc(sizeof(node)); 
    temp->value = i; 
    temp->children.resize(0); 

Vous ne construit temp->children donc vous avez pas d'objet sur lequel vector appeler resize. La solution évidente consiste à remplacer malloc par new.

+0

Merci beaucoup, le problème est corrigé. – ghostspeed

+0

J'apprends le C++ par moi-même et je suppose que j'ai besoin de lire des trucs plus formels et rigoureux. Aucune suggestion? – ghostspeed

+1

C'est difficile à dire sans savoir ce que vous savez déjà. Mais certainement pas la peine d'apprendre pré-C++ 11. Apprenez des choses comme 'unique_ptr' et apprenez RAII. –