(也是第一次写博客,有什么需要改进的可以留言,以后会努力!)
某位著名的···家说过:程序 = 数据结构 + 算法
所以要想写好一个程序,数据结构是必不可少的。
本篇文章主要包括3个部分来初步认识什么是数据结构:
- 何为数据结构(在什么情况下才会用这个令人头疼的东西)
- 一些专业术语(个人感觉结合实例简单理解就好,不必咬文嚼字)
- 数据结构的组成
- 抽象数据类型的定义与实现(C语言实现,
别的还没掌握)
1.何为数据结构?
随着编程能力的提升,我们利用计算机解决的事情越来越多,并且大多数问题并不是数值类型,所以通常情况下,我们会分为以下几个步骤解决实际问题:
- 分析问题
- 将问题抽象为一个具体的数学模型
- 设计相应的算法
- 编程,调试,运行
而大多情况下,比较困难的就在于如何将实际问题抽象为数学模型,这又可以细分为:
- 提取出问题中可用计算机实现操作的操作对象
- 找出操作对象之间的关系
- 用数学语言描述操作对象之间的关系
因此,数据结构应运而生~
数据结构简单来说就是进行一系列的非数值运算,将操作对象抽象为一个个的表,树,图(后续文章可能会涉及,如果我还记的得话)并找出 表,树,图之间的关系。
比如一个图书管理系统
这就是一个线性表(大概先有个概念),我们不可避免的要不断更新这个系统——增加图书信息,删除图书信息,更改等一系列操作,并且注意到实现的这些操作中全部都是非数值类型的,所以要先提取出操作对象,例如可将书名,作者,分类等都用C语言中的数组来存储和表示,他们就称作可操作对象,然后再通过C语言的相关知识进行一系列操作。
再比如,地图导航中寻找最短路
可将起点终点以及中间经过的地点看做一个个结点,之间的路看做一条条线,从而整个地图就抽象为了图,求最短路问题也就抽象为了求两点之间的最短距离问题。
上述两个例子中就充分说明了数据结构——一系列可操作对象以及他们之间的关系。(表达能力有限,应该差不多了)
2.一些专业术语
这里可以将上边的图书管理系统为例,一一代入理解
- 数据 Data:分为数值类型,和非数值类型。数值类型如数学中的方程,曲线,表达式等可以直接利用数学语言表达的;非数值类型:上边两个例子就是,同样文件等也是非数据类型。
- 数据元素 Data element:数据元素是数据的最小单位,图书管理系统中每一条关于图书的信息都成为一个数据元素。
- 数据项 Data item:构成数据项的最小单位,例如书名,作者,分类等。
- 数据对象 Data object:性质相同的数据元素的集合。
- 数据结构 Data structure:相互之间存在一种或多种特定关系的数据元素的集合。
3.数据结构的组成
- 逻辑结构
- 物理结构,又称存储结构
- 数据的运算及实现
①逻辑结构
逻辑结构又分为线性结构和非线性结构
- 线性结构:有且只有一个开始点和终止点,并且所有结点中只有一个直接前驱和直接后继,线性表,栈,队列,串都是线性结构
- 非线性结构:一个结点可能有多个直接前驱或后继结点,树,图是典型的非线性结构
②存储结构
存储结构是数据元素及其关系在计算机内存中的表示,可以简单的理解为:逻辑结构只要你的数学够强就可以,即使不懂计算机方面的知识;而存储结构可以理解为你需要掌握数据怎样进行存储的,存储到了哪里。
存储结构也可以分为,顺序存储结构,链式存储结构,索引式存储结构和散列式存储结构。这里主要介绍前两种~
- 顺序:用一组连续的存储单元存储数据元素,存储的位置就反映了元素之间的关系
- 链式:用一组任意的存储单元存储数据,数据元素之间的关系通过指针表示,存储一个数据元素的同时,在存储下个元素的地址,通过此地址寻找下一元素,如此循环下去就形成了一条链
4.抽象数据类型的定义与实现
抽象数据类型(Abstract Data Type)简称ADT,是利用C语言中已有的数据类型(如int,float,char等)以及基本操作自定义形成的新的数据类型以及相应的操作
而我们在定义ADT时不需要考虑它在计算机内存中的具体存储形式以及具体的运算规则
定义抽象数据类型主要包括:数据对象D,数据对象之间的关系S,基本运算操作P
下面用C语言具体实现ADT的定义,以复数的操作作为演示
typedef struct Complex
{
float realpart; //实部
float imagepart; //虚部
}mycomplex;
//建立一个复数
void assign(mycomplex *p,float real,float image)
{
p->realpart = real;
p->imagepart = image;
}
//相加操作
void add(mycomplex *p,mycomplex a,mycomplex b)
{
p->realpart = a.realpart + b.realpart;
p->imagepart = a.imagepart + b.imagepart;
}
注意结构体对成员的调用用->,一般类型用.
同样的进行乘除定义,这里不再赘述。
int main()
{
mycomplex z1,z2,z3,z4,z;
float RealPart,ImagePart;
assign(z1,8.0,6.0);
assign(z2,4.0,3.0);
add(z1,z2,z3);
multiply(z1,z2,z4);
if(divide(z4,z3,z)){
GetReal(z,RealPart);
GetImag(z,ImagePart);
}
}
以上就是对数据结构的初步认识,(可能存在很多问题,望大家多多包涵,还是个大一的菜鸡)