在我决定跨考计算机的时候就听说学习计算机的难度非常大,学习了一段时间,发现确实有很多难以理解的地方,所以希望通过写博客的方式记录下来,既作为学习之后的总结,梳理思路,也为以后方便复习,巩固知识,同时为以后跨考者提供一些借鉴(毕竟我们都是从零起步),最后,如果对数据结构学习有理解错误的地方,希望各位大佬能够不吝雅正,万分感谢!
1.数据结构和算法
① 数据结构:数据结构主要研究数据元素之间的关系和操作。
② 算法:计算机解决问题的方法和步骤。
③ 数据结构和算法之间的关系:当遇到实际问题时,需要将问题对象转化成数据,把数据存储在计算机当中,在存储过程中我们需要根据数据的逻辑特点从而考虑使用最合适的存储结构,之后,根据数据结构的特点设计与之相对应的算法。
2 数据、数据元素、数据项、数据对象
①数据:所有能输入到计算机中符号的集合。
②数据元素:数据的基本单位。数据元素是一个整体,而数据对象和数据都是多个元素的集合,数据项则是整体的一部分。
③数据项:若干个数据项组成一个数据元素。数据项是数据的不可分割的最小单位。就好比胳膊、腿、脑袋、肚子等组成一个人一样。胳膊、腿就是数据项,人是数据元素。
④数据对象:相同性质的数据元素的集合。相同性质是指具有相同类 型和相同数量的数据项。数据对象是对数据的进一步分类,数据包括所有输入到电脑中的各种各样的元素,而数据对象是具有相同特征的元素的集合。
比如:
线性表的单链表存储结构:
struct LNode
{
ElemType data; // ElemType 相当于int,typedef int ElemType;
struct LNode *next; //next 是指向LNode类型的指针变量
};
typedef LNode* LinkList; //定义LinkList为LNode*类型
在该存储结构当中,整个结构体可以看作一个数据元素,它是一个整体,一般,在链表的插入和删除等操作中,都是以元素为单位进行操作,而不会说插入或者删除结构体中的data项或者next部分。结构体中的data部分和next部分是他的数据项,数据项是数据不可分割的最小部分。假设 typedef LNode * LinkList [10]; 此时LinkList 表示具有10个LNode类型数据元素的数组,此时的数组LinkList[10]就是数据对象。
3 数据结构的分类
数据结构包括逻辑结构,物理结构(存储结构)。
3.1 逻辑结构
3.1.1为什么需要逻辑结构
需要理清数据元素之间的关系,方便把数据存储到计算机中时。
3.1.2 逻辑结构的分类
数据元素都不是孤立存在的,而是在他们之间存在着某种关系,这种数据元素相互之间的关系称为逻辑结构。
通常有四类基本逻辑结构:
1.集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。
2.线性结构:结构中的数据元素之间存在一个对一个的关系。
3.树形结构:结构中的数据元素之间存在一个对多个的关系。
4.图状结构或网状结构:结构中的数据元素存在多个对多个的关系。
3.2 物理结构(存储结构)
3.2.1 为什么使用物理结构
讨论数据结构的目的是为了在计算机中实现对它的操作,因此还需研究如何在计算机中表示它,数据结构在计算机中的表示(又称映像)称为物理结构,又称为存储结构 ,它包含数据元素的表示(比如单链表存储结构就表示了链表的一个节点)和关系的表示(比如线性表为一对一的关系)。
3.2.2 物理结构的分类
数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像,与之相对应的存储结构:顺序存储结构和链式存储结构。 顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系(比如顺序表中逻辑结构相邻的元素物理结构相邻,而链式存储结构中,逻辑结构相邻的元素物理位置不一定相邻。
3.2.2.1 顺序结构
- 定义:逻辑上相邻的结点存储在物理位置相邻的存储单元中。(数组)
顺序结构需要在内存中请求分配一段连续的地址,每个字符型数据占用1个字节,第一个元素的地址为Ad,则第二个数据元素的地址即为(Ad+1),若是整型数据,占用4个字节,则第二个数据元素的地址即为(Ad+4)。
3.2.2.2 链式存储结构
1.定义:什么是链式存储结构:在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。 一般用指针链接每个元素。
2.示意图:
元素主要分为两个部分:A为第一个元素要存储的内容,Ad1为下一个元素的地址,Ad0是本元素的地址。