2017-08-24 53 views
0

最近,我一直在練習一些鏈接列表編碼問題。我剛開始使用unordered_set。問題是,「編寫代碼以從未排序的鏈接列表中刪除重複項」。我爲此使用了unordered_set。但是當我嘗試初始化鏈表時,我遇到了「coredump」的問題。在「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

有一個可疑的缺乏該代碼中的「新」。 – molbdnilo

+1

你可以調用'populateList(head)',其中'head == NULL',然後繼續前進,並用'head-> data = ...'取消引用這個'NULL'指針;' –

+0

將以前的註釋內容放入其他字:你沒有使用operator new來分配列表的節點。 – Fureeish

回答

0

的問題是,在你的for循環設置旁邊null,則試圖取消對它的引用上下一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; 
} 

如果你解開這個

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]; 
... 
相關問題