2015-12-07 33 views
0

我有一個涉及不同鏈表操作的任務。其中之一涉及重載方括號運算符以便能夠打印鏈表的第i個元素。我做了所有其他事情,但我真的迷失了。這是我正在與之合作。 List類如下:C++重載[]打印第n個鏈表的列表

class List { 
public: 
// Creates a default empty list 
List(); 

// Simple destructor 
~List(); 

// Insert "data" at the very end of the list 
void AddToFront(int data); 

// Remove and return the first data item from the list. 
int deleteFront(); 

// Prints the list 
void Print() ; 

// Returns the size of the list 
unsigned int Size() const; 


//overloaded assignment operator 
Node operator[](unsigned int i) ; 



private: 

Node *m_head; 

}; 

而且,這裏是我的節點類:

class Node { 
public: 
    Node(); 
    ~Node(); 
    Node(int data); 

    int m_data; 
    Node *m_next; 
}; 

在重載[]運算符任何幫助將不勝感激。

+0

你會如何編寫一個正常的函數來返回第i個節點? – immibis

回答

2
Node* operator [] (int value) { 
    Node *temp = this->m_head; 
    for(int i = 0; i < value && temp!=NULL; i++) { 
     temp = temp->m_next; 
    } 
    return temp; 
} 

我認爲你要得到相應指定的value節點,在方括號內。您使用關鍵字operator以及運算符後超載任何運算符,然後傳遞參數。

欲瞭解更多信息請檢查該:: Operator overloading

編輯::

正如指出的erip和拉約什應該有一個辦法,萬一(value > size_of_list),在這種情況下,一個可能的解決辦法拋出一個例外,你可以稍後在你的程序中看到value出界。或者考慮到目前的實施,如果value > size_of_list在這種情況下temp將變成NULL,所以在執行期間可以檢查返回的Node *的值是否爲NULL

進一步的更優化的方法是保持一個變量size_of_list在類List,然後我們可以簡單地添加一個if條件的功能這樣的:

if(value >= size_of_list) // equal to sign is put, considering your `size_of_list` starts from 1 
    return NULL; 

這將更加優化在大列表的情況下,這將避免浪費執行for循環!

+0

爲第i個'Node'返回'm_data'會更有意義,但是這並沒有太大的改變。很好的答案。 – erip

+0

除了'temp!= NULL'之外,你應該做些別的事情。例如,'if(size_of_list erip

+0

@erip真的,但我不認爲OP想在list類中保留一個額外的變量,而且我打算檢查我返回,如果我從函數返回'NULL'意味着'size_of_list user007