C - 如何遍历 ADT 结构?

标签 c struct abstract-data-type

我正在为一项学校作业制作一套 ADT,而且我已经快要完成了。但是,对于如何迭代结构中的各个项目,我遇到了一些困难: 集合结构的“元素”成员必须是空指针,如果它是 int 类型,我可以set->element[i]。对替代品有什么建议吗?

struct set
{
    void *element;
    int size;
    cmpfunc_t cmpfunc;
    set_t *start;
    set_t *next;
};

int set_contains(set_t *set, void *elem)
{
    for(int i = 0;i<set->size;++i)
      if(set->element[i] == elem)
        return 1;

    return 0;
}

最佳答案

您的 ADT 结构并没有多大意义;看起来您已经尝试过混合不同的设计模式,即使用数组来保存集合元素,以及使用链表来保存集合。

我会冒昧地修改结构,使其更符合任一模式。首先,typedef 的隐藏信息 -> 尽可能避免它们。

第一种模式:使用元素数组

struct set {
  void **elements;              /* array of elements    */
  int nElem;                    /* array count          */
  size_t elemSize;              /* size of element type */
  int(*cmpFunc)(void*, void*);  /* equality comparison  */
};

elemSize 字段用于在不知道数据类型的情况下分配和复制新元素。这对于两种模式和一般的通用 ADT 都是常见的。要迭代此集合,请使用:

int set_contains(struct set *pSet, void *elem) {
  for (int i = 0; i < pSet->nElem; ++i) {
    if (pSet->cmpFunc(pSet->elements[i], elem))
      return 1;
  }
  return 0;
}

第二种模式:使用链表表示集合

struct node {
  void *data;         /* element data      */
  struct node *next;  /* next node in list */
};

struct set{
  struct node *head;            /* first element       */
  size_t elemSize;              /* size of data type   */
  int(*cmpFunc)(void*, void*);  /* equality comparison */
};

元素大小和比较函数是给定集合的属性,而不是该集合中包含的数据,因此它们定义在 set 结构上,而不是 node 结构,它只定义了数据和关联的链接。要迭代此集合,请使用:

int set_contains(struct set *pSet, void *elem) {
  struct node *head = pSet->head;
  while(head) {
    if (pSet->cmpFunc(head->data, elem))
      return 1;
    head = head->next;
  }
  return 0;
}

关于C - 如何遍历 ADT 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49196874/

相关文章:

C 标准输入不起作用

c - 在 C 中有效地添加两个链表

c# - 如果结构具有 ReadOnlySpan 字段,如何将 ref struct 参数传递给 MethodInfo

c++ - 运算符重载 + C++

c - 读取写入管道的信息后无法退出 while 循环

c - “无论如何,遵循 "prefer++i over i++"指南,你就不会出错。” C语言中这背后的原因是什么?

c - 在另一个结构中分配一个结构数组

C++:我什么时候应该使用结构而不是类,速度差异在哪里?

c - C 中 ADT 列表迭代器的问题

c - 如何使用不能将数组作为参数的函数来填充作为结构一部分的数组