所以我有一个链表实现,结构如下所示:
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/