聊一聊数据结构

数据结构浅谈

一、线性结构

线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。

1.线性表

线性表常采用顺序存储和链式存储,主要的操作是“插入”、“删除”、“查找”。

1.1.线性表的的顺序存储

线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
在表长为n的线性表插入新元素,共有n+1个插入位置。等概率下,插入一个新元素需要移动的元素个数期望值E为n/2
在表长为n的线性表中删除元素时,共有n个可删除的元素。在等概率下删除元素时需要移动的元素个数期望值E为**(n-1)/2**。

1.2.线性表的的链式存储

在这里插入图片描述
图1 线性表的单链表存储
单链表节点类型定义:

typedef struct node{
        int data;            //节点的数据域,此处假设为整型
        struct node *next;   //节点的指针域
}NODE,*LinkList;

在链式存储结构中,只需要一个指针(称为头指针,如上图Head)纸箱第一个节点,就可以顺序地访问到表中的任意一个元素。

单链表中,在p所指节点后插入新元素节点(s所指节点):

s->next = p->next;
p->next = s;

在单链表中删除p所指节点的后继节点:

q = p->next;
p->next = p->next->next;  //写成p->next = q->next也可
free(q);

1.3.双向链表

每个节点包含两个指针,分别指出当前元素的直接前驱和直接后继。其特点是可以从表中任意的节点出发,从两个方向上遍历链表。
在双向链表中插入节点*s:

s->front = p->front;
p->front->next = s;
s->next = p;
p->front = s;

在双向链表中删除节点:

p->front->next = p->next;
p->next->front = p->front;
free(p);

2.栈和队列

2.1.栈

栈:栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。栈的修改是按先进后出的原则进行的。
栈的存储结构:
(1)顺序存储
(2)栈的链式存储
(3)栈的应用:栈的典型应用包括表达式求值,括号匹配等,在计算机语言的实现以及将递归过程转变为非递归过程的处理中,栈有重要的作用。

2.2.队列

队列:队列是先进先出的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。允许插入元素的一端称为队尾,允许删除元素的一端称为队头。
队列的存储结构
(1)队列的顺序存储
(2)队列的链式存储
(3)队列的应用:队列结构常用于处理需要排队的场合。例如操作系统中处理打印任务队列、离散事件的计算机模拟等。

二、树

树是n(n>=0)个结点的有限集合,当n=0时称为空树。在任一非空树(n>0)中,有且仅有一个称为根的结点;其余结点可分为m(m>=0)个互不相交的有限子集T1,T2,……,Tm,其中,每个Ti又都是一棵树,并且称为根节点的子树。
树的定义是递归的,它表明了树本身的固有特性,也就是一棵树由若干棵子树构成而子树又由更小的子树构成。

1.二叉树

二叉树

1.1.二叉树的性质

若深度为k的二叉树有2^k-1个结点,则称为满二叉树
满二叉树
可以对满二叉树中的结点进行连续编号:约定编号从根结点起,自上而下、自左至右依次进行。
深度为k、有n个结点的二叉树当且仅当每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树
完全二叉树

1.2.二叉树的遍历

前序遍历:根节点->左子树->右子树(根->左->右)

中序遍历:左子树->根节点->右子树(左->根->右)

后序遍历:左子树->右子树->根节点(左->右->根)

二叉树遍历

三、图

3.1.图的定义

在图中,任意两个结点之间都可能有直接的关系,图中的一个结点的前驱结点和后继结点的数目是没有限制的。
有向图:所有边都有方向的图称为有向图。
无向图:图中每条边都是无方向
完全图:若一个无向图具有n个顶点,而每一个顶点与其他n-1个顶点之间都有边,则称之为无向完全图。

3.2.图的遍历

深度优先搜索DFS:
广度优先搜索BFS:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值