2011-09-04 93 views
0

試圖編寫LinkedList的構造函數以用整數數組初始化。LinkedList的構造函數接收數組C++

該程序將調用鏈接(數組);它會將數組中的所有值添加到鏈表中。

LinkedList::LinkedList(int array[]) 
{ 
    headPtr->setData(array[0]); //setData method stores the integer at position 0 inside headPtr 

    Node *currentPtr = headPtr; 

    for (int i = 0; i < array.length(); ++i) //for loop to add the integers to the next node 
    { 
     currentPtr->setNext(new Node(array[i])); //creates a new node with the integer value of array position i 
    } 
} 

麻煩的是(從Java未來)的array.length,我不認爲數組的長度,可以通過這種方式獲得?

+6

回覆: 「從Java來了」 - ** **停止拿起一個[不錯的入門C++的書(http://stackoverflow.com/questions/388242/the-definitive-c-book-。指導和列表)並通讀它來學習適當的現代C++。 C++不是Java。用C++編程時,用Java來思考只會給你帶來噩夢。 –

+2

你不能得到一個C數組的長度(除非它被某個東西終止,就像一個C字符串一樣)。例如,你可以從'std :: vector '得到它。 – 2011-09-04 11:15:50

+0

@WTP:您可以獲得C-Array的長度。但是,如果數組已經衰減爲指針,則無法獲得長度。 OP正面臨着後一種情況。 – Nawaz

回答

0

像其他人說,它不僅是重要的,但重要你得到一個很好的入門C++的書,從正面看它向後,同時試圖忘記自己懂Java什麼,而在C++模式。它們不是很相似。

我們您的問題,可以通過使用std::vector並利用其size方法來解決:

// put this with the other includes for your file 
#include <vector> 

LinkedList::LinkedList(const std::vector<int>& array) 
{ 
    headPtr->setData(array[0]); //setData method stores the integer at position 0 inside headPtr 

    Node *currentPtr = headPtr; 

    for (int i = 0; i < array.size(); ++i) //for loop to add the integers to the next node 
    { 
     currentPtr->setNext(new Node(array[i])); //creates a new node with the integer value of array position i 
    } 
} 

如果你不想使用vector,你在數組的大小來傳遞功能:

LinkedList::LinkedList(int array[], int arrlen) 
{ 
    headPtr->setData(array[0]); //setData method stores the integer at position 0 inside headPtr 

    Node *currentPtr = headPtr; 

    for (int i = 0; i < arrlen; ++i) //for loop to add the integers to the next node 
    { 
     currentPtr->setNext(new Node(array[i])); //creates a new node with the integer value of array position i 
    } 
} 

但是推薦使用vector版本。

+0

非常感謝,我現在正在閱讀一本書,這是我正在嘗試的教程練習,他們的示例有點不同,可能需要得到幾本不同的書:P 我似乎已經添加了你的建議與矢量好,但我得到了一個警告:有符號和無符號整數表達式之間的比較。 不太確定這是什麼意思與簽名和無符號... – Cheeseman

+0

@ Cheeseman這意味着你正在比較一個數字,可以_can_是否定的數字,不能否定。 _cannot_爲負的數字可以保持較高的正值,因爲它不會浪費爲負值保留的空間。這意味着當達到一定的大小時,向_unsigned_值加1會得到下一個更高的值,其中向_signed_值加1是未定義的行爲。 'vector :: size'返回一個'unsigned int'。爲了解決這個錯誤,把'for(int i = 0; i

+0

啊,這是有道理的,謝謝Seth :)所以要調用它,LinkedList list2(arr);應該沒事? – Cheeseman

3

我會建議你使用迭代成語,並構造一個模板構造函數爲:

class LinkedList 
{ 
    //... 
    public: 
    template<typename FwdIterator> 
    LinkedList(FwdIterator begin, FwdIterator end) 
    { 
     for (;begin != end; ++begin) 
     { 
      //treat begin as pointer, and *begin as dereferenced object 
     } 
    } 
    //... 
}; 

然後你可以使用它作爲:

int arr[] = {1,2,3,4,5,6,7,8,9,10}; 

LinkedList lnklist(arr, arr+10); 

不僅如此。如果你已經std::vector<int>,那麼你也可以用它來構建鏈表,如:

std::vector<int> v; 
//.. 
LinkedList lnklist(v.begin(), v.end()); 

因此,使用迭代成語給你這麼多的功能和靈活性。 :-)

1

由於Nawaz解釋,與迭代器解決方案更好。但是,如果你想使用數組(儘管是靜態的),那麼編譯器可以自動爲你推導出大小。

template<size_t size> 
LinkedList::LinkedList(int (&array)[size]) 
{ 
    headPtr->setData(array[0]); //setData method stores the integer at position 0 inside headPtr 

    Node *currentPtr = headPtr; 

    for (int i = 0; i < size++i) //for loop to add the integers to the next node 
    { 
     currentPtr->setNext(new Node(array[i])); //creates a new node with the integer value of array position i 
    } 
} 

可以如下所示調用。

int arr[] = {1,2,3,4,5,6,7,8,9,10}; 

LinkedList lnklist(arr);