0

したがって、リンクされたリストの実装があり、構造体は次のようになります。

typedef struct channel_db{

    unsigned int channel_id;                //Channel ID
    unsigned int node_id;                   //Node ID
    unsigned int channel_size;              //Channel data size (bytes)
    unsigned int channel_period;            //Channel data period (ms)
    double actual_bw;
    double required_bw;
    unsigned int compression;


    struct channel_db *next;
    struct channel_db *previous;

}CHANNEL_DB;

コードのある時点で、特定の要件を満たすリスト内のすべてのノードを検索する必要があります。たとえば、actual_bw が特定のしきい値を超え、その要件を満たすすべての channel_id を返す必要があります。これを行う簡単な方法はありますか、またはこれらの目的のためだけに別のリンクされたリストを作成する必要がありますか?

4

1 に答える 1

1

C の最も優れた点は、小さくて単純なことです。C の最悪の点は、小さくて単純なことです。

あなたが望むことをするための「組み込み」の方法はありません。

確かに整数の連結リストを定義することはできますが、必要がなくなった後にリストを解放する必要があり、これは想像以上に難しい場合があります。そして、そのようなリストには、ポインター空間の 100% のオーバーヘッドがあります。ほとんどのアプリケーションにとって問題ではありませんが、考慮すべきことがあります。

より良いオプションは、必要に応じてサイズを変更する独自のベクターのようなコンテナーを使用して、C++ ベクターを「シミュレート」することです。 これが基本的な考え方です。注意: このコードはエラー処理を省略しています。

または、別の推奨事項が言ったように、1 つのパスでカウントを実装し、数えられた数の整数を正確に割り当ててから、2 番目のパスで結果を蓄積します。メモリが非常に少ないですが、明らかに実行時間のペナルティです。繰り返しますが、小さなリストでは大したことではありません。

または、C 用のコンテナー ライブラリを構築するために、この優れた取り組みを採用することもできます。

最後に、代わりにコールバック関数を受け入れるマッピング プリミティブを提供することで、リストを返すことを完全に回避できます。

typedef int (*CHANNEL_DB_MAPPED_FUNCTION)(CHANNEL_DB *db, void *env);

int map_onto_channel_db(CHANNEL_DB *db, CHANNEL_DB_MAPPED_FUNCTION *f, void *env)
{
   CHANNEL_DB *p;

   // Assumes null terminated list. Adjust for circular lists if that's what you're using
   for (p = db; p; p = p->next)  {
     int rtn = f(p, env);
     if (rtn != 0) return rtn;
   }
   return 0;
}

この関数は、任意の操作を実行して、voidポインターを介して提供されるレコードに結果を蓄積できますenv。特に、返された整数のリストで行った可能性のあることは何でも行うことができます。もちろん、これは戻り値を持つよりも柔軟性が低くなります。

于 2012-11-20T05:18:38.007 に答える