2013-10-31 33 views
1

我已經創建了兩個名爲nodelist.h和nodelist.cpp的文件,並且基本上它們內部的函數包含基本鏈接列表函數(例如addNode,printNode等)。我已經創造了另一個源文件中使用該類創建像這樣的功能:在C++中調用鏈接列表函數

#include "NodeList.h" 

bool insertR(stringstream &lineStream) 
{ 

    int node1,node2; 
    lineStream>> node1 >> node2; 
    nodelist *n1 = new nodelist; //EDIT: FIXED 
    nodelist *n2 = new nodelist; // EDIT: FIXED 
    n1->addNode(node1); 
    n2->addNode(node2); 
    n1->print(); 
    n2->print(); 
    return true; 
} 

注意這個函數是不是在主,它是由主叫另一個源文件。我nodelist.cpp工作正常,雖然這個程序運行,當我輸入節點值我的程序崩潰。任何幫助?

這裏是我的節點列表文件:

#include <iostream> 

#include "NodeList.h" 

using namespace std; 

nodelist::nodelist(){ 
       head = NULL; 
       current = NULL; 
       temp = NULL; 
} 

void nodelist::addNode(int node_id_){ 
nodePtr n = new Node; 
n->next = NULL; 
n->node_id = node_id_; 
if(head!=NULL) 
{ 
    current = head; 
    while(current->next != NULL) 
    { 
     current = current ->next;      
    } 
    current->next = n;      
} 
else 
{ 
    head = n;  
} 
} 

void nodelist::deleteNode(int del_node){ 
nodePtr delPtr = NULL; 
temp = head; 
current = head; 
while(current!=NULL&&current->node_id!=del_node){ 
    temp = current; 
    current = current->next; 
    } 
if (current == NULL) 
    { 
     cout << del_node<<" does not exist"<<endl; 
     delete delPtr;   
    } 
else 
    { 
     delPtr = current; 
     current = current->next; 
     temp->next= current; 
     delete delPtr; 
     cout << del_node<< " has been deleted"<<endl;  
    } 
    } 


void nodelist::print(){ 
current = head; 
while(current != NULL){ 
    cout << current->node_id<<endl; 
    current = current ->next;  
} 

}

編輯:所以現在它的工作原理,當我創建類型節點列表的一個新的對象,然而,當我在值傳遞的節點1和節點我得到一個不對應任何一個節點的連續循環。但是,這工作,如果我在main()中這樣做。

回答

2

聲明指針是不夠的,你需要使用new運算符來實例化它們指向的nodelists。

n1和n2不指向任何東西這就是爲什麼它崩潰

nodelist *n1; 
nodelist *n2; 
n1->addNode(node1); 
n2->addNode(node2); 
+0

但在我的節點列表文件中,我的addNode函數創建了新節點。 – Andy

+1

不,您需要創建節點列表。只要您嘗試調用n1-> addNode,它就會崩潰,因爲n1指向無。 – NapoleonBlownapart

2
nodelist *n1; // unintialized pointer 
nodelist *n2; // another uninitialized pointer 
n1->addNode(node1); // you try to use an uninitialized pointer 
n2->addNode(node2); // same here 
n1->print(); // and here 
n2->print(); // and here! 

沒有看到你是如何的鏈表類中聲明/實現,也很難給你一個潛在的解決方案解決您的整體問題。但是,崩潰是由於您嘗試訪問隨機存儲器塊並將它們視爲nodelist對象(例如未定義的行爲)而引起的。

+0

我編輯了我的問題!並感謝,但現在我有一個新的錯誤:( – Andy

+0

現在你有幾個內存泄漏,你似乎違反了關注點分離的原則。你應該從列表構造分離列表構造。 –