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标识结束