数据结构总结

本文详细介绍了数据结构的概念,包括非数值型数据、数据的逻辑结构(如集合、线性、树状、图状)和存储结构(顺序存储、链式存储、索引存储、哈希存储)。重点讨论了顺序存储和链式存储的操作,如创建、插入、删除和显示,并涉及到了栈和队列的特性及操作。此外,还提到了二叉树、图的表示以及算法的时间复杂度和空间复杂度。

数据:操作的非数值型的数据,图像,视频,声音

结构:数据所对应的结构,数据的组成

数据结构:研究的是非数值型的数据的组成(逻辑结构、存储结构)

逻辑结构:抽象的结构,数据的实体的结构

集合:数据元素与数据元素之间除了同属一个集合外没有任何关系

线性:1对1的关系 线性表

树状:1对n的关系 二叉树

图状:n对m的关系 网

存储结构:数据在计算级中怎么存储

(重点)顺序存储:

(重点)链式存储:

索引存储:

(了解)哈希存储:

学习数据结构:

c语言:如何去写代码

数据结构:更高效的去写代码

超市管理系统:data_type;

typedef strucut shop

{

int code[20];//条形码

float p;//价钱

char name[20];//商品的名字

char day[20];//保质期

int count;//库存

}data_type;

typedef struct stu //学生管理系统

{

int code;//学号

float p;//绩点

char name[20];//名字

char day[20];//学院-班级

int count;//年龄

}data_type;

数据结构的操作

创建、增、删、改、查、销毁

数据结构:

对数据做分析(逻辑结构),去实现(存储结构),然后让程序对这个数据进行操作(创建、增、删、改、查、销毁)。算法!!!

线性结构(一对一):

顺序存储


特点:存储空间连续,大小固定,表满不能存,表空不能取

顺序表的特点:

(1)逻辑上相邻的元素ai,ai+1,其存储位置也是相邻的;

(2)对数据元素ai的存取为随机存取或按地址存取。

(3)存储密度高。存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占的空间)。


定义顺序表

#define N 5

typedef int data_type; //int----->data_type

typedef struct list

{

data_type arr[N];//空间连续,大小固定

int count; //存当前表中有多少个元素

}List;

创建顺序表:

#include <stdlib.h> //malloc的库

List *pList = NULL;//防止野指针的出现

pList = (List *)malloc(sizeof(List));

往顺序表中插入元素:

显示顺序表中的元素:

顺序表的删除元素:

顺序表的销毁:

Makefile:

链式存储:

单链表的分类:

是否带头节点

是否是循环的

【带头节点的不循环单链表】

单链表的定义:

单链表的创建:

给单链表插入数据:

显示链表:

单链表的删除元素:

单链表的销毁:

单链表的逆置:

双链表:

双链表的创建:

受限的线性表:

栈和队列:

栈:特点:先进后出(FILO),只允许在栈顶操作

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为“栈顶”,另一固定端成为“栈底”,当栈中没有元素时称为“空栈”。

顺序存储:

栈的定义:
栈的创建
入栈(push):

if(top ==N-1)//满栈

return;

top++

arr【top] = item;

出栈(pop):

if(-1 ==top)//空栈

return;

item = arr[top];

top--;

链式存储:

单链表的入栈和出栈就是单链表的头插/头删

队列:

特点:先进先出(FIFO),只允许在队尾插入,在对头删除

队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”,当线性表中没有元素时,称为“空队”。

顺序存储:

队列的定义:

循环队列:

队列的创建:

入队:

出队:

显示:

链式存储:

1+2+3.....+100

(1+100)*100/2 1

100 100

树状(一对多):

什么是树:

树是n(n≥0)个节点的有限集合T,它满足两个条件:

有且仅有一个特定的称为根(Root)的节点;

其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、......\Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。


树的度数:

一个节点的子树的个数称为该节点的度数,一棵树的度数是指该树中节点的最大的度数。

叶子节点:


度数为零的节点称为树叶或终端节点,度数不为零的节点称为分支节点,除根节点外的分支节点称为内部节点。

高度:


节点的层数等于父节点的层数加1,根节点的层数定义为1.树中节点层数的最大值称为该树的高度或深度。

二叉树:

二叉树是n(n≥0)个节点的有限集合,它或者是空集(n = 0),或者是由一个根节点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。二叉树与普通有序树不同,二叉树严格区分左孩子和右孩子,即使只有一个子节点也要区分左右。

父亲节点,兄弟节点:

性质:

顺序存储:

满二叉树,完全二叉树:

malloc(2^4-1);从上往下,从左往右,依次存入顺序表中。优点:读取数据方便。缺点:占空间很大!

链式存储:

二叉树的定义:

二叉树的创建:

二叉树的插入:

不带头节点的插入方式:

二叉树的遍历:

二叉树的销毁:

逐个销毁每个节点

哈夫曼树:


线索二叉树:


有向图,无向图:

图的顺序存储:

用二维数组(邻接矩阵)来存:

对有向图的顺序存储:

对无向图的顺序存储:

图的链式存储:


算法:


什么是算法:

算法(Algorithm)是 一个有穷规则(或语句、指令)的有序集合,它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。

算法的特性:


①有穷性————算法执行的步骤(或规则)是有限的;
②确定性————每个计算步骤无二性;
③可行性————每个计算步骤能够在有限的时间内完成;
④输入————算法有一个或多个外部输入;
⑤输出————算法有一个或多个输出。

算法的评估标准:


消耗时间的多少(时间复杂度)
消耗存储空间的多少(空间复杂度)
容易理解、容易编程和调试、容易维护。(友好性)

时间复杂度:

空间复杂度:

(字节对齐);

位域:

常见的查找算法:


按操作对象来分:

线性结构:

顺序查找:

一个一个比。

拆板查找(二分查找)
  1. 有序

  1. 顺序表

分块查找:

块与块之间有顺序,块内的元素无顺序。

树形结构:

二叉排序树:

与插入类似:逐个比较结点的值,大于的往右子树跑,小于的往左子树跑,等于的话,就是找到了。

哈希存储:


根据数据本身,直接就是数据的地址

构造哈希函数:

直接地址法:

保留除数法(质数取余法):

设Hash表空间长度为m,选取一个不大于m的最大质数p,令:HashFunc(key) = key%p

冲突:

表示某地址j∈[0,m-1]中已存放有记录,而另一个记录的H(key)值也为j。处理冲突的方法一般为:在地址j的前面或后面找一个空闲单元存放冲突的记录,或将相冲突的诸记录拉成链表等等。

解决冲突:

加1:

多重哈希法:

链地址法:

哈希表的插入:

哈希表的查询:

代码:

任意数转二进制

把最右边的1变为0,-1&它本身

常见的排序算法:

内部排序:

冒泡排序:

选择排序:

快速排序:

快速排序是公认的排序之王,快速排序是Hoare在1962年提出的一种二叉树结构的排序算法,他是一种交换排序,基本思想为:

任取待排序元素中俄某元素作为基准值key,按照该基准值将待排序的序列分为两个子序列,左边子序列的值都小于基准值,右边则都大于基准值,然后左右序列重复该过程(递归),直到所有元素都排列在相遇的位置上为止。

递归:
  1. 要有退出的情况(要能退出);

  1. 每一个运行,都靠近我的退出条件;

插入:(新的)

直接插入:

外部排序:

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值