for简单链表的循环c++

for loop for simple linked list c++

本文关键字:c++ 循环 简单链表 for      更新时间:2023-10-16

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

    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;
}

迭代程序版本(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版本(带有Boost的C++03):

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

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

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

这并不是你所说的"全部代码"。您的列表存储哪些元素?看起来每个节点只有一个字符。因此,你似乎是在试图制作一个字符列表,以相反的顺序表示人名。

情况就是这样:

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

字符串是标准模板库的一部分,它提供了一些非常高效和安全的迭代器来处理您可能想要循环的项。

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

string::begin显示了相同的示例。

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

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

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

完成。根本没有手动的for循环或for_each()调用。您甚至可以使用name.begin()+1跳过第一个字符。请参阅列表构造函数。

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

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

string::rebgin()和string::rend()按相反顺序迭代。更简单地说,这是在使用字符串::begin()和字符串::end()分别引入反转之后出现的。

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

我想你正在尝试做:

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

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