自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 数据结构19:二分查找与哈希查找

摘要: 查数据无论是在生活中还是在计算机中都十分常见。常见的查找算法有顺序查找,二分查找和哈希查找。

2022-06-09 13:58:10 873 1

原创 数据结构18:Prim算法和Dijkstra算法

摘要: Prim算法和Dijkstra算法是最小生成树和单源最短路径问题里面两个十分经典的算法,并且在我们计算机行业应用十分广泛,是基础算法。所以我们一定要掌握。代码里面有很详细的注释,如果不能很好的看懂理解的话,建议跟着图多跟踪几遍...

2022-06-05 13:46:47 1045

原创 数据结构17:邻接表及其广度遍历

摘要: 邻接表是图的链式压缩存储,即我们只记录这个结点与哪些结点连通,没有连通的就不予记录。有N个结点就要用N个链表来存储他们的连通关系。一.代码块由于我们写的代码是由之前的二维数组图结构转化为邻接表结构,所以之前写的代码很大一部分用得上,我们先copy过来1)copy代码#define MAXSIZE 10int* visited; typedef struct graph{ int** connections; int numNodes;}*graphPtr;typedef

2022-05-30 20:58:25 595

原创 数据结构16:图及其遍历

摘要: 图在我们生活中很常用到,树其实就是一中特殊的图。我们本次讲到图在计算机里面的一种存储方式:布尔矩阵(即二维数组)。图,几乎上综合了我们前面学的所有数据结构,比如二维数组,栈,队列,树的相关操作(遍历)以及链表(这里没用到链表,下一次我们讲图的邻接表存储会用到)。所以如果你对以前的数据结构都掌握得不错的话,写起来就比较轻松,如果对以前的数据结构掌握有所欠缺的话,那就难了。上代码!一.代码块1)结构体定义这个visited数组是用来记录某位置是否被访问过了,为什么要记录呢,因为图不像二叉树那样

2022-05-30 19:19:19 534

原创 数据结构15:N皇后问题

摘要: N皇后问题是指将 N个皇后放在 N×N的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这个代码实际上比较考验我们对递归的理解,用到了回溯的方式解决N皇后问题。虽然代码不长,但需要我们真的看透还是有一定难度一.全部代码#include <stdio.h>#define N 20 int q[N];//这里是参照了陈青山同学的,在前面定义数组每个函数都能用int isPlace(int k, int j){ i

2022-05-29 21:24:06 373

原创 数据结构14:哈夫曼树的创建和编码

摘要: 哈夫曼树是十分重要的,常用于压缩的编码和解码。但写起来也比较折磨。迟到的代码,实在抱歉。上代码!一.代码块其实由于哈夫曼树结点的度要么为0,要么为2,并且输入的编码的元素必为叶节点,所以n个元素也就是n个叶节点的哈夫曼树必为2n-1个总结点。知道了结点个数,我们肯定更喜欢用顺序存储(数组)来存储哈夫曼树,而孩子和双亲则类似于静态链表,用下标代替地址1)结构体定义typedef struct huffmanTree{ char data; int weight; int lchil

2022-05-29 16:08:18 3950 3

原创 数据结构13:二叉树及其遍历

摘要: 二叉树是树的特例,即每一个元素最多只能有两个分支。二叉树是十分重要的,一般的树都可以由二叉树转换过去并且一一对应。所以在我们熟练掌握二叉树之后,才能对一般的树进行操作。今天我们会讲到二叉树的深度遍历、用层次遍历录入元素和用层次遍历输出元素。一.代码块1)创建对于二叉树,我们一般都是用链式存储,顺序存储的话会造成很多空间的浪费#define MAXSIZE 5//对于二叉树,我们一般都是用链式存储,顺序存储的话会造成很多空间的浪费 typedef struct BTNode{ ch

2022-05-24 17:18:32 185

原创 数据结构12:压缩矩阵的转置

摘要: 事实上在很多时候呢,我们经常会碰到的矩阵实际上是稀疏矩阵,就是这个矩阵只有很少的地方有数据,其余地方全部为0,不存放数据的。这个时候的话如果要以原来的方式进行存储的话,就会导致很多空间的浪费,和运算的时间复杂度变高。像这种情况我们通常会使用压缩矩阵,即构建一个列数为3,行数为有效数据个数的矩阵,第一列存放有效数据在原来矩阵的行数,第二列存放有效数据在原来矩阵的列数,第三列存放有效数据的值。如下图今天我们主要实现的函数是压缩矩阵的转置,代码并不是很难,但是下标,值什么的会非常绕,建议画图举例跟踪

2022-05-19 10:57:47 398 1

原创 数据结构11:二维数组与矩阵乘法

摘要: 二维数组在我们学习c语言的时候遇到过,现在我们来试试用数据结构对二维数组进行操作,并且顺便看看c语言是如何给二维数组分配空间的一.代码块1)创建这里分为了静态和动态两个写法,由于静态操作比较简单,我们后续的函数用的动态。#define ROWS 4#define COLUMNS 5/*这种用一个指针指向一个地址表示一个数组的方式我们之前都用过了,可以体现出动态性,不过要给他动态分配空间,不然就只有一个首地址,没有结尾了。这里要表示二维数组,就用两个*号就可以了*/ typedef

2022-05-18 20:50:40 988 1

原创 数据结构10:顺序循环队列

