
数据结构
lk小强
水滴穿石,一步一个脚印成长为大神
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据结构之线性表——链表的链式存储(链式描述)
linklist.h头文件#ifndef _LINKLIST_H_ #define _LINKLIST_H_ //将数据的类型分离,相当于句柄typedef void LinkList;//链表的句柄 //节点指针域定义typedef struct _tag_LinkListNode{ struct _tag_LinkListNode *next;}LinkListNode;...原创 2018-03-15 14:03:45 · 226 阅读 · 0 评论 -
C++递归算法
C++递归算法:我的理解//递归算法,总结起来具有以下几个特点://特点1 它有一个基本部分,即直接满足条件,输出//特点2 它有一个递归部分,即 通过改变基数(即n),来逐步使得n满足基本部分的条件,从而输出//特点3 在实现的过程中,它采用了分治法的思想://即将整体分割成部分,并总是从最小的部分(基本部分)开始入手(输出),//其背后的原理在于 当整体递归到部分时,会保留整体...原创 2018-05-13 17:25:07 · 847 阅读 · 0 评论 -
数据结构-前序,中序 后续序历算法(c语言)
#include <stdio.h>#include <stdlib.h>#include <string.h>//二叉链表示法typedef struct BiTNode{ int data;//数据域 struct BiTNode *lchild;//指针域,存放指向左孩子的指针 struct BiTNode *rchild;//指针域,存...原创 2018-04-29 17:14:54 · 1076 阅读 · 0 评论 -
线性表的顺序存储设计与实现(C语言版本)
//向一个线性表list的pos位置处插入新元素nodeint SeqList_Insert(SeqList* list, SeqListNode* node, int pos){ int ret = 0; //1 缓存下来 进行操作 TSeqList *tmp = NULL; if (NULL == list || NULL == node || pos < 0) { r...原创 2018-05-14 21:36:00 · 737 阅读 · 0 评论 -
串的数据结构表——顺序串与链式串(C语言版)
#include<stdio.h>#include<stdlib.h>#define MAXSIZE 100//串的顺序存储typedef struct st{ char *ch; //串存放的起始地址,串中第i个字符存储在ch[i-1]中 int length; //串的长度 int strsize; //分配的存储空间的大小...原创 2018-05-26 10:29:41 · 4070 阅读 · 0 评论 -
线性表的链式存储设计与实现(C语言版本)
#include <stdio.h>#include <stdlib.h>typedef struct PStudent{ int sid; char name[100]; char sex;}*Student,STU;//Student===> struct PStudent* STU等价于struct PStudent void main(...原创 2018-05-16 09:43:40 · 612 阅读 · 0 评论 -
循环链表的存储设计与实现以及利用循环链表解决约瑟夫问题实现(C语言版本)
循环链表插入元素的思想图:尾插法时候,有点不一样:需要处理循环链表1、基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素 循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。 ...原创 2018-05-16 15:26:31 · 706 阅读 · 0 评论 -
数据结构复习笔记— —队列(C语言版)
基本概念队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。顺序队列建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元...原创 2018-05-23 16:12:14 · 286 阅读 · 0 评论 -
循环队列的存储设计实现(C语言版)
1.概念 为充分利用向量空间,克服顺序存储结构的"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。 循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==...原创 2018-05-24 14:54:25 · 2457 阅读 · 0 评论 -
二叉树的遍历
1、前序遍历:先访问根结点、然后遍历左子树,最后遍历右子树;并且,在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。前序遍历图4可得:ABCDFHEG。2、中序遍历:先遍历左子树、然后访问根结点,最后遍历右子树;并且,在遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右子树。中序遍历图4可得:BAFHDCGE。3、后序遍历:先遍历左子树、然后遍历右子树,最...原创 2019-02-08 22:16:22 · 282 阅读 · 0 评论 -
数据结构常见知识点
排序1、交换排序(1)冒泡排序法,在最坏的情况下,冒泡排序需要比较次数为n(n-1)/2。(2)快速排序法 ,在最坏的情况下,快速排序需要比较次数为n(n-1)/2。2、插入类排序法:(1)简单插入排序法,最坏情况需要n(n-1)/2次比较;(2)希尔排序法,最坏情况需要O(n1.5)次比较。(大写O是算法复杂度的表示方法)3、选择类排序法:(1)简单选择排序法,最坏情况需要n(n...原创 2019-02-08 22:22:47 · 744 阅读 · 0 评论 -
一棵二叉树中总共有70个叶子结点与80个度为1的结点,则该二叉树中的总结点数为多少个?
二叉树就是说一个结点下面可能有两个子结点(度为2),也可能有一个子结点(度为1),或者没有子结点(度为0,也叫叶子结点)那么在这棵树中只可能出现三种情况:度为2,度为1,度为0(叶子结点)。不可能出现其他情况,否则就不是二叉树了。所以,总结点数应该为三者之和。已经知道:度为0=70,度为1=80度为2=度为0-1=69(这是公式,原因说起来太麻烦,你自己画个图可能会更清楚。如下图)所以...原创 2019-02-10 00:09:34 · 11264 阅读 · 0 评论 -
链表--如何从链表中删除重复数据
链表–如何从链表中删除重复数据方法一思路:遍历链表,将链表中的数据存储到HashTable中,若当前遍历的数据在HashTable中存在,说明这个数据重复,可以将这个数据删除掉。优点:时间复杂度较低。缺点:空间复杂度高,要申请额外的空间。/** * 遍历链表,将链表中的数据存储到HashTable中,若当前遍历的数据在HashTable中存在,说明这个数据重复,可以将这个数据删...原创 2019-06-03 21:14:57 · 7454 阅读 · 2 评论 -
理解单链表的反转(java实现)
遍历法遍历法就是在链表遍历的过程中将指针顺序置换//如何实现链表的反转 public static Node ReverseIteratively(Node head){ Node pre = null; Node next = null; while (head != null) { next = head.n...原创 2019-06-11 14:39:28 · 27074 阅读 · 8 评论 -
如何从尾到头输出单链表
package linklist;import org.junit.Test;import java.util.Hashtable;/** * 明白头指针与头结点的区别: * 头结点,放在第一个元素结点之前,其数据域一般无意义(存放链表长度) * 头指针:链表中指向第一个结点的指针 * @author kankan * @creater 2019-06-01 7:56 */...原创 2019-06-11 14:48:32 · 1879 阅读 · 0 评论 -
判断链表是否有环
//判断链表是否有环 public static boolean IsLoop(Node head){ Node fast = head; Node slow = head; if (null == fast){ return false; } while (fast != null &...原创 2019-06-11 15:49:55 · 641 阅读 · 0 评论 -
寻找链表环的入口
(寻找链表环的入口)题解:这个连同I都是很经典的题啦,刷CC150时候就折磨了半天。其实就推几个递推公式就好。。首先看图(图引用自CC150):从链表起始处到环入口长度为:a,从环入口到Faster和Slower相遇点长度为:x,整个环长为:c。明确了以上信息,就可以开始做运算了。。假设从开始到相遇,Slower走过的路程长为s,由于Faster的步速是Slower的2倍,那么Fas...原创 2019-06-11 16:53:12 · 14782 阅读 · 4 评论 -
数据结构之时间.空间复杂度分析
#include <iostream>#include <assert.h>using namespace std;/*在很多数据结构的面试题中看似简单,但是对题目的要求却挺高,主要就体现在复杂度分析方面。复杂度又分为时间复杂度和空间复杂度。1.时间复杂度时间复杂度实际就是函数,函数计算执行的基本操作次数 .在进行时间复杂度分析时需注意:1)时间复...原创 2018-05-13 16:33:34 · 443 阅读 · 0 评论 -
数据结构-第九章排序
/*冒泡排序的思想:不断的交换,通过交换完成最终的排序*/#include <iostream>using namespace std;void sort(int &a,int &b){ int tmp = a; a = b; b = tmp;}void BubbleSort(int *array, int array_length){ i...原创 2018-05-07 16:45:16 · 273 阅读 · 0 评论 -
栈的链式存储设计与实现(C语言版本)
栈的链式存储设计与实现1、基本概念//LinkList.h#ifndef _LINKLIST_H_#define _LINKLIST_H_//单链表的存储结构//结点中包含后继结点地址的指针域组成-可以理解为指向下一个结构体(结点)//(这里不包含数据域,是实现了 链表的api(链表的算法) 和 具体的数据分离)typedef struct _tag_LinkListNode{ ...原创 2018-05-18 15:17:19 · 379 阅读 · 0 评论 -
栈的链式存储结构设计与实现
与栈的顺序存储相同,栈的链式存储也是基于线性表的链式存储的基础之上完成对栈的设计。其中栈的链式存储部分参考点击打开链接栈的链式存储头文件://LinkStack.h#ifndef _LINKSTACK_H_#define _LINKSTACK_H_typedef void LinkStack;//栈的句柄//创建链式栈相当于创建一个链式线性表LinkStack* LinkStack_...原创 2018-03-22 14:09:53 · 895 阅读 · 0 评论 -
数据结构之线性表——中缀表达式和后缀表达式(栈的应用)
1 中缀表达式中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。举例:(3 + 4) × 5 - 6 就是中缀表达式3 4 ...原创 2018-03-22 14:33:31 · 445 阅读 · 0 评论 -
数据结构之线性表——就近匹配(栈的应用)
1 就近匹配几乎所有的编译器都具有检测括号是否匹配的能力,如何实现编译器中符号的成对检测?例如:检测如下一串代码:2 算法思路从第一个字符开始扫描,当遇见普通字符时忽略,当遇见左符号时压入栈中,当遇见右符号时从栈中弹出栈顶符号,并进行匹配,匹配成功:继续进入下一个字符;匹配失败:立即停止,报告错误。结束:成功,所有字符扫描完毕,且栈为空。失败:匹配失败或所有字符扫描完毕但栈非空。当需要检测成对出现...原创 2018-03-23 17:02:54 · 310 阅读 · 0 评论 -
数据结构之线性表——链表的顺序存储(数组描述)
1 线性表定义线性表(list)是零个或多个数据元素的集合,线性表中的数据元素之间是有顺序的,线性表中的数据元素个数是有限的,线性表中数据元素的类型必须相同。2 线性表数学定义线性表(linear list)也称为有序表(order list)。每一个实例都是元素的一个有序集合。每一个实例的形式为(e1,e2,e3,...,en-1),其中n为又穷自然数,ei是线性表的元素,i是元素ei的索引,n...原创 2018-03-23 23:05:18 · 576 阅读 · 0 评论 -
队列的顺序存储
Queue基本概念队列是一种特殊的线性表 队列仅在线性表的两端进行操作 队头(Front):取出数据元素的一端 队尾(Rear):插入数据元素的一端 队列不允许在中间部位进行操作!顺序链表的具体实现以及测试案例Seqlist.h 与Seqlist.c文件见上篇文章-链表的顺序存储//SeqQueue.h#ifndef _SEQQUEUE_H_#define _SEQQUEUE...原创 2018-03-24 15:24:01 · 448 阅读 · 0 评论 -
数据结构之线性表——链表的链式存储(链式描述)注释版
线性表的链式存储1、基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。 //LinkList.h#ifndef _LINKLIST_H_#define _LINKLIST_H_//节点的指针域typedef struct _tag_LinklListNode{ struct _tag_Lin...原创 2018-03-24 19:24:33 · 302 阅读 · 0 评论 -
数据结构之线性表——队列的链式存储
1 基本概念队列是一种特殊的线性表,也可以用线性表的链式存储来模拟队列的链式存储。链队列的表述如下图所示:2 链式队列存储的设计与实现其中链式队列的实现是基于链式链表设计的基础上实现的,链表的链式存储设计实现请参考上篇//LinkQueue.h#ifndef _LINKQUEUE_H_#define _LINKQUEUE_H_typedef void LinkQueue;//创建队列...原创 2018-03-24 21:59:18 · 249 阅读 · 0 评论 -
线性表的链式存储
线性表的链式存储的插入操作:线性表的链式存储的删除操作:链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。线性表链式存储的结构图链表的头文件://LinkList.h#ifndef _MYLINKLIST_H_#define _MYLINKLIST_H_typedef void LinkList;//链表的句柄...原创 2018-03-21 10:39:40 · 294 阅读 · 0 评论 -
二叉树的遍历-中序遍历非递归算法
中序 遍历的几种情况分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。分析2:为什么是栈,而不是其他队列。 先走到的后访问、后走到的先访问,显然是栈结构分析3:结点所有路径情况步骤1:结点的所有路径情况如果结点有左子树,该结点入栈;如果结点没有左子树,访问该结点;分析3:...原创 2018-04-30 17:14:14 · 336 阅读 · 0 评论 -
排序算法入门之冒泡排序优化
#include <stdio.h>#include <stdlib.h>#include <string.h>void swap(int *a, int *b);int main(){ int array[10] = { 15, 225, 34, 42, 52, 6, 7856, 865, 954, 10 }; int i, j;...原创 2018-05-01 21:26:20 · 186 阅读 · 0 评论 -
排序算法入门之简单选择排序
简单选择排序 简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。 在算法实现时,每一趟确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。我们可以通过设置一个变量min,每一次比...原创 2018-05-02 10:32:07 · 416 阅读 · 0 评论 -
双向链表的存储设计与实现(C语言版本)
双向链表的插入操作:双向链表的删除操作://DLinkList.h#ifndef _DLINKLIST_H_#define _DLINKLIST_H_//双向链表的存储结构//结点中包含后继结点的地址的指针域可以理解为指向下一个结构体(结点)//(这里不包含数据域,是实现了 链表的api(链表的算法) 和 具体的数据分离)typedef struct _tag_DLinkListNo...原创 2018-05-17 16:50:30 · 3528 阅读 · 0 评论 -
数据结构、算法与应用c++语言描述习题答案1
#include <iostream>using namespace std;//1.2/*问题1:使用实际函数调用发现,返回值并非数组的大小。调试发现,sizeof(num)在这里是指针num所占内存的大小,而非数组。解决1:通过查阅c++primer page187:c++中传递参数有两种,一种叫做值传递,一种叫做引用传递。值传递通过复制构造函数将实参的值拷贝到形参...原创 2018-05-11 17:26:20 · 5028 阅读 · 0 评论 -
栈的顺序存储设计与实现(C语言版本)
Stack基本概念栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端Stack的常用操作创建栈销毁栈清空栈进栈出栈获取栈顶元素获取栈的大小栈的顺序存储设计与实现1、基本概念//线性表顺序存储设计与实现测试框架//SeqList.h#ifndef _SEQLIST_H_#define _SEQLIST_H_typed...原创 2018-05-18 10:19:13 · 465 阅读 · 0 评论 -
判断两个链表是否相交以及如何找到它们相交的第一个结点
//判断两个链表是否相交 public static boolean isIntersect(Node node1,Node node2){ if ((null == node1) || (null == node2)){ return false; } Node tail1 = node1; whil...原创 2019-06-12 08:56:17 · 271 阅读 · 0 评论