【问题标题】:Search in members of array of data structures in C在 C 中搜索数据结构数组的成员
【发布时间】:2019-12-09 05:29:06
【问题描述】:

我有一个这个数据结构的数组:

typedef struct {
unsigned long id; // Node identification
char *name;
double lat, lon; // Node position
} node;

我想通过 id 进行二分搜索。 我尝试像这样定义函数

unsigned long bi_search(unsigned long *Vector, unsigned long Vlen, unsigned long target) {
    imin = 0; imax = Vlen-1;
    while (imax > imin) {
        imid = (imax + imin)/2;
        if (Vector[imid] == target) {
            return imid;
        }
        else if (Vector[imid] < target) {
            imin = imid + 1;
        }
        else {
            imax = imid - 1;
        }
    }
    return -1;
}

然后调用它

bi_search(&nodes->id, nnodes, 0)

该函数适用于矢量,但我无法使其在结构数组中进行搜索。

【问题讨论】:

  • 欢迎来到 Stack Overflow。你犯了一个根本性错误:nodes 是指向 node 数组中第一个元素的指针,&amp;nodes-&gt;id 是指向 nodeid 成员的指针(这是一个 unsigned long ) 但它不是指向unsigned long 上数组中第一个元素的指针。
  • 感谢您的欢迎和您的回答:D 是的,这正是问题所在,您知道如何使其工作。
  • 代替Vector[imid] == target,使用Vector[imid].id == target,同样使用Vector[imid] &lt; target

标签: c arrays data-structures binary-search


【解决方案1】:

您需要调整搜索功能的签名和调用方式。 您必须获取指向结构类型数组的第一个元素的指针。在函数内部,您将使用 vector[i].id 访问数组的 ith 元素的 id 成员。

unsigned long bi_search(node *vector, unsigned long vlen, unsigned long target)
{
    unsigned long imin = 0;
    unsigned long imax = vlen - 1;
    while (imax > imin)
    {
        unsigned long imid = (imax + imin) / 2;
        if (vector[imid].id == target)
            return imid;
        else if (vector[imid].id < target)
            imin = imid + 1;
        else
            imax = imid - 1;
    }
    return ULONG_MAX;  // -1 isn't an option
}

然后在数组的开头调用它:

unsigned long index = bi_search(nodes, nnodes, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 2013-04-30
    • 2015-03-08
    • 2017-06-11
    • 1970-01-01
    • 2011-04-11
    • 2011-03-04
    相关资源
    最近更新 更多