数据结构研究的是什么
起源:计算机主要用于解决计算问题,计算机普及,改变。
不仅仅要解决数值类的计算问题,非数值类问题;宾馆管理系统,通讯录,图书管理系
统,超市管理系统,这类问题涉及到的商品,宾客,图书,就需要数据结构来进行处理
什么是数据结构
1.计算机处理的对象(数据)已不再单纯的是数据
2.数据是信息的载体,是能够输入到计算系统中被计算机识别,处理,存储处理的符合总
称
3.数据元素是数据的基本单位,又称为记录;数据元素包含有基本的数据项
小结:
1.数据不再是单纯的数值,而是一个集合;
2.数据不再是包括整型,浮点类型的数值类型;
3.包括字符,声音,图像,视频等非数值类问题;
数据是一个集合,是由多个数据元素组成,每一个数据元素又是由多个数据项组成;
数据的逻辑结构
根据数据元素间关系的基本特性,有四种基本数据结构:
数据的逻辑结构
如果只是描述数据结构中数据元素之间的逻辑规律,即逻辑关系,则称此时的数据结构为数据的逻辑结构。它是从具体问题中抽象出来的数学模型,是独立计算机存储器的(与机器无关)。
线性结构:一对一。线性表,栈,队列
树形结构:1对多,1对2.二叉树。
图状结构:多对多。
数据的存储结构
基本概念
数据的存储结构(或物理结构)
数据的存储结构指的是数据的逻辑结构在计算机存储器中的映象(或表示)。存储结构是通过计算机语言所编制的程序来实现的,因而是依赖于具体的计算机语言的。数据结构较常用的有四种存储表示:
(1)顺序存储:将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中。
(2)链式存储:将数据结构中各元素分布到存储器的不同点,用地址(或链指针)方式建立它们之间的联系,由此得到的存储结构为链式存储结构。
(3)索引存储 :在存储数据的同时,建立一个附加的索引表,即索引存储结构=数据文件+索引表。
(4)哈希存储:通过构建数据元素里面的某个数据项作为主key,和存储地址之间构建一个映射
关系,然后通过主key就能快速找到数据元素
小结:
顺序存储结构------------线性表,顺序表;(数据元素在内存中连续存储,连续且大小固
定)
链式存储结构------------链表,(不连续的内存空间,内存大小不固定)
索引存储结构--------------索引表,数据文件
散列存储结构-------------hash表,(项目的重点)通过数据元素中的关键字段和地址构
建函数映射关系。
操作
具有逻辑结构的数据元素按照某种存储结构进行存放,计算机能够识别它,然后对它进行
相关的运算,运算不再单纯的加减乘除
1.创建
2.插入
3.查找
4.删除
5.销毁
6.遍历
数据结构的三个方面
顺序表
逻辑结构:1对1的线性结构;元素除了首和尾,中间的元素,有且只有一个前驱和一个后
继;
存储结构:按顺序进行存储。内存中连续且大小固定;
特点:
顺序并且连续的存储
大小固定,表满不能存新数据,表空的不能删除数据
操作:增删改查;插入和删除元素不是太方便,需要移动元素。访问和查找比较方便
定义顺序表
通讯录:数据元素 联系人 数据项(姓名,电话号码,家庭住址,公司职位)
超市管理系统:数据元素 商品,数据项(商品名称,生产日期,库存量,上架时间,本月
销量)
数据类型:int ,float,char,指针类型,结构体,共用体,枚举
typedef struct goods
{
char name[20] ; 商品名称
int sale; 销量
char datatime[10];生产日期
int num; 库存量
}data_type;
typedef int data_type;
typedef strust list
{
data_type arr[N];// Nl连续空间的大小,顺序且连续;
int count;//有效数据元素的个数 count == 0 表空 count == N,表满
}LIst;
顺序表的创建
顺序表的插入
顺序表删除
顺序表销毁
主函数
链表
将线性表L = (a0....an)逻辑关系1对1的;L数据对象,是多个数据元素,数据元素之间的
逻辑关系是1对1的;选择以链式存储的存储结构,存入到计算机中。能够进行增删改查操
作;
数据对象:L = (a0....an)
逻辑结构;1对1
存储结构:链式存储
链式存储:定义一个节点,包含两部分内容:数据域和指针域
数据域:存放数据元素
指针域:存放下一个节点的首地址
特点
(1)存储可以不连续,大小可以不固定
(2)实际的物理内存是不连续,逻辑上是1对1的关系保留了,是连续的。
(3)查找不太方便;没有索引;插入和删除比较方便
链表定义代码实现
链表的操作
链表的创建
链表的头部插入
链表中间插入尾部插入
链表的显示
链表的中间、尾头部删除
销毁
双链表的定义
typedef struct dblinknode
{
data_type data;//数据域
struct dblinknode *pre;//指向前一个结点的首地址
struct dblinknode *next;//指向下一个结点的首地址
}DBLinkNode;
头文件定义
双链表中间插入
双链表显示
双链表删除
栈的定义
逻辑结构:是1对1的;元素是一个接着一个存放
存储结构:有顺序存储,顺序栈。
有链式存储, 链式栈
操作:只限定在一端进行操作;栈顶;添加元素,删除元素,只能通过在栈顶进行;
顺序栈的定义
typedef struct stack
{
data_type arr[N[; //顺序且连续存储,大小固定
int top;// top ==-1;空。top == N;满
}Stack;
栈的创建
入栈
顺序表: 表满不能存
出栈
栈的显示
链式栈
特点:
插入和删除的操作只能在链表的表头进行;
栈顶:链表的表头;
栈底:链表的尾部;
栈的应用
限定在一端进行操作;乘法器;
队列
先进先出
在队尾是可以进行插入元素,入队
在队头是可以进行删除元素,出队
逻辑结构:1对1
存储结构:顺序存储 顺序队列 链式存储 链式队列
顺序队列特点
存储结构:顺序存储 顺序队列
顺序且连续,大小固定
typedef struct queue'
{
data_type arr[N];
int front ; 队头 删除 队头删除
int rear; 队尾 插入 队尾插入
}Queue;
顺序存储:队满 队空
顺序队列赋值
循环队列的初始值和队空条件
循环队列的队满条件
出队和入队的关键代码
typedef struct queue'
{
data_type arr[N];
int front ; 队头 删除 队头删除
int rear; 队尾 插入 队尾插入
}Queue;
代码实施 头文件定义
创建队列
入队出队
显示
主函数
树的概念
树是n个结点的有限集合T,它满足两个条件:
有且仅有一个特定的称为根的节点
其余节点可分为m个互不相交的有限集合T1,T2....Tm,其中每一个集合又是一颗树,并成为其根的子树。
表示方法:树形表示法、目录表示法
树的结点分类
根结点:A,没有双亲;有孩子;B,C,D
中间结点:既有双亲,又有孩子;B,C,D,E,H,
叶子结点:有双亲,但是没有孩子;K,L,F,G,M,I,J,G
森林: 多个根,独立的互不相交的树的集合;
树的概念----度数
结点的度数:
一个结点的子树的个数称为该结点的度数;
A结点:B,C,D三个子树,A结点的度数,就是3
叶子结点:度数总是为0;
树的度数:
树中的各结点的度数的最大值。树的度数
树的概念-----深度
层数:根结点的层数定义为第一层;
树的深度:是树中结点层数的最大值为这颗树的深度;
树的深度 4
树的概念----边数
一个结点序列k1,k2,...kj, 只要ki是ki+1的父节点,就称为一条从k1到kj的路径
路径的长度是j-1;也是路径的边数;
二叉树
严格区分左子树和右子树
树中的每个结点,度数不会超过2;0,1,2
空集
逻辑结构:1对2
二叉树的性质
每一层的节点个数
深度为K的节点个数 2^k-1
度数为0的节点个数是度数为2的节点个数+1;
满二叉树
深度为k有2^k -1 个节点的二叉树
满二叉树中,
只有度数为2的节点和度数为0的节点
;且度数为0 的结点是在最大层数
的那一层;
结点个数 2^K-1
完全二叉树
对一个具有n个结点的二叉树按层编号,如果编号为i的结点与同样深度的满二叉树的
编号i的结点,在二叉树中的位置完全相同,就是完全二叉树;
二叉树的顺序存储
二叉树的三种遍历方式
遍历:对每一个结点访问一次;
线性结构:遍历的路径只有一条
非线性结构:二叉树有两个后继,遍历的路径是不唯一的;
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根