2017-08-24 4 views
0

Récemment, j'ai pratiqué quelques questions de codage de listes chaînées. Je viens de commencer à utiliser unordered_set. La question est, "Écrire du code pour supprimer les doublons d'une liste chaînée non triée". J'ai utilisé unordered_set pour cela. Mais j'ai le problème de "coredump" quand j'essaye d'initialiser la liste liée.Core jeté lors de l'exécution d'une opération de liste chaînée dans "CodePad" (qui est un compilateur C++ en ligne)

Il affiche le tableau lorsque je commente les 3 dernières lignes de populateList. Il affiche core core quand je tente d'accéder à la tête dans populateList.

C'est l'intégralité du code que j'ai écrit. J'ai écrit ceci dans le site Web de codepad.

#include <iostream> 
#include<vector> 
#include<string.h> 
#include<math.h> 
#include<sstream> 
#include<string> 
#include<stdio.h> 
#include<algorithm> 

#include<unordered_set> 
using namespace std; 

struct Node 
{ 
    int data; 
    Node *next; 
}; 
Node *head=NULL; 
void populateList(Node *head) 
{ 
    int arr[]={7,1,2,3,4,5,4,3,5,7,3,9,3,7,3,6,2,5,7,4}; 
    cout<<"\n\n"; 
    int n=sizeof(arr)/sizeof(int); 
    for(int i=0;i<n;i++) 
    { 
     cout<<arr[i]<<" "; 
    } 
    Node *ptr=head; 

Si je commente le contenu de la boucle for ci-dessous, tout se passe bien.

for(int i=0;i<n;i++) 
    { 
     ptr->data=arr[i]; 
     ptr->next=NULL; 
     ptr=ptr->next; 
    } 
} 
int main() 
{ 
    Node *ptr=head, *prev=head; 
    populateList(head); 
    unordered_set<int> A; 
    while(ptr!=NULL) 
    { 
     cout<<ptr->data<<" "; 
    } 
    while(ptr!=NULL) 
    { 
     if(A.find(ptr->data)==A.end()) 
     { 
      A.insert(ptr->data); 
     } 
     else 
     { 
      prev->next=ptr->next;  
      delete ptr; 
      ptr=prev->next; 
     } 
     prev=ptr; 
     ptr=ptr->next; 
    } 
    ptr=head; 
    cout<<"\n\n"; 
    while(ptr!=NULL) 
    { 
     cout<<ptr->data<<" "; 
    } 
    return 0; 
} 
+1

Il y a un manque suspect de 'nouveau' dans ce code. – molbdnilo

+1

Vous appelez 'populateList (head)' où 'head == NULL', alors allez-y et déréférencer ce pointeur' NULL' avec 'head-> data = ...;' –

+0

Mettre le contenu des commentaires précédents en d'autres mots : vous n'allouez pas les noeuds de liste en utilisant l'opérateur 'new'. – Fureeish

Répondre

0

Le problème est que dans votre boucle que vous définissez à côté de NULL puis essayer de déréférencer sur la prochaine iteratation

for(int i=0;i<n;i++) 
{ 
    ptr->data=arr[i]; 
    ptr->next=NULL; // now ptr->next is NULL 
    ptr=ptr->next; // ptr = ptr->next = NULL; 
} 

si vous déroulez cette

int i = 0; 
ptr->data=arr[0]; 
ptr->next=NULL; 
ptr=ptr->next; // ptr = ptr->next = NULL; 
i++; 
// because we set ptr to NULL this is dereferencing the NULL pointer 
ptr->data=array[1]; 
...