c - 返回链表上的多个节点

标签 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。有没有一种简单的方法可以做到这一点,或者我应该为此目的创建另一个链接列表?

最佳答案

C 的最大优点是它小而简单。 C 最糟糕的地方是它小而简单。

没有“内置”方法可以完成您想要的操作。

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

更好的选择是使用您自己的类似 vector 的容器,根据需要调整自身大小,“模拟”C++ vector 。 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 提供的记录中。特别是,它可以执行您可能对返回的整数列表执行的任何操作。当然,这不如有返回值灵活。

关于c - 返回链表上的多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466765/

相关文章:

c++ - 声明/定义作为 C 和 C++ 中的语句

c - 如何生成所有不同的数字,这些数字可以通过从每个数字的左端和/或右端消除一个或多个数字来形成

java - 使用指向除下一个节点之外的随机节点的指针复制 LinkedList

c - 在一个函数create_new_node中连接一个节点的所有链接可以吗?

c - 基本 Malloc/免费

java - 迭代列表并允许它同时删除一个项目(不是迭代器)

java - 错误: Type 'int[]' of field is not supported | how to add integer list to Realm?

CSS:子菜单绝对定位的子菜单

python - 从中间删除节点的算法

java - Java中具有多个头的链表