区分数据类型和数据结构

好吧,不管怎样,即使在阅读了很多教科书(真的很多)之后,在互联网上待了很长时间,我仍然无法完全理解这两件事之间的区别是什么。

为了简化问题,根据维基百科说的数据类型是:

标识确定该类型的可能值的各种类型数据之一的分类,例如实数,整数或布尔值; 可以对该类型的值执行的操作; 数据的含义; 以及可以存储该类型的值的方式。

它主要是一些抽象数据类型的实现,如实数或整数。

一切顺利,然后是数据结构:

是一种在计算机中组织数据的特殊方式,可以有效地使用它。[1] [2] 数据结构可以实现一个或多个特定的抽象数据类型,这是指定操作合同及其复杂性的手段。 相比之下, 数据结构是ADT提供的合同的具体实现

因此,数据结构是ADT的实现,比如堆栈或队列。

但这不会使它成为一种数据类型吗?

我能真正看到的是,数据类型的范围可以从没有任何结构组织的非常简单的事物到复杂的数据结构,真正重要的是它们是ADT的实现,反映了它的重要方面,并且可以设想它们作为单个实体(如列表或树),但数据结构必须包含至少某种逻辑或数学组织才能归类为数据结构,但遗憾的是,这种差异会使许多实体同时成为数据结构和数据类型。

那么简单的普通(数据类型)和(数据结构)之间的区别是什么?

我很乐意接受一个答案,指出一个关于这个主题的特定书籍,这个书足以解释所有这些问题,如果有人可以推荐我一些关于C语言数据结构的好书。

在C中, 数据类型是语言级构造。 有限数量的预定义类型( intchardouble等),以及几乎无限数量的派生类型 (数组类型,结构类型,联合类型,函数类型,指针类型,primefaces类型(后者是新的)在C11))。

任何类型都可以通过typedef声明给出一个简单的名称。 对于函数类型或不完整类型以外的任何类型,您可以拥有该类型的对象 ; 每个对象占据一个连续的记忆区域。

C中可存在的类型完全在C标准的6.2.5节中描述; 例如,参见N1570草案 。

另一方面, 数据结构是由您自己的代码定义的构造。 该语言没有定义链表二叉树哈希表的概念 ,但您可以实现这样的数据结构,通常是在派生数据类型之上构建它。 通常,没有对象是链接列表。 链表数据结构的实例由相关对象的集合组成,只有代码的逻辑将该集合转换为连贯的实体。 但是,您通常会有一个数据类型的对象,程序使用该对象来引用链表数据结构,可能是结构或指向结构的指针。

您通常会拥有一组对数据结构实例进行操作的函数。 这些function是否是数据结构的一部分是一个难以回答的问题,我不会在这里回答。

例如,数组可以被认为是数据类型和数据结构; 更确切地说,您可以将其视为使用现有数组类型实现的数据结构。

参考> = C99:

有两种数据类型:

  • intrinsic: charintfloatdouble_Complex_Boolvoid (对于其中一些,有一个变体, longunsigned
  • 派生:数组,结构,联合,指针,函数

后者是从前者和/或后者构建的。


所以回答你的问题:

那么简单的普通(数据类型)和(数据结构)之间的区别是什么?

数据结构[类型] ”是从“ 简单明文数据类型 ”和/或其他“ 数据结构[类型] ”导出的。

数据类型指定单个表达式或对象允许的值和操作; 数据结构是存储区域和用于组织该存储中的对象的算法。

数据类型的一个例子是int ; 这种类型的对象可以存储至少 [-32767, 32767]范围内的整数值,通常的算术运算可以执行这些对象(尽管整数除法的结果也是一个整数,它会使人们第一次跳起来)。 您不能在int上使用下标operator [] ,也不能在int对象上使用函数call ()运算符。

有关数据结构的示例,我们可以查看一个简单的堆栈。 我们将使用数组作为我们的存储区域。 我们将定义一个额外的整数项作为堆栈指针 – 它将包含最近添加到数组的元素的索引。 我们定义了两种算法 – pushpop – 它们将按特定顺序向堆栈添加和删除项目。

 push: if sp is less than stack size then add 1 to sp write input to array[sp] else stack overflow end if pop: if sp is greater than 0 then get value from array[sp] subtract 1 from sp return value else stack underflow end if 

我们的堆栈数据结构存储了一些数据类型的对象,这样最后添加的项目始终是第一个删除的项目,也就是后进先出(LIFO)队列。 如果我们将值1,2和3推入堆栈,它们将按顺序3,2和1弹出。

请注意,它是将数据结构彼此区分开来的算法 ,而不是存储类型。 如果您的算法将一个项目添加到数组的一端并从另一端拉出它们,那么您将拥有一个先进先出(FIFO)队列。 如果你的算法将数组添加到数组中,那么对于数组中的每个元素, a[i] >= a[2*i]a[i] >= a[2*i+1]都是正确的,你有一堆。