摘要: 在我们已知队列的最大长度时,可以使用顺序表来进行队列的相关操作。但是,顺序队列会有一个较大的问题,即数组的“假”溢出。我们画一个图来看一下。我们注意到,在出队操作后,数组其实是还有空间的,但是由于顺序表的单向性,rear指针已经指向了最后,代表了数组空间满了。这就是数组的“假”溢出现象。对于,我们就可以用到今天要讲的顺序循环队列,实现队该数组空间的最大利用。图示如下这就很好了,循环队列rear可以回到前面,假溢出现象就不复存在了,最大化的利用数组空间一.代码块是这样,由于rear要指向数

2022-05-18 19:17:51 936 1

原创 数据结构09:链队列

摘要:队列这种数据结构相较于栈就在我们生活中就更加地常见了。其操作方式就像我们生活中的排队一样“先进先出,后进后出”。与栈一样队列也可以分别用链表和顺序表实现,具体用那种就要看我们的实际需求了。其操作呢其实就是线性表特殊的插入与删除操作。与线性表有点不一样的时,我们添加了尾指针,让我们在进行入队操作时的时间复杂度更低。链队列一.代码块1)创建typedef struct linkNode{ int data; struct linkNode *next;}*linkNodePtr;typ

2022-05-16 21:32:00 213 2

原创 数据结构08:栈与递归

摘要:递归是我们的老朋友了,无论是程序设计基础课程还是离散结构课程都讲到过它,但这一次学了栈之后再来体会系统是怎么处理我们的递归函数的。一.代码块1)累加的递归实现实际上,递加或阶乘递归确实是我们接触的最简单的递归函数了,递归的本质就是一直访问要求函数的上一个函数值,例如要求addTo(3),就访问到addTo(2),用addTo(2)+3就请求到addTo(3)的值了,依此类推。值得注意的是,我们在用递归的时候,一定要写好终止条件,不然递归函数会一直调用本身。int addTo(int para

2022-05-11 21:06:00 445 1

原创 数据结构07:栈的应用(表达式求值)

摘要:表达式求值是对栈的一个进阶应用,巧妙地运用了栈的特性,创建了两个栈,一个存放数值,一个存放运算符。看懂这个代码,我们就会对栈的理解更进一步。实际是这个代码是不好写的,我参考了教材相关内容及其他同学的代码后,才理解并写出以下代码。由于栈的基本操作等已经在前文说过,这里先只展示有关表达式求值的函数一.代码块1)判断优先级函数char priority(char ch1,char ch2){ //对于优先级的判定,我在书上找到了一个表。对此用二位数组实现比较方便 //书上是添加一个#号代

2022-05-10 19:53:36 1071

原创 数据结构06:栈及其简单应用

摘要:栈是一种新的数据结构,在我们生活中其实也有很多,只是我们没有关注。栈可以形象为一个 ,秉承着“先进后出,后进先出”的原则。栈相较于之前的链表较为简单,但其应用十分广泛。一.代码块1)创建2)初始化3)打印4)压栈5)出栈6)压栈出栈测试函数7)括号匹配(栈的简单应用)8)二.图示三.全部代码四.运行结果...

2022-05-09 21:03:19 585

原创 数据结构05:多项式的加法

摘要:多项式的加法是对单链表的一个基础应用(虽然名字带基础的都不太基础)。这对我们来说具有一定的难度,所以我用了很多时间来画图跟踪老师的代码,然后我发现了老师代码的较大的漏洞(我十分相信这是老师的小失误哈哈哈哈)具体是什么情况呢,先上老师的代码一.代码块1)老师的代码#include <stdio.h>#include <malloc.h>/** * Linked list of integers. The key is data. The key is sorte

2022-05-04 23:04:26 1714 1

原创 数据结构04:静态链表

摘要:事实上,静态链表可以让我们更好地理解空间分配机制。由我们对一片空间来进行分配管理,如我们在链表中就用到了int *used来检查这篇空间是否被占用,模拟操作系统是如何判断一片空间是否被占用。再者,我们对于静态链表的地址模拟选用了整型int next,用next来代表下一个访问数据的下标,实际上下标其实对于数组来说就是他的地址,我们有了地址就可以访问到对应地址存放的数据。这个东西对应的就是单链表的next,只不过单链表的next是操作系统分配给我们的真实地址,我们的目的就是模拟。其实对于后续的插入,

2022-05-03 13:56:27 681

原创 数据结构03:双向链表

摘要:在我们对单链表有一定认识并且掌握后,双链表其实是非常简单的,就是加了一个指向前一个结点的指针*previous,在我们进行插入删除等基础操作时,对比单链表只需要增加对previous的操作,稍加思考我们就可以比较容易的实现,所以我在看了老师的代码后跟着写了一个,代码里并没有太多注释。如有不懂的地方可以参考我以前单链表的文章,里面有十分详细的中文注释。一.代码块1)创建链表typedef struct doubleLinkedList{ char data; struct doubleLin

2022-05-02 22:02:05 354 1

原创 数据结构02:单链表

一.各个函数的代码1)链表的创建typedef struct LinkNode{ char data; //数据域 struct LinkNode *next; //指针域 } LNode,*LinkList,*NodePtr; //取不同的名字利于代码可读性 并且如果在此申明了*号,后续引用时不用写*只写NodePtr和LinkList也是指针变量 2)链表的初始化LinkList initLinkList() //链表的初始化 { NodePtr tempHeader = (N

2022-04-28 10:58:19 938

原创 数据结构01:顺序表

顺序表是我们十分常用且常见的自主完成的三个函数及其测试:int locateElement(SequentialListPtr paraListPtr, int paraValue) { int i; for (i = 0; i < paraListPtr->actualLength; i ++) { if (paraListPtr->data[i] == paraValue) { return i; } } //直接每个一一对比就好了,没找到自然返回-1

2022-04-25 22:05:46 610

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除