遍历链表列表

时间:2013-02-18 23:33:55

标签: c++ struct linked-list

我对c ++很陌生,对这个指针和东西感到头痛!

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

这是我的结构:

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

通过阅读this帖子,我创建了我的列表:

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&gt; :: operator-&gt;()',这是   指针类型'node * const'(也许你打算使用' - &gt;'?)make:***   [main3.o]错误1

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

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

2 个答案:

答案 0 :(得分:2)

如果您只需删除元素,请使用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();
}

答案 1 :(得分:2)

如果您的目标是拥有一个节点结构列表,则无需管理自己的下一个指针。插入将保持不变(减去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