2015-09-26 40 views
0

我的代碼假設使用和節點數組創建一個單鏈表。用動態數組模擬單鏈表

每個節點都有一個變量項,它保存數據和下一個變量,它保存列表中下一個節點的索引。最後一個節點在其下一個數據字段中有-1來模擬nullptr。頭部保存列表中第一個節點的索引。

由於某種原因,當我創建一個指針指向它,它提供了以下錯誤陣列中某一節點:

error: cannot convert 'Node' to 'Node*' in initialization|

#include "ArrayList.h" 
#include <iostream> 
using namespace std; 

ArrayList::ArrayList(char ch){ 
    array = new Node[Size]; 
    (array[0]).item = ch; 
    (array[0]).next = 1; 

    free = 1; 
    head = 0; 
    } 

int ArrayList::length() const{ 
    if (head == -1) return 0; 
    int counter =0; 
    Node* current = array[head]; // problem occurs here 

while(current->next != -1){ 
    counter++; 
    int index = current->next; 
    current = current[index]; 
} 
    counter++; 
    return counter; 
} 

//////////// ////////

#ifndef ARRAYLIST_H 
#define ARRAYLIST_H 
#include <iostream> 
using namespace std; 



class Node{ 
public: 
    char item; 
    int next; 

    Node(){ 
     next = -1; 
    } 
    Node(char input){ 
     this->item = input; 
     next = -1; 
    } 
}; 

class ArrayList{ 
public: 

    ArrayList(); 
    ArrayList(char ch); 

    Node& operator[](int index); 

    int length() const; 
    char getFirst() const; 
    void print() const; 
private: 
    Node* array; 
    int Size = 5; 
    int head = -1; 
    int free = 0; 
}; 
#endif 

////////////////////////

#include <iostream> 
#include "ArrayList.h" 
using namespace std; 

int main(){ 
    ArrayList list('1'); 
    list.print(); 
    return 0; 
} 

回答

1

current應該是int或size_t,因爲代碼使用索引而不是指針。由於它是一個數組,因此如果要與std :: array類似,則只能使用new來分配一個固定的最大大小。

+0

你的想法給了我正確的方向。你是一個生命保護謝謝 – wazeeer

+1

@wazeeer - 一旦你得到它的工作,你可能想嘗試實現一個只改變下一個索引的自頂向下合併排序。它會將索引返回到排序列表的「頭部」,然後array [head] .next將包含第二個節點的索引,依此類推,直到array []。next == -1。對於使用本地索引數組的列表,array_of_indices [i]指向帶有pow(2,i)節點的列表,它的速度更快,但自上而下的版本是更容易理解。 – rcgldr