一、数据元素之间的逻辑结构有四种基本类型
-
集合:数据元素之间除了同属一个集合外没有其它关系。
集合是最简单的逻辑结构,其中的元素之间没有任何特定的顺序或关系。每个元素在集合中都是独立的,没有前驱或后继。集合中的元素通常是独立的个体,没有关联。集合的典型例子是数学中的集合概念。
-
线性结构:数据元素之间存在一对一的关系,也被称为线性表,简称为表,最具代表性的就是数组、链表。
线性结构是一种有序的逻辑结构,数据元素之间存在一对一的关系。每个元素都恰好有一个前驱和一个后继,除了第一个元素没有前驱,最后一个元素没有后继。线性结构可以用线性表、栈和队列等数据结构来表示。
-
树型结构:数据元素之间存在一对多的关系,如:族谱关系、组织关系。
树形结构是一种分层的逻辑结构,数据元素之间存在一对多的关系。每个元素可能有一个父元素和多个子元素,每个子元素也可能有自己的子元素。树形结构的典型例子是计算机文件系统中的目录结构。
-
图状结构:数据元素之间存在多对多的关系,如:地铁、高铁线路图。
图形结构是一种多对多的逻辑结构,数据元素之间存在多对多的关系。图形结构由节点(顶点)和边组成,节点表示数据元素,边表示元素之间的关系。图形结构广泛应用于网络、社交关系和路由等领域。
总结起来,集合是无序的,线性结构中元素有序且一对一关系,树形结构中元素有层级关系,图形结构中元素之间存在多对多的关系。这些逻辑结构在数据结构和算法中被广泛应用,用于解决不同类型的问题。
一、顺序存储结构
数据存储在一段连续的空间中,用数据元素在存储器中的相对位置来表示数据元素的关系。
下面是线性结构的顺序存储结构,先定义数据元素和顺序存储结构,并创建出线性结构。
-
优点:随机访问方便,访问效率极高。
-
缺点:插入、删除不方便。
// 定义了一个结构体数据元素
typedef struct Student
{
char name[20];
char sex;
float score;
}Student;
// 数据结构 顺序表
typedef struct Array
{
Student* ptr; // 存储元素的内存首地址
size_t cap; // 顺序表的容量
size_t cnt; // 表中元素的数量
}Array;
// 创建函数
Array* create_array(size_t cap)
{
Array*arr=malloc(sizeof(Array)); // 给数据结构申请堆内存
arr->ptr = malloc(sizeof(Student)*cap); // 给存储数据元素申请堆内存
arr->cap = cap; // 初始化表容量
arr->cnt = 0; // 初始化表元素数量
return arr; // 返回该空的数据结构
}
二、链式存储结构
结构中的数据元素存放在彼此独立的地址空间中,每个独立的地址空间称为节点。在每一个数据元素中增加一个存放另一个元素地址的指针,用来表示数据元素之间的关系。
-
优点:插入、删除方便,空间利用率高。
-
缺点:随机访问不方便,只能由前到后逐个访问。
typedef struct ListNode
{
TYPE data; // 数据域
struct ListNode* next; // 指针域
}ListNode;
// 创建节点
ListNode* create_list_node(TYPE data)
{
// 给节点分配堆内存
ListNode* node = malloc(sizeof(ListNode));
node->data = data;
node->next = NULL;
return node;
}
三、逻辑结构和存储结构的关系
逻辑结构和存储结构是数据结构的两个重要概念,它们之间存在紧密的关系。
逻辑结构描述了数据元素之间的逻辑关系和组织方式,它关注的是数据元素之间的逻辑关系,而不考虑具体的存储方式和物理结构。常见的逻辑结构有线性结构、树形结构、图结构等。
存储结构(也称为物理结构)描述了数据结构在计算机内存或磁盘等存储介质上的存储方式和组织方式。它关注的是如何将数据元素存储在计算机内存中以便高效地进行访问。常见的存储结构有顺序存储结构和链式存储结构等。
逻辑结构和存储结构之间的关系是:
-
顺序存储结构:顺序存储结构适合描述线性结构,其中的数据元素按顺序存储在一块连续的内存空间中。例如,数组就是一种典型的顺序存储结构,它可以用来表示线性表。
-
链式存储结构:链式存储结构适合描述树形结构和图结构,其中的数据元素通过指针或引用连接起来,存储在零散的内存块中。例如,链表就是一种典型的链式存储结构,它可以用来表示单链表、双链表等。
在实际应用中,逻辑结构和存储结构是相互关联的。选择适当的存储结构可以更好地支持逻辑结构的操作和运算。不同的逻辑结构可能对应不同的存储结构,同一种逻辑结构也可以有多种不同的存储结构实现方式。选择合适的存储结构可以提高数据的操作效率和存储空间利用率。
数据结构 | 表 | 树 | 图 |
顺序 | 顺序表 | 顺序树 | 矩阵 |
链式 | 链式表 | 链式树 | 邻接表(顺序+链式) |