数据结构
CYD、孤狼
没有搞不定的,只有进行中的…
展开
-
数据结构与算法总结
1. 线性表数组实现 & 链表实现1.1 数组实现: 数组是一种大小固定的数据结构,对线性表的所有操作都可以通过数据来实现。当数组不能再存储新元素的时候,可以通过创建新数组的方式解决。1.2 链表实现 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列节点组成,这些节点不必在内存中...原创 2020-05-08 21:21:42 · 150 阅读 · 1 评论 -
堆的基本操作实现
一、堆的概念 堆数据结构是一种数据对象,它可以被视为一棵完全二叉树结构。 堆的二叉树存储是: 最大堆:每个父节点都大于其孩子结点; 最小堆:每个父节点都小于其孩子结点。二、堆的实现1.堆的结构体typedef struct Heap { HeapType data[HeapMaxSize]; ...原创 2018-05-15 15:14:11 · 653 阅读 · 0 评论 -
机器人的运动范围-----数据结构
题目:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向上、下、左、右移动一个格子,但不能进入进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(37,35),因为3+7+3+5 =18.但它不能进入方格(35,38),因为3+5+3+8=19.请问机器人能够到达多少个格子?测试用例: 1.格子全...原创 2018-05-22 09:23:29 · 769 阅读 · 2 评论 -
快速排序算法-----数据结构
快排基本思想: 在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终的位置上 (即归位一个元素),数据序列被此元素划分成俩部分:所有关键子比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分,这个过程称作一趟排序。以后对所有的俩部分分别重复上述过程,直至每部分内只有一个元素或空为止。简而言之,每趟使表的第一个元素放入适当位置,将表一分为二,对...原创 2018-05-22 13:12:43 · 252 阅读 · 0 评论 -
搜索二叉树的基本操作-----数据结构
本次的搜索二叉树基本操作包括搜索二叉树的初始化、搜索二叉树的插入(递归实现)、搜索二叉树的查找(递归实现)、搜索二叉树的结点删除(非递归实现)1. 搜索二叉树的结构typedef struct SearchTreeNode { SearchTreeType key; // 关键码 struct SearchTreeNode* lchild; struct SearchTree...原创 2018-05-15 22:56:15 · 348 阅读 · 0 评论 -
归并排序-----数据结构
归并排序的思路: 归并排序是通过“归并”这种操作完成排序的目的,将俩个或多个有序子表归并成一个子表。在归并排序中,此处将对二路归并进行分析。二路归并排序算法: 将俩个有序表直接归并为一个有序表的算法Merge(),设俩个有序表存放在同一个数组中的相邻位置上:arr[low,mid]和arr[mid+1,high],先将它们合并到一个局部的暂存数组arr1中,待合并完成后...原创 2018-05-22 16:15:51 · 124 阅读 · 0 评论 -
闭散列解决哈希冲突-----数据结构
闭散列解决哈希冲突闭散列(也称为开放地址法):一种解决哈希冲突的方法。应用场景: 对与闭散列的应用,我们可以举一个简单的实例:以函数为除留取余法的哈希函数进行构建哈希表,将会遇到剩余值相等的情况(如:有俩个关键字分别为2,1002,,最大范围为1000,则进行除模取余后,剩余值皆为2,此时就相当于出现了冲突),就是哈希冲突,本次我们将讨论解决冲突方法中的闭散列。闭散列就是,在满足可插...原创 2018-05-28 16:49:35 · 322 阅读 · 0 评论 -
开散列解决哈希冲突-----数据结构
开散列(也称为拉链法),也是解决哈希冲突的一类方法。应用场景: 当插入数值时,如遇到利用哈希函数对关键字进行分析时得到相同的哈希地址的情况,就需要相应的解决方法使具有相同哈希地址的不同关键字在允许插入的前提下都可以得到插入操作。拉链法就是将哈希地址的内容改为一个指针,将具有相同哈希地址的不同关键字串联起来。结构体: 对于该哈希表应该具有存储空间、存储大小和处理关键字的哈...原创 2018-05-28 17:29:01 · 132 阅读 · 0 评论 -
位图的基本操作-----数据结构
位图的基本操作 位图的出现在一定程度上降低了内存使用。应用场景: 当待处理数据超出内存处理范围时,将出现一系列的问题。此时,如果使用位图,就可以将内存的使用降至原使用内存大小的八分之一,极大程度的降低了内存不足所带来的诸多问题。位图初始化: 1.判断输入参数的非法性; 2.初始化结构体变量。代码:void BitMapInit(BitMap*...原创 2018-05-28 18:04:11 · 1673 阅读 · 0 评论 -
堆排序-----数据结构
堆排序,是对堆特性的充分利用。如果想要对数组进行升序排序,则可以创建大堆;如果想要对数组进行降序排序,则可以创建小堆。本次博客主要讲述数组的升序排序,对大堆的创建与删除操作。 大堆排序的原理:首先对数组进行调整使其具有大堆的特性(子结点的关键字值小于父结点的关键字值),对于大堆的创建,将会以俩种方法进行讲述(一、上浮式调整;二、下沉式调整)。上浮式调整: ...原创 2018-05-30 09:01:40 · 169 阅读 · 0 评论 -
冒泡排序-----数据结构
冒泡排序冒泡排序是算法排序中最基础的排序之一。排序思路:方法一:从后向前进行遍历,并进行相邻元素的比较,将较小元素放在较大元素之前,继续进行比较。每一轮比较结束后,都是 将基表数组中最小的元素,放置于本轮比较数组的最前面。方法二:从前向后进行比较,并进行相邻元素的比较,将较大元素放在较小元素的后面,继续进行比较。每一轮比较结束后,都是将比较数组中最大的元素,放置于本轮比较数组的最后面。本次,将于大...原创 2018-06-01 10:17:53 · 321 阅读 · 0 评论 -
选择排序-----数据结构
选择排序也是排序算法中 最基础的排序之一。排序思路: 1.当元素小于等于1时,无需对数组进行排序; 2.当数组元素个数大于1时,按从前到后的顺序对数组元素进行排序; 3.首先设置一个边界值bound = 0,bound相当于将 数组分成两个数组,一个为有序数组,另一个为无需数组; 4.在数组中查找最大的值,与下标为bound的数组元素进行交换...原创 2018-06-01 10:36:47 · 148 阅读 · 0 评论 -
希尔排序-----数据结构
希尔排序设计思路: 1.判断数组元素个数,若元素个数小于等于1,直接返回,无需进行排序; 2.若元素个数大于1,进行排序值(排序值的选取直接会影响排序的时间复杂度),此次将采用希尔序列; 3.设置gap = size/2,以后每轮轮换将gap降为原来gap的一半; 4.进入循环,将数组元素一gap为间隔距离进行分组,并对各组中元素进行排序; ...原创 2018-06-01 10:51:07 · 223 阅读 · 0 评论 -
插入排序-----数据结构
插入排序设计思路: 1.判断数组元素个数,如果数据元素个数小于等于1,无需进行排序,直接返回; 2.若数组元素个数大于1,设置边界下标值bound = 1,将整个数组分为俩个数组部分,一部分为有序数组,另一部分为无序数组; 3.再定义一个下标值cur = bound,将下标为cur的所指数组元素与有序数组的元素进行比较,在数组中找到合适的位置; ...原创 2018-06-01 11:14:26 · 132 阅读 · 0 评论 -
合并排序-----数据结构
归并排序设计思路:1.递归版本合并排序: a)判断数组元素个数,如果数组元素个数小于等于1,无需进行排序,直接返回; b)若元素个数大于1,进入递归函数,进行合并排序; c)进入递归函数后,判断传入数组元素个数,判断条件同上; d)若大于1,将数组分成俩个数据,分别进入递归函数; e)如果俩个数组的元素个数都小于等于1时,进行调...原创 2018-06-01 11:45:56 · 309 阅读 · 0 评论 -
快速排序-----数据结构
设计思路:1.交换式-快速排序a)判断数组元素个数,如果数组元素个数小于等于1,无需对数组进行排序,直接返回;b)若数组元素个数大于1,将数组的最右边的元素作为本次排序的基准值;c)定义俩个下标值,一个为开始位置下标left,另一个为最终位置下标right;d)保证left<right的前提下,查找一个大于基准值的元素 ,找到后停止本次查找 ;2.挖坑式-快速排序3.非递归快速排序交换式-快...原创 2018-06-01 12:43:57 · 307 阅读 · 0 评论 -
替换空格-----数据结构
题目: 请实现一个函数,把字符串中的每个空格替换成“%20”.例如,输入“We are happy.”,则输出“We%20are%20happy.”。背景: 在网络编程中,如果URL参数中特殊字符,如空格、‘#’等,则可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCLL码的俩位十六进制的表示。测试用例: ...原创 2018-05-21 18:43:49 · 140 阅读 · 0 评论 -
二维数组中的查找-----数据结构
题目: 在一个二维数组中,每一行都按照从左到右,递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输出这样的一个二维数组和一个整数,判断数组中是否包含该整数。测试用例: 提前写出测试用例这是一个不错的习惯,因为测试用例可以引导我们程序的编写与判断。 1.二位数组中包含查找的数字(最大值、最小值和中间值); 2.二维数组中不包...原创 2018-05-21 18:06:10 · 528 阅读 · 0 评论 -
栈和队列的操纵
程序代码:#include<stdio.h>#include<stdlib.h>//最小栈(俩种方法)#define queueMax 100//#define NodeType int //符合其他题#define NodeType char //符合匹配题typedef struct queue{ int data[queueMax...原创 2018-04-15 22:52:51 · 116 阅读 · 0 评论 -
迷宫的四重求解
程序代码:#include<stdio.h>#include<stdlib.h>#define ROW 6#define COL 6//Round1《使用递归的方法》typedef struct maze1{ int maze[ROW][COL];}Maze;//结点的建立typedef struct node{ int row; int col;}Node;//顺序栈的建...原创 2018-04-17 21:42:24 · 110 阅读 · 0 评论 -
基于链表的队列基本操作的实现
程序代码:#include<stdio.h>#include<stdlib.h>//#define SeqMax 1000#define SeqType chartypedef struct Node{ SeqType data; struct Node* next;}SeqNode;typedef struct link{ SeqNode* head; SeqNode* ...原创 2018-04-08 16:15:16 · 276 阅读 · 0 评论 -
带头结点的双向链表(1)
本次程序是 关于带头结点双链表的基本操作(插入、删除、查找):程序代码:#include<stdio.h>#include<stdlib.h>typedef char DLinkType; //定义参数类型typedef struct DLinkNode { //定义结点 DLinkType data; struct DLinkNode* next; struct DL...原创 2018-04-06 14:54:06 · 620 阅读 · 0 评论 -
带头结点双向链表的操作(2)
此次代码为对带头结点双向链表部分操作的函数实现:程序代码://对带头结点双向链表进行按元素删除void DLinklistErase(DLinkNode** head,DLinkType value){ DLinkNode * cur = (*head)->next; while(cur->data!=value&&cur!=(*head)){ cur...原创 2018-04-06 15:56:59 · 293 阅读 · 0 评论 -
栈的基本操作
本次程序是以实现栈的基本操作为目的(主要包括栈的初始化、入栈、出栈、取栈顶元素和销毁栈):程序代码:#include<stdio.h>#include<stdlib.h>#define SeqStackType char#define SeqMax 1000typedef struct{ SeqStackType data[SeqMax]; size_t size;}Seq...原创 2018-04-07 11:20:34 · 138 阅读 · 0 评论 -
基于顺序表的队列基本操作实现
程序代码:#include<stdio.h>#include<stdlib.h>#define SeqQueueType char#define SeqQueueMax 1000typedef struct Queue{ SeqQueueType data[SeqQueueMax]; size_t head; size_t tail; size_t size;} SeqQu...原创 2018-04-07 21:00:51 · 345 阅读 · 0 评论 -
链表的操作(2)
此次程序是链表操作中的几个函数的实现,包括(判断俩链表的相交、求俩链表的交集、拷贝复杂链表)1、判断俩个链表是否相交,但是链表可能带环程序代码:int HasCrossWithCycle(LinkNode* head1,LinkNode* head2){ if(head1->next==NULL||head2->next==NULL){ return 0; } Lin...原创 2018-04-06 12:02:17 · 242 阅读 · 0 评论 -
链表的部分操作(1)
本次代码是关于链表的部分操作:#include#include#define __NAME__ printf("\n--------%s----------\n",__FUNCTION__)typedef char LinkType;typedef struct LinkNode{LinkType data;struct LinkNode* next;}Li原创 2018-03-31 11:47:15 · 154 阅读 · 0 评论 -
链表的操作
链表的操作包括利用链表的插入运算建立线性链表,然后利用链表的查找、删除、计数、输出等运算反复实现链表的这 些操作(插入、删除、查找、计数、输出单独写成函数的形式。今天对链表的实现进行了代码的总结。代码如下:#include #includetypedef struct Node //节点的构造 {int data;struct Node *PNext;原创 2018-02-04 13:51:19 · 1184 阅读 · 4 评论 -
数据结构-----查找(知识点)
一、查找的基本概念1.1 查找的概念 查找的定义是:给定一个值K,在含有n个记录的表中找出关键字等于K的记录。若找到,则查找成功,返回该记录的查找信息或该记录在表中位置;否则返回失败,返回相关的知识信息。 采用何种查找方法的相关因素如下: i)使用那种数据结构来表示“表”,即表中记录是何种方式组成的。 ii)表中关键字的顺序,即对无需数据查找...原创 2018-05-12 23:48:51 · 2631 阅读 · 0 评论 -
数据结构-----二叉树的镜像实现
一、二叉树镜像的抽象描述: 关于二叉树中的镜像,用一个生活中的例子来说,就好比物体与其在镜子中的成像。二、二叉树镜像的思路分析 二叉树的镜像就好比将二叉树的各个结点的左右子树进行交换,如下图所示:由于二叉树是以递归的方式创建而得到,故此我们也可以以递归的方式进行二叉树镜像的建立。二叉树镜像的建立其实与二叉树的遍历大同小异,只是将其结点访问改写为对结点左右子树的交换。三、...原创 2018-05-06 18:12:26 · 369 阅读 · 0 评论 -
数据结构-----二叉树的非递归遍历
一、先序遍历(非递归)1.编程思路: 二叉树的非递归先序遍历相对与对栈 的一波操作:先判断根节点是否为空,若为空直接返回,不为空将进入以下判断,将根节点入栈,进入循环体;取栈顶元素,进行访问并对栈做出栈操作;(访问包括先将其右孩子入栈,再将其左孩子入栈,如孩子为空,则不进行入栈操作),以此方法进行循环,直至栈内无元素结束。原二叉树图:思维图如下所示:2.程序代码实现://非递归的先序...原创 2018-05-06 20:44:38 · 134 阅读 · 0 评论 -
二叉树的基本操作<1>-----四种遍历
//二叉树的操作实现#include<stdio.h>#include<stdlib.h>#include<string.h>typedef char TreeNodeType;//二叉树结点结构体typedef struct TreeNode{ TreeNodeType data; struct TreeNode* lchild; struct TreeNod...原创 2018-04-28 13:12:38 · 140 阅读 · 0 评论 -
二叉树的基本操作<2>
////根据先序遍历结果构造一棵树--“abd###c##”TreeNode* CreatTree(TreeNodeType cur[],size_t *index,size_t size,TreeNodeType null_value){ if(*index == size){ exit(0); } if(cur[*index] == null_value){ return NULL; } ...原创 2018-04-28 13:19:19 · 151 阅读 · 0 评论 -
希尔排序-----数据结构
一、希尔排序的基本思想 希尔(Shell)排序又称为缩小增量的排序,其基本思想是:把记录按下标的一定增量d分组,对每组记录直接插入排序方法进行排序,随增量的减小,所分成组包含的记录越来越多,到增量的值减少到1时,整个数据合成为一组,构成一组有序记录,则完成排序。注意:希尔排序算法中每一趟不产生有序区,也不一定将一个元素放置在最终位置上(即不一定将一个元素归位)。另外,...原创 2018-05-17 10:31:58 · 244 阅读 · 0 评论