返回链表上的多个节点

时间:2012-11-20 04:48:47

标签: c list linked-list

所以我有一个链表实现,结构看起来像这样:

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。有没有一种简单的方法可以做到这一点,还是应该为这些目的创建另一个链表?

1 个答案:

答案 0 :(得分:1)

关于C的最好的事情是它小而简单。关于C最糟糕的事情是它小而简单。

没有“内置”的方式来做你想做的事。

当然,您可以定义整数的链接列表,但是您不得不在不再需要之后处理释放列表,这可能比听起来更难。这样的列表将有100%的指针空间开销。对于大多数应用程序来说不是问题,而是要考虑的事情。

更好的选择是使用您自己的类似矢量的容器,根据需要调整自身大小,“模拟”C ++向量。 This is the basic idea.注意:此代码省略了错误处理。

或者正如另一个建议所说,在一次传递中实现一个计数,准确分配整数的计数数量,然后在第二次传递中累积结果。非常吝啬的记忆,但显然是一个运行时间的惩罚。小清单再次没什么大不了的。

或者您可以采用this nice effort to build a container library for 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提供的记录中。特别是它可以对返回的整数列表执行任何操作。当然,这比返回值更不灵活。