for循环用于简单链表c ++

时间:2012-09-11 22:50:14

标签: c++

我正在尝试为这部分做一个循环:

    insert_front(&list,name[0]);
    insert_front(&list,name[1]);                 
    insert_front(&list,name[2]);

但是,我无法弄清楚哪个应该用作限制器,它应该停止循环以及它将如何更改名称[]周长。

以下是整个代码:

#include "list.h"
#include "string"
using namespace std;
int main(){
    cout<<"What is your name \n";
    string name;
    getline(cin,name);

    Node *list;

    list = new_list();                          
    insert_front(&list,name[0]);
    insert_front(&list,name[1]);                  
    insert_front(&list,name[2]);
    }                          
    print_list(list);                                      
    delete_list(&list);
        print_list(list);
        return 0;

}

4 个答案:

答案 0 :(得分:6)

Iterator版本(C ++ 03):

for (std::string::iterator iter = name.begin(); iter != name.end(); ++iter)
    insert_front(&list, *iter);

Foreach版本(C ++ 11):

for ( char c : name)
    insert_front(&list, c);

索引版本(C ++ 03):

for (size_t i = 0; i < name.size(); ++i)
    insert_front(&list, name[i]);

Foreach版本(C ++ 03 with Boost):

std::for_each(name.begin(), name.end(), boost::bind(insert_front, &list, _1));

我对C ++ 11 foreach版本不太确定。

如果您的手动编码列表包含迭代器,那么使用std :: copy或std :: transform可能还有一种合理的方法。

答案 1 :(得分:1)

正如你所说,这并不是真正的“整个代码”。您的列表存储了哪些元素?看起来是每个节点的单个字符。因此,您似乎正在尝试制作一个字符列表,以相反的顺序表示该人的姓名。

情况就是这样:

for( size_t i = 0; i < name.length(); i++ ) {
    insert_front(&list,name[i]);
}

答案 2 :(得分:1)

标准模板库(字符串是其中的一部分)提供了一些非常有效且安全的迭代器,用于处理您可能想要循环的项目。

for(string::iterator iter = name.begin(); iter < name.end(); iter++) {
    insert_front(&list, *iter);
}

string::begin显示了同样的例子。

string :: begin()返回一个对象,该对象在使用operator *解除引用时给出其所在的值。 operator ++()递增到下一个位置。 string :: end()在字符串结尾之后给出另一个对象,以便在operator ++()停止循环之后运算符==()。

现在,这里的重要部分是你没有使用索引。许多STL容器允许您使用迭代器复制值。您甚至可以跳过for循环以使用stl列表并执行以下操作:

std::list list (name.begin(), name.end());

完成。没有手动循环或for_each()调用。您甚至可以使用name.begin()+ 1来跳过第一个字符。请参阅list constructor

正如评论中所指出的,要实现insert_front()反转效果,这应该是:

std::list list (name.rbegin(), name.rend());

string :: rebgin()和string :: rend()以相反的顺序迭代。更简单一点,这是在使用string :: begin()和string :: end()分别引入反转之后。

显然,您使用的是不同的列表,需要一些循环才能继续使用它。但是,您可能只是决定将字符串保留为字符串并将相关的迭代器传递给打印函数,并避免使用列表。这可能允许您使代码通用到足以不关心它是来自字符串还是列表。

答案 3 :(得分:0)

我认为你正在尝试:

for(int i=0; i<name.size(); i++)
{
      insert_front(&list,name[i]);
}

这将在列表中存储名称的每个字符。