遍历链表的列表



我对c++有点陌生,对这个指针之类的东西很头疼!

我需要遍历链表结构的列表,读取结构的数据并弹出该条目!

这是我的结构:

struct node {
    map<string,double> candidates;
    double pathCost;
    string source;
    node *next;             // the reference to the next node
};

通过阅读这篇文章,我创建了我的列表,如:

list<node*> nodeKeeper;

然后初始化第一个值:

    node *head;
    head= new node;
    head->pathCost = 0.0;
    head->source="head";
    head->next = NULL; 

精简填充列表和结构:

for(unsigned int i = 0; i < sourceSentence.size(); i++){
    node *newNode= new node;             //create a temporary node

    //DO STUFF HERE

    //push currunt node to stack
    nodeKeeper.push_back(newNode);
    head = newNode;
}

现在我有了结构的列表,我想遍历它并弹出元素:

for (list<node*>::const_iterator it=nodeKeeper.begin();it!=nodeKeeper.end();it++){
    it->pop_front();
}

这给了我这个错误:

错误:请求'中的成员'pop_front'*it.std::_List_const_iterator&lt_Tp>::operator->()',属于指针类型'node*const'(可能您打算使用'->'?)make:***[main3.o]错误1

看起来我的迭代器指向的是列表内部,而不是列表本身!

你能告诉我这里出了什么问题吗?!

如果您的目标是拥有节点结构的单个列表,那么就不需要自己管理下一个指针。插入将保持不变(减去head =行)

要弹出列表的所有元素,您可以执行类似的操作

int sizeOfList = nodeKeeper.size();
for( int i =0; i < sizeOfList; i++) {
    //if you want to do something with the last element
    node * temp = nodeKeeper.back();
    //do stuff with that node
    //done with the node free the memory
    delete temp;
    nodeKeeper.pop_back();
}

此处编译/运行示例:http://ideone.com/p6UlyN

如果只需要删除元素,请使用std::list::clear:

nodeKeeper.clear();

要读取元素的内容,然后删除,请尝试以下操作:

for (std::list<node*>::const_iterator it = nodeKeeper.begin(); it != nodeKeeper.end(); ++it) {
    std::cout << (*it)->source;
    // do more reading
    nodeKeeper.pop_front();
}

或使用C++11:

for (const auto& a : nodeKeeper) {
    std::cout << a->source;
    nodeKeeper.pop_front();
}

相关内容

  • 没有找到相关文章

最新更新