【问题标题】:Creating a Set ADT in C在 C 中创建一个集合 ADT
【发布时间】:2014-01-10 14:33:43
【问题描述】:

我正在尝试创建 ADT。

它是有限元的动态集合。它必须使用数组和链表来实现。

一些操作包括add(set, x)remove(set, x)

我知道我首先需要创建一个对数组实现和链表实现都通用的接口。

但是,我不确定这种数据类型的结构。我应该包括什么?

struct test {
    int x;
    char y;
};

类似的东西?或者说我把集合设为整数独占,数据结构会涉及什么?

我们将不胜感激。谢谢!

【问题讨论】:

  • 需要更多信息。您是在考虑数学意义上的有限集(允许重复元素),还是set(),如 Python/Java/等。 (只有独特的元素)?您是否正在尝试选择一种数据结构来优化 add()remove() 操作,或者可能是像 union()intersect() 这样的其他操作?为什么使用数组链表?您有许多数据结构可供选择,为什么“必须”用这些来实现?
  • 我在用数学的方式思考。基本上,我所要做的就是添加或删除一个元素,然后尝试诸如 check_if_element_is_present()、union()、intersection()、cardinality() 之类的函数......
  • 基本上,我需要创建一个动态集合 ADT 并使用数组和链表实现它,但我很困惑,不知道从哪里开始,真的。
  • 我的问题是,你必须使用 C 还是可以使用 C++?您必须使用数组/列表,还是可以使用树/哈希表?这是作业吗?
  • 是的,这是我在学校从事的一个项目。必须使用 C 并且仅限于数组和链表。

标签: c set structure adt


【解决方案1】:

由于这是针对学校的,因此我不会为您提供实现,但我会为您指明正确的方向。使用数组和列表会尖叫“哈希表”。请参阅this answer 了解一些有用的信息。

为简单起见,我们假设它是一组整数。 本质上,您需要一个包含 N 个“桶”的数组 hash_table,即列表。要添加元素x,您需要执行hash_table[hash(x) % N] 以获取“桶”(列表)x 应该进入,如果它不在列表中,则将其添加到该列表中。

要删除x,请执行hash_table[hash(x) % N] 以获取您的存储桶,并删除x(如果存在)。

如果你能实现这些,search(set, x) 是微不足道的。您还可以尝试实现union(setA, setB)intersect(setA, setB)difference(setA, setB)isSubset(setA, setB) 等。您可能还想仔细阅读the Wikipedia article on the Set ADT,并查看The Algorithm Design Manual 中的条目,其中包括指向实现的链接底部。

祝你好运,编码愉快。如果您遇到困难,可以在这里询问 SO,下次只需发布代码即可。 :)

【讨论】:

  • 啊,非常感谢!真的很有帮助而且内容丰富。我会全力以赴的。赞赏!
【解决方案2】:

这是一个结构的原理,你可以把你想要的所有类型的变量放在里面..

我想你想创建一个 int 数组。 声明如下:

int tab["number of int you want"];

然后像这样访问它:

tab["number of case of the int you want to access"];

【讨论】:

  • 如果我只做一组数字,我会失去结构的目的,不是吗?
  • 结构就像一种变量。您可以将“int”、“char”等...放入其中,并在代码中查看或修改此结构的值。
  • 哦,是的,有道理。基本上,数组就是一个结构体。
  • 不,真的不一样!如果需要,您可以创建一个结构数组。结构是一种变量,您可以在其中放置所需的所有变量。数组是一种保存变量的方法。
  • 我明白了。因此,在创建这个仅将数字存储为元素的 Set ADT 时,我还必须创建一个数据结构。该结构应该只包含一个整数数组吗?或者我是否还应该包含任何其他变量,可能是指向结构的指针......?顺便说一句,感谢您的回复!
猜你喜欢
  • 2023-03-30
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多