1

配列のセットがあり、各配列 ( data[]) が二重リンク リスト ノードに格納されていますArrayNode。配列内の特定のインデックスから開始し、別の配列内の別のインデックスまで反復処理します (それらは同じ配列である可能性があります)。2 つのノードがリンクされており、最初のノードが 2 番目のノードの「左側」にあることは確かです。

struct ArrayNode
{
 ArrayNode* prev;
 ArrayNode* next;

 int data[16];
 unsigned int count;
};



void iterate(ArrayNode* startnode, unsigned int startposition, ArrayNode* endnode, unsigned int endposition)
{
 for (unsigned int index = startposition; index < startnode->count; ++index)
 {
  std::cout << startnode->data[index] << "\n"; //I'd do some processing here
 }

 for (ArrayNode* node = startnode->next; node != endnode; node = node->next)
 {
  for (unsigned int index = 0; index < node->count; ++index)
  {
   std::cout << node->data[index] << "\n"; //I'd do some processing here
  }
 }

 for (unsigned int index = 0; index < endposition; ++index)
 {
  std::cout << endnode->data[index] << "\n"; //I'd do some processing here
 }
}

上記のコードにはいくつかの点で欠陥があります。まず第一に、 の場合startnode == endnode、間違った出力が得られます。第 2 に、3 つのループを持つことは、メンテナンスとコード サイズの点で非効率的です。中央のネストされたループですべてのケースをエレガントに処理できるように思われますが、方法がわかりません。それは...ですか?そうでない場合、これはどのように行う必要がありますか?

可能であれば、このためのイテレータ オブジェクトを作成することは避けたいと思います。

4

3 に答える 3

1

これは機能するはずです:

void iterate(ArrayNode* startnode, unsigned int startposition, ArrayNode* endnode, unsigned int endposition)
{
  ArrayNode* node = startnode;
  unisgned int pos = startposition;
  while (!(node == endnode && pos == endposition)) {
    process(node->data[pos]);
    ++pos;
    if (pos == node->count) {
      pos = 0;
      node = node->next;
    }
  }
}
于 2013-01-11T15:30:27.793 に答える
1

このようなものはあなたのニーズに合いますか?

ArrayNode* curnode = startnode;
unsigned int curposition = startposition;
while ((curnode != endnode) || (curposition != endposition)) {
        std::cout << curnode->data[curposition] << std::endl;
        if (++curposition == curnode->count) {
                curnode = curnode->next;
                curposition = 0;
        }
}

エラー チェックがないことに注意してください。これは、読者の課題として残されています。

于 2013-01-11T15:30:04.600 に答える
0

これはあなたが望むことをすると思いますが、それほど明確ではなく、はるかに短く、より速く、または維持しやすいとは言えません。私だったら、元の投稿にあるコードを使用して、明確にコメントします。

void iterate(ArrayNode* startnode, unsigned int startposition, ArrayNode* endnode, unsigned int endposition)
{
    int startindex = startposition;
    for (ArrayNode* node = startnode; node != NULL; node = node->next)
    {
        int endindex = ( node == endnode ) ? endposition : node->count;
        for (unsigned int index = startindex; index < endindex; ++index)
        {
            std::cout << node->data[index] << "\n"; //I'd do some processing here
        }
        startindex = 0;
        if ( node == endnode ) 
            break;
    }
}
于 2013-01-11T15:29:38.050 に答える