2013-02-02 38 views
-1

我正在嘗試爲項目創建鏈接列表。我有這兩個文件(一個.h和一個.cpp)。我不知道如何製作複製構造函數,所以我不確定這與它有什麼關係。我想如果有人想讓我指出正確的方向,那也是有幫助的。謝謝。嘗試創建鏈接列表時頭部未定義

#include <iostream> 
#include "studentList.h" 

using namespace std; 

// Default Constructor for StudentList 
// Creates Dummy Head Node for a new empty list 
StudentList::StudentList() 
{ 
// Create the dummy head node 
Node* Head;    // Creates Head Node 
Head = new Node;   
Head->next = NULL;  // Sets pointer to NULL by default 
} 

//Copy Constructor 
StudentList::StudentList(const StudentList& list) 
{ 

} 

void StudentList::addStudentList(Student newStudent) 
{ 

在這裏得到錯誤!!!!!!

if (Head->next == NULL) 
{ 
    Head->next->student = newStudent; 
    Head->next->prev = Head; 
    Head->next->next = NULL; 
} 
} 

這裏是h文件

#include <iostream> 
#include "Student.h" 

using namespace std; 


class StudentList{ 

public: 
//Default Constructor 
StudentList(); 
//Copy Constructor 
StudentList(const StudentList& list); 
//Add Student Method 
void addStudentList(Student); 


private: 
// Node struct to hold Student data and with pointers to a previous and next node in linked list 
struct Node { 
Student student; 
Node* prev; 
Node* next; 
}; 

}; 

回答

3

Head應該是一個構件。您創建的指針Head具有自動存儲。它在構造函數完成時超出了範圍,並且您得到一個懸而未決的引用。

class StudentList{ 

public: 
//Default Constructor 
    StudentList(); 
//Copy Constructor 
    StudentList(const StudentList& list); 
//Add Student Method 
    void addStudentList(Student); 


private: 
// Node struct to hold Student data and with pointers to a previous and next node in linked list 
    struct Node { 
    Student student; 
    Node* prev; 
    Node* next; 
    }; 

    Node* Head; 

}; 


StudentList::StudentList() 
{ 
    Head = new Node;   
    Head->next = NULL;  // Sets pointer to NULL by default 
} 

在附註中,您應該縮進放在大括號之間的代碼。它使得人類讀者更容易將相關元素分組在一起,從而找到代碼塊。

至於副本c'tor,正如你所看到的,它需要對現有對象的引用,並構造一個新的對象。編譯器提供的defaulut copy c'tor執行淺拷貝。含義是ab是列表,而不是a.Headb.Head指向相同的起始元素。您可以overrride它做了深刻的副本是這樣的:

StudentList::StudentList(const StudentList& list) 
{ 
    Node* Head = new Node; 
    Node* tmp = Head; 
    Node* iter = list.Head; 
    while (iter) 
    { 
    *tmp = *iter; 
    tmp->next = NULL; 
    if (iter->next) 
     tmp->next = new Node; 
    tmp = tmp->next; 
    iter = iter->next; 
    } 
} 

我當然忽視tmp->prev但是這是一個signly鏈表的總體思路。

+0

我很欣賞你的反應。它幫助了很多。我最初做了縮進,但是在這裏發帖時,我想這並沒有轉移。 – cadavid4j

+0

此外,如果你有任何想法,我可以瞭解複製構造函數,以及如何構建一個鏈接列表,將不勝感激。 – cadavid4j

+0

@ cadavid4j,看我的編輯。 – StoryTeller

1

此這裏

StudentList::StudentList() 
{ 
// Create the dummy head node 
Node* Head;    // Creates Head Node 
Head = new Node;   
Head->next = NULL;  // Sets pointer to NULL by default 
} 

正在在該構造函數停止的構造與後StudentList存在的局部變量。你需要遷出Head,使之成爲一類成員,即在頭文件中聲明它

class StudentList { 
.. 
Node* Head; 
}; 

所以你的構造函數,而不是看起來像

StudentList::StudentList() 
{ 
// Create the dummy head node 
Head = new Node;   
Head->next = NULL;  // Sets pointer to NULL by default 
} 
+0

非常感謝您的解釋。你有什麼想法他們複製構造函數應該看起來像。我不是要求代碼,但也許我可以看看如何做一個代碼。 – cadavid4j

+0

在這種情況下複製構造函數有點棘手,因爲您正在處理原始指針,所以您需要克隆節點而不是複製它。 –

相關問題