2012-11-20 53 views
0

,所以我有一个链表实现和结构是这样的:返回链表的多个节点上

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

我只是使用自己的节点元素的指针向量。 I.e'vector listOfMatchingNodes;' – enhzflep

+0

@enhzflep - 这是一个C++特性。 – tjameson

+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。特别是它可以做任何你可能用返回的整数列表做的事情。当然这比返回值更不灵活。