如何创建一个向量,使每个框都是链表的头部?

时间:2018-04-15 12:44:28

标签: c++ vector

我的问题是:我可以做什么而不是跟随? 我想创建一个向量,使每个框都是链表的头部,'insert_beg'是一个在list的开头插入元素(x)的函数。我必须初始化由NULL创建的每个框。

struct list
{
    int info;
    list* suivant;
};

void insert_beg(list* &debut,int x){
list* nouveau;
nouveau = new list;
nouveau->info = x;
nouveau->suivant = debut;
debut = nouveau;
}

int main()
{
    int n=5;
    vector<list*> tab;

   for(int i=0;i<n;i++){
       x=n*2;
       tab.puch_back(?);
       insert_beg(tab[i],x);
   }
}

3 个答案:

答案 0 :(得分:0)

如果我已正确理解了这个问题,那么您需要以下内容。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

struct list
{
    int info;
    list* suivant;
};

void insert_beg( list * &head, int info )
{
    head = new list { info, head };
}

int main() 
{
    const int N = 5;
    std::vector<list *> tab;
    tab.reserve( N );

    std::fill_n( std::back_inserter( tab ), N, nullptr ); 

    std::for_each( tab.begin(), tab.end(), 
        [=]( list * &head ){ insert_beg( head, 2 * N ); } );

    std::for_each( tab.begin(), tab.end(),
        []( const list * head ) { std::cout << head->info << ' '; } );

    return 0;
}

程序输出

10 10 10 10 10 

最初,向量中列出的所有指针都应由nullptr初始化。

您只需调用标准算法std::fill_n

即可
std::fill_n( std::back_inserter( tab ), N, nullptr ); 

如果您的编译器不支持文字nullptr,那么您可以通过以下方式重写上述调用

std::fill_n( std::back_inserter( tab ), N, ( list * )0 ); 

答案 1 :(得分:0)

如果你想让insert_beg完成列表的所有初始化工作,你可以(确保insert_beg处理nullptr情况)

fun example3 (list : { foo: int * string } list) =
  case list of
    head as { foo as (i, s) } :: tail => ()

    (* This is valid, too, but `foo` is not a binding. *)
  | head as { foo = (i, s) } :: tail => ()

    (* Here, `f` is bound to the whole tuple value. *)
  | head as { foo = f as (i, s) } :: tail => ()

  | nil => ()

tab是list *的std :: vector,所以你也可以推回列表*

tab.push_back(nullptr);

然后您可以使用operator []访问头部并修改头部信息和suivant:

tab.push_back(new list);

您还可以使用列表类的构造函数在一行中执行上述操作。

tab[i]->info  = x;
tab[i]->suivant = nullptr;

答案 2 :(得分:0)

这是'insert_beg'函数的外观:

void insert_beg(list* &debut,int x){
list* nouveau;
nouveau = new list;
nouveau->info = x;
nouveau->suivant = debut;
debut = nouveau;
}