所以我有一个链表实现,结构看起来像这样:
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。有没有一种简单的方法可以做到这一点,还是应该为这些目的创建另一个链表?
答案 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
提供的记录中。特别是它可以对返回的整数列表执行任何操作。当然,这比返回值更不灵活。