2017-08-24 7 views
0

最近、私はいくつかのリンクリストコーディングに関する質問を練習しています。私はunordered_setを使い始めました。問題は、「ソートされていないリンクリストから重複を削除するコードを書く」です。私はこれのためにunordered_setを使用しました。しかし、私はリンクされたリストを初期化しようとすると "コアダンプ"の問題​​を抱えています。"CodePad"(オンラインC++コンパイラ)でリンクリスト操作を実行中にコアがダンプされる

populateListの最後の3行をコメントアウトすると配列が表示されます。 populateListの頭にアクセスしようとすると、コアダンプが表示されます。

これは私が書いたコード全体です。私はコードパッドのウェブサイトでこれを書いています。

#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; 

以下のforループの内容をコメントアウトすると、すべてがスムーズに実行されます。

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

をアンロール場合の不審な不足があります

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; } 

次iteratationでそれを逆参照しようそのコードの 'new' – molbdnilo

+1

'head == NULL'のところで' populateList(head) 'を呼び出し、' head-> data = ...;でこの 'NULL'ポインタを逆参照します。 –

+0

前のコメントの内容を別の言葉:演算子 'new'を使ってリストのノードを割り当てていません。 – Fureeish

答えて

0

問題は、あなたのループの中であなたは次のNULLに設定することで、あなたはこの

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]; 
... 
関連する問題