数据:操作的非数值型的数据,图像,视频,声音
结构:数据所对应的结构,数据的组成
数据结构:研究的是非数值型的数据的组成(逻辑结构、存储结构)
逻辑结构:抽象的结构,数据的实体的结构
集合:数据元素与数据元素之间除了同属一个集合外没有任何关系
线性: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)是 一个有穷规则(或语句、指令)的有序集合,它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。
算法的特性:
①有穷性————算法执行的步骤(或规则)是有限的;
②确定性————每个计算步骤无二性;
③可行性————每个计算步骤能够在有限的时间内完成;
④输入————算法有一个或多个外部输入;
⑤输出————算法有一个或多个输出。
算法的评估标准:
消耗时间的多少(时间复杂度)
消耗存储空间的多少(空间复杂度)
容易理解、容易编程和调试、容易维护。(友好性)
时间复杂度:

空间复杂度:
(字节对齐);
位域:

常见的查找算法:
按操作对象来分:
线性结构:
顺序查找:
一个一个比。
拆板查找(二分查找)
有序
顺序表



分块查找:
块与块之间有顺序,块内的元素无顺序。
树形结构:
二叉排序树:
与插入类似:逐个比较结点的值,大于的往右子树跑,小于的往左子树跑,等于的话,就是找到了。
哈希存储:
根据数据本身,直接就是数据的地址

构造哈希函数:
直接地址法:
保留除数法(质数取余法):
设Hash表空间长度为m,选取一个不大于m的最大质数p,令:HashFunc(key) = key%p
冲突:
表示某地址j∈[0,m-1]中已存放有记录,而另一个记录的H(key)值也为j。处理冲突的方法一般为:在地址j的前面或后面找一个空闲单元存放冲突的记录,或将相冲突的诸记录拉成链表等等。
解决冲突:
加1:

多重哈希法:
链地址法:




哈希表的插入:


哈希表的查询:


代码:




任意数转二进制

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

常见的排序算法:
内部排序:
冒泡排序:
选择排序:
快速排序:
快速排序是公认的排序之王,快速排序是Hoare在1962年提出的一种二叉树结构的排序算法,他是一种交换排序,基本思想为:
任取待排序元素中俄某元素作为基准值key,按照该基准值将待排序的序列分为两个子序列,左边子序列的值都小于基准值,右边则都大于基准值,然后左右序列重复该过程(递归),直到所有元素都排列在相遇的位置上为止。
递归:
要有退出的情况(要能退出);
每一个运行,都靠近我的退出条件;


插入:(新的)
直接插入:
外部排序:


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





