2-数据结构基本概念

1. 什么是数据结构

  在介绍数据结构之前,我们先来了解数据结构的一些基本概念。

  数据:数据是所有能被输入到计算机中,且能被计算机处理的符号的集合,也就是计算机操作的对象的总称,也是计算机处理的信息的某种特定的符号表示形式。比如:数字,字符,音频,视频等数据来表示某种特定的符号表现形式。

  来看一个例子,如下面的表格中所示:

这里写图片描述
图1-学生信息表格

  在图1中存储了一些学生的信息,每个学生的信息主要包括了学号,姓名,性别,班号等信息。因此我们可以对这些学生信息做成一个学生信息管理系统,而这个学生信息管理系统在计算机中就是一个程序。也就是说,这些学生信息能够输入到计算机中,并且能够被计算机处理,那么这些学生信息在计算机中就是数据

  在明白了什么是数据后,再通过上面的这张表来解释数据元素,数据项,数据对象就容易了。

  数据元素就是数据(集合)中的一个“个体”,是数据的基本单位。根据图1来看,数据元素就是每个学生的信息(学号,姓名,性别,班号),每个学生的信息在这张表格中都是一个“个体”。

  数据项是具有独立含义的最小数据单位。我们可以把图1中的学生的每个信息看做是一个数据项,比如:学号1是一个独立的数据项,又或者班号9901是一个独立的数据项,因为对于这些数据项不能再往下分了,所以又称最小数据单位。从中我们可以得出一个结论:每一个数据元素包含了若干个这样的数据项组成的。

  对于数据对象来说,是具体相同性质的若干个数据元素的集合。因此,我们可以把图1中学生信息表的所有同学看做是若干个数据元素,而学生信息表就是数据对象。

了解了基本的数据概念后,对于数据结构定义总共有以下几点:
  1.带结构的数据元素的集合,例如每个数据元素必须包括:学号,姓名,性别,班号等,这些信息。

  2.相互之间存在着某种特定关系的数据元素的集合,例如数据元素之间有前后,两两相邻的一个线性关系。

  3.数据以及数据元素相互之间的联系,也就是说我们在描述数据结构时,需要把数据描述出来,又要去描述数据元素之间的联系。

2. 数据结构的要素

  对于数据结构的要素,我们可以从以下几部分来考虑:数据的逻辑结构,数据的存储结构,数据的运算。

  首先是数据的逻辑结构,对于逻辑结构其实指的是数据元素之间的逻辑关系,是数据在普通用户面前呈现的形式。在这个阶段是不涉及到具体的计算机实现和存储的,比如图1中的学生信息表所表现的形态就是数据的逻辑结构。

  其次是数据的存储结构,对于存储结构来说指的是数据元素及其关系在计算机存储器中的存储方式,也称为数据的物理结构。比如当数据要涉及到在计算机中的具体实现和存储的话,那么我们就要用程序设计语言进行设计数据的存储结构:

struct
{
int no;             //存储学号
char name[8];       //存储姓名
char sex[2];        //存储性别
char class[4];      //存储班号
} Stud[7]= {{1,“张斌”,“男”,“9901”} , … , {5,"王萍","女","9901"}};

  我们通过数据逻辑结构定义了一个结构体,在这个结构体中包含了学号,姓名,性别,班号等数据,再定义一个Stud[7]这样的一个结构体数组,这意味着会在计算机中分配内存空间存储这样的数据是按照要求去做的,这种结构就叫存储结构。另外,这些数据已经在计算机中真实存在的,因此又叫数据的物理结构。

  当我们解决了数据在计算机中的物理存储时,接下来就可以考虑数据运算,即在数据上的操作,比如:

增加一个学生记录
删除一个学生记录
查找班号为“9902”的学生记录
.. . . . . .

3. 逻辑结构表示法

这里写图片描述
图2-逻辑结构表示法

  对于数据的逻辑结构表示方法有以上两种,对于第一种来说非常符合人的习惯,非常直观。对于第二种来说,用学号来表示每个学生的信息,即用学号来代表每个学生,把他们之间的逻辑关系描述成蓝色圆圈中的一样,也就是通过学号把学生之间两两相邻的关系描述出来。

4. 存储/物理结构实现法

这里写图片描述
图3-存储/物理结构实现法1

  当我们通过定义Stud[7]数组这种结构来存储每个学生的信息后,那么会在计算机中开辟一块连续的存储空间来存储Stud][7],每个学生代表一个数组元素,这块内存空间的数组元素关系是两两相邻,这种存储结构是利用数组来实现的。

这里写图片描述
图4-存储/物理结构实现法2

  上面是通过设计一个链表结构来存储学生信息,每个学生存储的空间不是连续的,但是通过每个学生的next指针指向下一个学生的位置,把每个学生连接起来,也能实现两两相邻的关系。

  不管是对于数组的顺序存储还是链表的链式存储,都实现了学生之间两两相邻的关系。我们可以得出一个结论,同一逻辑结构可以对应多种存储结构,每一种存储结构都有各自的优缺点,在实际应用中应该根据要求选择合适的存储结构,另外在设计存储结构时,要做到既能存储元素,又能存储关系

5. 运算实现

  在依次实现了逻辑结构,存储结构之后,就是数据运算的实现了,在前面的学习中我们说到了数据的存储方式有顺序存储和链式存储,在后面的学习中可能还会引入索引存储和散列存储。

这里写图片描述
图5-运算实现

   如图5所示,但是不管是使用哪一种存储,我们都可以去实现一些数据的运算,比如我们通过顺序存储和链式存储去实现查找学号为20的学生。我们通过顺序存储的方式去查找的话,可以先从stud[0]中的学号是否为20,如果不是则继续往后找,也就是说,我们可以一个一个往下去比较。但是如果我们要通过链式存储去查找的话,必须先找到第一个节点,并判断第一个节点的学号是否为20;如果不是,再根据节点的next指针找到第二个节点,然后去判断第二个节点的学号是否为20,也就是说,可以通过next指针一个一个查找。

  当我们要插入学号56的学生的话,如果是按照顺序存储的方式,可以直接插入到后面还未存储数据的stud[n-1]的空间中,如果是按照连式存储的方式,我们需要先开辟一个新节点存储信息,然后找到链表的最后一个节点指向新节点。

  因此我们可以得出结论:对于同样的运算,在不同的存储结构中其实现过程是不一样的,那么既然实现过程不一样,那么就可以从中分辨出哪些实现是好的,哪些实现是坏的,也就是说不同的存储结构适用于不同的应用场景,应该根据实际的要求选择合适的实现过程,这也是我们应该具备的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值