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++ 矢量。 这是基本思想。注意:此代码省略了错误处理。

或者正如另一个建议所说,在一次通过中实施计数,准确分配计数的整数数量,然后在第二次通过累积结果。非常吝啬内存,但显然是运行时间损失。对于小列表来说也没什么大不了的。

或者,您可以采用这项出色的工作来为 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 回答