目录
一、前言
本文主要是数据结构与算法的一些总结,此文章的目的主要是记录学习过程,
二、基本概念和语术
(一)、基本概念
1、数据:是描述客观事物的符号,是能够输入到计算机并能被计算机处理的符号集合。它 不仅包括数值类型也包括声音、图像、视频等非数值类型。
2、数据元素:在计算机中具有一定意义的数据的基本单位,一般在计算机中作整体处理,有时候也被叫做记录、结点、顶点。
3、数据项:组成数据元素的最小的不可分割的最小单位。
4、数据对象:具有相同性质的数据元素的集合。
(二)、笔者的提醒
1. 上述名词表示的范围大小是:数据>数据对象>数据元素>数据项
2. 数据对象是数据的子集,数据元素是数据的个体。
(三)、数据结构
相关书籍上的定义是这样说的:数据元素之间的关系叫做结构。数据结构是相互之间存在一种或多种特定关系的数据元素集合,或是指带结构的数据元素的集合。简单来说其实就是具有一些特定关系(结构)的数据,而不是杂乱无章的。
三、数据结构
(一)、逻辑结构
1、集合结构
数据结构中的数据元素除了属于同一个集合没有其他的任何关系的数据结构。
2、线性结构
数据结构中的数据元素存在一对一的线性关系
3、树型结构
数据结构中的数据元素存在一对多的层次关系
4、网状结构
数据结构中的数据元素之间存在着多对多的任意关系
(二)、物理结构
物理结构就是数据的逻辑结构在电脑中的存储结构,分为下面四类:
顺序存储结构
链式存储结构
索引存储结构
散列存储结构
1、顺序存储结构:是用一组连续的存储单元存储数据元素。其中元素间的逻辑关系跟物理关系一致。例如在C语言中用数组来实现。
2、链式存储结构:是不需要提前准备好连续的存储空间,而是用链表来实现,链表中的指针指向下一个元素的地址。,显然这样就容易了很多了,对于元素的删除、添加、插入、调换都十分方便。
3、索引存储结构:它除了要建立存储结点信息,还建立附加的索引表,索引表由若干索引项组成。这也就体现了它的缺点是增加了附加的索引表,会占用较多的存储空间。
4、散列存储结构:是一种将数据元素的存储位置与关键码之间建立确定的对应关系的查找方式。根据结点的关键字直接计算出这一结点的存储位置(地址)。
四、数据类型和抽象数据类型
(一)、数据类型
数据类型是一个值的集合和定义在这个值集上的一组操作的总称,每一个数据属于一个特定的数据类型,数据类型暗示了数据的取值范围、存储方式,以及允许进行的运算。
(二)、抽象数据类型(ADT)
1、概念
抽象数据类型一般是指自己定义的用于解决问题的数学模型,以及在模型上的一系列的操作的总称。
2、抽象数据类型定义格式
ADT 抽象数据类型名{
数据对象:<定义数据对象>
数据关系:<定义数据关系>
基本操作:<定义基本操作>
}ADT 抽象数据类型名
注:*数据对象和数据关系的定义都是用伪代码来表示的,就是自然语言与和数学符号来说明即 可。
*基本操作的定义则是如下形式:
基本操作名(参数表)
初始条件:<初始条件描述>
操作结果:<操作结果描述>
上述基本操作中的参数表分为赋值参数和引用参数。
赋值参数的作用是为操作提供输入值。
引用参数以&开头,既提供输入,还可返回操作结果。
笔者自己的理解就是当我们的已有的数据类型不能直接来定义我们想要的变量,这个时候抽象数据类型就派上用场了。还有一个就是很多初学者会想这个定义格式都是自然语言和数学符号来用伪代码的形式写出来的,它在编译器中怎么运行,笔者提醒一下,其实这个定义格式是书面书写出来的,也就是说是人写出来仅供查看了解即可,并不是要在编译器中运行滴。比如你现在的代码中定义了一个复数这样的抽象数据类型,其他人看来后不知道是什么,你把你自己写的复数的这一抽象数据类型的定义拿给他看看,他便明白了你这个复数抽象是数据类型的对象,关系,以及操作都有哪些。这也便是抽象数据类型定义的意义所在啦。
3、抽象数据类型的表示与实现
下面用复数这一抽象数据类型来举例
代码举例:
#include"stdio.h"
typedef struct
{
float Realpart;
float Imagepart;
}complex;
//创建一个复数
complex Creat(float x, float y);
//获得复数的实部
float GetReal(complex c);
//获得数据的虚部
float GetImage(complex c);
//求两个复数的和
complex Add(complex c1, complex c2);
//求两个复数的差
complex difference(complex c1, complex c2);
void main(void)
{
complex c1,c2,c3,c4;
c1= Creat(1.0, 2.0);
c2 = Creat(3.0, 4.0);
GetReal(c1);
GetImage(c2);
c3=Add(c1, c2);
c4=difference(c1, c2);
printf("c1=%f+(%f)i\n", c1.Realpart, c1.Imagepart);
printf("c2=%f+(%f)i\n", c2.Realpart, c2.Imagepart);
printf("c3=%f+(%f)i\n", c3.Realpart, c3.Imagepart);
printf("c4=%f+(%f)i\n", c4.Realpart, c4.Imagepart);
}
//创建一个复数
complex Creat(float x, float y)
{
complex c;
c.Realpart = x;
c.Imagepart = y;
return c;
}
//获得复数的实部
float GetReal(complex c)
{
return c.Realpart;
}
//获得数据的虚部
float GetImage(complex c)
{
return c.Imagepart;
}
//求两个复数的和
complex Add(complex c1, complex c2)
{
complex c;
c.Realpart = c1.Realpart + c2.Realpart;
c.Imagepart = c1.Imagepart + c2.Imagepart;
return c;
}
//求两个复数的差
complex difference(complex c1, complex c2)
{
complex c;
c.Realpart = c1.Realpart - c2.Realpart;
c.Imagepart = c1.Imagepart - c2.Imagepart;
return c;
}
执行结果:
上面可以看出具体想要实现抽象数据类型的“问世”还是靠函数。复数这一抽象数据类型的基本操作都是函数来表现出来的。说白了就是很多函数拼出了抽象数据类型。
今天的分享就到这啦😉
如果我的文章对您有帮助,
希望可以 “点赞” “收藏” “关注” 一键三连支持一下哦!
想了解更多知识请前往故里♡9513的博客
如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。
我们下期见😉~~