数据结构_学习笔记
美好的春节假期结束啦,跟着笔者一起学习数据结构🤪,不要开小china🤘
第 1 章 - 引论
1.1 基本术语
-
数据
- 数据是指能够输入到计算机中,并能被计算机处理的一切对象。对计算机科学而言,数据的含义极为广泛,如整数、实数、字符、文字、图形、图像和声音等都是数据。
-
数据元素(Data Element)
- 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。但它还可以分割成若干个具有不同属性的项(字段)。数据元素一般由一个或多个数据项组成。
-
数据项(Data ltem )
- 数据项是具有独立意义的最小数据单位,是对数据元素属性的描述。
-
数据类型(Data Type)
- 数据类型是一-组性质相同的值的集合以及定义于这个值的集合,上的一组操作的总称。
- 每个数据项属于某一确定的基本数据类型
-
数据结构(Data Structure )
- 指数据元素之间的关系,按照某种关系组织起来,以一定的方式存储,并在这些数据上定义了一个运算的集合。
- 数据元素都不是孤立存在的,它们之间存在着某种关系,这种相互关系就称为结构,带有结构的数据对象称为数据结构。
1.2 数据的逻辑结构
1. 基本概述
2. 逻辑结构的数学定义方法
1.3 算法的描述
1. 算法的简介
2. 算法的性质
3. 算法的设计要求
4. 算法的评价
1.4 本章小结
第 2 章 - 线性表
2.1 线性表_基本概述
2.1.1 线性表_定义
2.1.2 线性表_特点
2.2 线性表的顺序存储结构及其算法
2.2.1 顺序存储结构_概述
2.2.2 顺序存储结构_定义
C语言版本
2.2.3 顺序表_插入运算
-
定义顺序表结构 #include <stdio.h>
#define MAXLEN 100
typedef int Elemtype;
typedef struct
{
Elemtype List[MAXLEN];
int length;
} SqList;
-
插入操作代码
int insertsqlist(int i, Elemtype x, SqList *sql)
{
int j;
if ((i < 1) || (i > sql->length))
{
return 0;
}
else
{
for (j = sql->length; j >= i; j--)
sql->List[j + 1] = sql->List[j];
sql->List[j + 1] = x;
(sql->length)++;
return 1;
}
}
-
图文并茂讲解 -
顺序表的插入效率贼低
2.2.4 顺序表_删除运算
-
定义顺序表结构 #include <stdio.h>
#define MAXLEN 100
typedef int Elemtype;
typedef struct
{
Elemtype List[MAXLEN];
int length;
} SqList;
-
顺序表_删除操作
int delsqlist(int i, SqList *sql)
{
int j;
if ((i < 1) || (i > sql->length))
{
return 0;
}
else
{
for (j = i + 1; j <= sql->length; j++)
sql->List[j - 1] = sql->List[j];
(sql->length)--;
return 1;
}
}
-
图文并茂 -
顺序表的删除元素效率也是蛮低的
2.3 线性表的链式存储结构及其运算
2.3.1 链式存储结构_概述
2.3.2 链式存储结构_定义
C语言版本
2.3.3 链式存储结构_图介绍
2.3.4 单链表的创建(了解)
C语言版本
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
NODE *create()
{
NODE *head, *q, *p;
char ch;
int a;
head = (NODE *)malloc(sizeof(NODE));
q = head;
ch = '*';
printf("\nInput the list:");
while (ch != '?')
{
scanf("%d", &a);
p = malloc(sizeof(NODE));
p->data = a;
q->next = p;
q = p;
ch = getchar();
}
q->next = NULL;
return head;
}
2.3.5 单链表_查找
1. 按序号查找
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
NODE *find(NODE *head, int i)
{
int j = 1;
NODE *p;
p = head->next;
while ((p != NULL) && (j < i))
{
p = p->next;
j++;
}
return p;
}
2. 按给定值查找
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
NODE *locate(NODE *head, int x)
{
NODE *p;
p = head->next;
while ((p != NULL) && (p->data != x))
{
p = p->next;
}
return p;
}
2.3.6 单链表_插入
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
void insert(NODE *p, int x)
{
NODE *q;
q = malloc(sizeof(NODE));
q->data = x;
q->next = p->next;
p->next = q;
}
2.3.7 单链表_删除
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
} NODE;
void delete (NODE *head, int x)
{
NODE *p, *q;
q = head;
p = q->next;
while ((p != NULL) && (p->data != x))
{
q = p;
p = p->next;
}
if (p == NULL)
{
printf("%d not found.\n", x);
}
else
{
q->next = p->next;
free(p);
}
}
2.4 循环链表结构(了解)
2.4.1 循环链表结构_概述
2.5 双向链表结构
2.5.1 双向链表_概述
2.5.2 双向链表_插入
!
void insert(DUPNODE *p, DUPNODE *q) {
q->prior = p;
q->next = p->next;
p->next->proir = q;
p->next = q;
}
2.5.3 双向链表_删除
void delete(DUPNODE *p) {
p->prior->next = p->next;
p->next->prior = p->proir;
free(p);
}
第 3 章 - 栈与队列
3.1 栈_顺序存储
3.1.1 栈_相关概念
3.1.2 顺序存储栈_定义(代码)
3.1.3 初始化顺序栈
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int top;
} SqStack;
SqStack initStack_sq()
{
SqStack s;
s.top = -1;
return s;
}
3.1.4 取栈顶元素
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int top;
} SqStack;
int getTop_sq(SqStack *s, elementType *x)
{
if (s->top == -1)
{
return 0;
}
else
{
*x = s->data[s->top];
return 1;
}
}
3.1.5 进栈操作
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int top;
} SqStack;
int Push_sq(SqStack *s, elementType x)
{
if (s->top == MAXLEN - 1) {
return 0;
}
s->top++;
s->data[s->top] = x;
return 1;
}
3.1.6 出栈操作
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int top;
} SqStack;
int Pop_sq(SqStack *s, elementType *x)
{
if (s->top == -1) {
return 0;
}
*x = s->data[s->top];
s->top--;
return 1;
}
3.1.7 判断空栈操作
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int top;
} SqStack;
int Empty_sq(SqStack *s) {
return s->top == -1;
}
3.2 栈_链式存储
3.2.1 基本概述和链式存储栈_定义
3.2.2 链式存储栈_进栈
3.2.3 链式存储栈_出栈
3.3 队列_顺序存储
3.3.1 队列_相关概述
3.3.2 顺序队列_定义
#include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} SeQueue;
3.3.3 顺序队列_取头元素
-
C语言版代码 #include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} SeQueue;
int getFront_sq(SeQueue *q, elementType *x)
{
if (q->front == q->rear)
{
return 0;
}
else
{
*x = q->data[(q->front) + 1];
return 1;
}
}
?
3.3.4 顺序队列_入队
-
C语言版代码 #include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} SeQueue;
int Enqueue_sq(SeQueue *q, elementType x) {
if (q ->rear == MAXLEN - 1) {
return 0;
}
q->rear++;
q->data[q->rear] = x;
return 1;
}
3.3.5 顺序队列_出队
-
C语言版代码 #include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} SeQueue;
int Delqueue_sq(SeQueue *q, elementType *x)
{
if (q->rear == q->front)
{
return 0;
}
q->front++;
*x = q->data[q->front];
return 1;
}
3.4 循环队列【重点】
3.4.1 循环队列_概念
3.4.2 循环队列_入队
-
代码 #include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} CQueue;
int EnCqueue(CQueue *cq, elementType x)
{
if ((cq->rear + 1) % MAXLEN == cq->front)
{
return 0;
}
else
{
cq->rear = (cq->rear + 1) % MAXLEN;
cq->data[cq->rear] = x;
return 1;
}
}
-
图文讲解
3.4.3 循环队列_出队
-
代码 #include <stdio.h>
#define MAXLEN 10
typedef int elementType;
typedef struct
{
elementType data[MAXLEN];
int front, rear;
} CQueue;
int DelCqueue(CQueue *cq, elementType *x)
{
if (cq->rear == cq->front)
return 0;
else
{
cq->front = (cq->front + 1) % MAXLEN;
*x = cq->data[cq->front];
return 1;
}
}
-
图文讲解
3.4.4 循环队列_求元素个数
3.5 队列_链式存储
3.5.1 链队列_入队
3.5.2 链队列_出队
-
代码 #include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next
} NODE;
NODE *popqueue(NODE *front, NODE *rear, int *x)
{
NODE *p;
if (front != rear)
{
p = front->next;
front->next = p->next;
if (p->next == NULL)
rear = front;
*x = p->data;
free(p);
return rear;
}
}
-
讲解
第 5 章 - 树
5.1 树的基本概念
5.1.1 树的定义
5.1.2 树的相关术语
-
A结点是BCD结点的双亲,BCD结点是A结点的孩子 -
A结点有三个孩子,所以他的度为3,B结点下没有孩子,所以他的度为0,C结点度为2 -
树的度:将所有结点的度算出来,然后取最大的度,比如上图中最大的度是3 -
树的度决定了该树是几叉树,比如上图树的度为3,则该树是一个三叉树 -
根节点:无双亲,无兄弟 -
没有孩子的结点度为0,这样的结点也被称为***叶子结点或终端结点*** -
真祖先:E结点的真祖先是AC -
兄弟:***同一双亲的孩子***结点之间互为兄弟 -
树的层次、树的深度或高度
5.2.3 树_双亲表示法
5.2.4 孩子-兄弟链表表示法
5.2 二叉树
5.2.1 二叉树_概念
5.2.2 二叉树_性质
5.2.3 满二叉树和完全二叉树
?
5.2.4 完全二叉树_性质
5.3 二叉树的存储结构【重要】
5.3.1 二叉树_顺序存储
5.3.2 二叉树_链式存储
5.4 二叉树的遍历【重要】
5.4.1 三种遍历
5.4.2 三种遍历_例题
先序遍历:A(B(CD))(E(F(GHK))) -> ABCDEFGHK
中序遍历:(B(DC))A(E((HGK)F)) -> BDCAEHGKF
后续遍历:((DC)B)(((HKG)F)E)A -> DCBHKGFEA
5.4.3 根据序列来画图
5.4.4 层次遍历
5.5 线索二叉树
5.6 二叉排序树【重要】
5.6.1 二叉排序树_概念和定义
?
5.6.2 二叉排序树_画图
5.7 树、森林与二叉树之间的转换
5.7.1 三叉树 -> 二叉树
5.7.2 二叉树 -> 三叉树
5.7.3 森林 -> 二叉树
5.8 哈夫曼树
5.8.1 哈夫曼树_概念
5.8.2 哈夫曼树_带权路径之和
?
5.8.3 哈夫曼树_画图
5.8.4 哈夫曼树_例题
5.8.5 哈夫曼树_电文题
第 6 章 - 图
6.1 图的基本概念
6.1.1 图的定义
6.1.2 完全图
6.1.3 子图
6.1.4 路径
6.1.5 连通图和强连通图
6.1.6 连通分量和强连通分量
6.1.7 度
6.1.8 权和网
6.2 图的存储结构
6.2.1 邻接矩阵【重点】
6.2.2 邻接表
6.3 图的遍历
6.3.1 基本概述
6.3.2 深度优先搜索
6.3.3 广度优先搜索
6.4 最小生成树
6.4.1 基本概述
6.4.2 普里姆算法(Prim)
6.4.3 克鲁斯卡尔算法(kruskal)
6.5 最短路径
6.5.1 基本概述
?
6.5.2 求最短路径
- 单源最短路径的时间复杂度为
O(n2) - 多源最短路径的时间复杂度为
O(n3)
6.6 拓扑排序(了解)
6.7 关键路径
第 7 章 - 查找
7.1 查找_基本概念
7.2 顺序查找
7.3 二分法查找
7.4 分块查找
7.5 散列表及其查找【重要】
7.5.1 散列表的概念
?
7.5.2 散列函数的构造方法
7.5.3 线性探测法解决冲突
7.5.4 散列法的平均查找长度
7.5.5 散列表_例题
?
第 8 章 - 排序
8.1 排序的基本概念
8.2 插入排序 - 直接插入
8.3 选择排序 - 简单选择排序
?
8.4 选择排序 - 堆排序
8.5 交换排序 - 冒泡排序
8.6 交换排序 - 快速排序
8.7 排序_小结
历时三天,完结撒花🌺,这几天每天只学5小时,属实过分了嗷,明天开始要早起!
|