2015-12-07 32 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