Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回链表上的多个节点_C_List_Linked List - Fatal编程技术网

C 返回链表上的多个节点

C 返回链表上的多个节点,c,list,linked-list,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 chann

我有一个链表实现,结构如下所示:

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;

在我的代码中的某个时刻,我需要搜索列表中满足特定要求的所有节点,例如高于特定阈值的实际\u bw,并返回满足该要求的所有通道\u id。有没有一种简单的方法可以做到这一点,或者我应该为这些目的创建另一个链表?

C最好的地方是它小而简单。C语言最糟糕的地方是它小而简单

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

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

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

我自己只使用指向节点元素的指针向量。即匹配节点的向量列表 @ HuffZFLIP——这是一个C++特性。也许会做两遍:一个确定你有多少匹配,另一个用来填充匹配的动态分配的数组。@恩ZFrip,我忘了提到我在C NC C++中编码。可以通过NULL标识结束