【问题标题】:Return multiple nodes on linked list返回链表上的多个节点
【发布时间】:2012-11-20 04:48:47
【问题描述】:

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

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

【问题讨论】:

  • 我自己只使用指向节点元素的指针向量。即vector<channel_db*> listOfMatchingNodes;
  • @enhzflep - 这是一个 C++ 特性。
  • 也许做两遍:一次确定你有多少匹配,另一次用匹配填充动态分配的数组。
  • @enhzflep 我忘了说我是用 C 而非 C++ 编码的。
  • 返回ptr到ptrs。 end 可以通过 NULL 来标识

标签: c list linked-list


【解决方案1】:

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

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

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

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

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

或者你可以采用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 提供的记录中。特别是它可以做任何你可能对返回的整数列表所做的事情。当然这没有返回值那么灵活。

【讨论】:

    猜你喜欢
    • 2014-10-16
    • 2021-03-26
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2021-08-03
    相关资源
    最近更新 更多