
数据结构与算法
孙晨c
业精于勤,荒于嬉;行成于思,毁于随。
展开
-
数据结构之栈的定义、分类
线性结构的应用之一: 栈: 定义: 一种可以实现“先进后出,后进先出”的存储结构 分类: 静态栈 动态栈 算法: 出栈 压栈 应用: 1.函数调用:一个函数内部调用另外一个函数。例A函数内部调用了B函数,B函数内部又调用了C函数,则A函数地址会先进栈,其次是B,最后是C,所以C函数在...原创 2019-08-11 17:02:00 · 445 阅读 · 0 评论 -
数据结构之栈如何创建空栈、压栈、出栈、遍历、清空
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 typedef struct Node{ 6 int data;//数据域 7 struct Node * pNext; 8 }NODE,*PNODE;...原创 2019-08-12 18:40:00 · 2650 阅读 · 0 评论 -
数据结构之队列基本概念、循环队列【重点】
线性结构的两种常见应用之二: 队列 定义: 一种可以实现“先进先出”的存储结构,即“一端入,一端出”, 队首(front)出队,队尾(rear)入队(注:若front指向队首,则rear指向队尾最后一个有效元素的下一个元素;若rear指向队尾,则front指向队首第一个有效元素的下一个元素) 分类: 链式队列 --- 用链表实现...原创 2019-08-14 14:46:00 · 787 阅读 · 0 评论 -
数据结构中之循环队列程序演示
1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct Queue{ 5 int * pBase;//数组名就是第一个数组元素的地址 6 int front;//队首第一个元素下标 7 int rear;//队尾最后一个有效元素的下...原创 2019-08-14 19:19:00 · 247 阅读 · 0 评论 -
什么是递归【重点】
函数的调用: 当一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事: 1. 将所有的实际参数、返回地址(被调函数下一条语句的地址)等信息传递给被调函数保存 2. 为被调函数的局部变量(也包括形参)分配存储空间 3. 将控制转移到被调函数的入口 从被调函数返回主调函数之前,系统也要完成三件事: 1. 保存被...原创 2019-08-15 16:53:00 · 178 阅读 · 0 评论 -
什么是汉诺塔
汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。伪算法(重点理解):1 if( n>1 ){2 先把A柱子上的前n-1个盘子从A借助C移到...原创 2019-08-16 00:51:00 · 19420 阅读 · 0 评论 -
(使用文字表达)汉诺塔---出栈压栈过程如何实现
代码实现: 1 #include<stdio.h> 2 3 //函数的形参A、B、C不一定代表的是A、B、C柱子,递归传参的时候会变化! 4 void hanoit(int n,char A,char B,char C){ 5 if(n==1){ 6 //如果剩下一个盘子,直接将A柱上的盘子从A移到C(直接从初始塔移动...原创 2019-08-16 14:27:00 · 268 阅读 · 0 评论 -
使用文字表达二叉树的先序、中序、后序遍历的具体流程
二叉树操作: 一. 已知两种遍历序列求原始二叉树 二. 遍历: 1. 先序遍历(先访问根节点) 先访问根节点 再先序访问左子树 再先序访问右子树 访问左子树步骤: 1. 从根节点A开始 2. 访问A的左子树(以B为根节点的树) 3. 访问B的左...原创 2019-08-19 15:39:00 · 399 阅读 · 0 评论 -
数据结构中已知二叉树的两种遍历序列(已知先序和中序或者已知中序和后序),求原始二叉树
注意事项: 1. 只有通过先序和中序 或者 中序和后序,可以还原出原始的二叉树(确定一个二叉树) 2. 已知先后中序的任意一个序列 或者 先序和后序,都不能还原出原始的二叉树 已知先序和中序,求后序:思路:先序里面,最先出现的是根节点,所以A就是根节点中序里面,根节点A在中间,所以A的左边BDCE是左子树,A...原创 2019-08-20 14:42:00 · 171 阅读 · 0 评论 -
数据结构中链式二叉树具体程序演示
1 #include<stdio.h> 2 #include<malloc.h> 3 4 struct BTNode{ 5 char data;//数据域 6 struct BTNode * pLchild;//p是指针,L是左,child是孩子;即为左子树指针 7 struct BTNode ...原创 2019-08-20 22:36:00 · 133 阅读 · 0 评论 -
快速排序算法的详细讲解
五种常见排序就是:冒泡 插入 选择 快速排序 归并排序 排序和查找的关系:排序是查找的前提 排序是重点 在这里,快速排序,顾名思义,排序速度较快,但是较为复杂,但是递归这个思想,说简单但是也有些绕,说难也就几行代码的问题。快速排序(升序):先确定无序数组里的某一个元素在有序里的位置,这样就把数组分成两半无序数组每一半也按照之前的方法……递归思想...原创 2019-08-21 01:00:00 · 167 阅读 · 0 评论 -
结构体和类的区别是什么?
结构体和类的区别: 类里可以定义方法和属性,而结构体里只能有各种成员。为什么有结构体: 为了表示一些复杂的数据类型,而普通的基本类型变量无法满足要求。什么是结构体: 结构体是用户根据实际需要自己定义的复合数据类型。 1 #include<stdio.h> 2 #include<string.h> 3 struct ...原创 2019-07-27 17:58:00 · 352 阅读 · 0 评论 -
数据结构中malloc()动态分配内存是什么?
动态内存分配和释放: 动态构造一维数组: 假设动态构造一个Int型数组:1 int *p = (int *)malloc(int len);2 //还可以写作:3 int *p = (int *)malloc(sizeof(int)*len);4 int *p = (int *)malloc(sizeof(len));5 数据类型 *p = (数据...原创 2019-07-27 18:03:00 · 454 阅读 · 0 评论 -
数据结构中跨函数使用内存案例
1 #include<stdio.h> 2 #include<malloc.h> 3 struct student{ 4 int age; 5 }; 6 struct studnet * createStudent();//函数声明,创建学生年龄 7 void showstudent(struct studnet *);...原创 2019-07-27 18:04:00 · 132 阅读 · 0 评论 -
连续存储数组的算法(包含数组倒置、冒泡排序……)
线性结构【把所有的结点用一根直线穿起来】 连续存储【数组】、离散存储【链表】(不连续的,可分隔开来) 4 #include<stdio.h> 5 #include<malloc.h>//包含malloc函数 6 #include<stdlib.h>//包含exit函数 7 //定义了一个(复合)数据类型,名字叫stru...原创 2019-07-27 18:07:00 · 160 阅读 · 0 评论 -
typedef的用法
为数据类型取别名 1 #include<stdio.h> 2 3 typedef int i; //为int再重新多取一个名字,i等价于int 4 5 typedef struct student{ 6 int sid; 7 char sex; 8 }ST;//为struct student再重新多取一个名字为ST,下面...原创 2019-08-07 23:37:00 · 96 阅读 · 0 评论 -
链表如何定义以及确定一个链表需要几个参数?
离散存储【链表】 定义: N个节点离散分配 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后驱节点。 首节点没有前驱节点,尾节点没有后续节点专业术语: 首节点: 第一个存放有效数据的节点(有效节点) 尾节点: 最后一个有效节点 头结点: 一般加首节点前面,不存放有效数据,可以通过头结点找到首节...原创 2019-08-07 23:41:00 · 250 阅读 · 0 评论 -
如何表示链表每一个节点的数据类型
1 #include<stdio.h> 2 3 typedef struct node{ 4 int data;//数据域 5 struct node * pNext;//指针域,指向跟本身一样的数据类型(struct node) 6 }NODE,*PNODE;//NODE==struct node, 7 PNODE==stru...原创 2019-08-07 23:42:00 · 360 阅读 · 0 评论 -
非循环单链表创建和链表遍历
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 //函数声明 5 PNODE create_list();//返回值是链表头结点的地址 6 void traverse_list(PNODE pHead); 7 8 typedef stru...原创 2019-08-07 23:45:00 · 151 阅读 · 0 评论 -
如何使用非循环单链表节点进行插入和删除的操作
插入节点1 //写法一:2 r = p->pNext; //r为临时变量3 p->pNext = q; //q为要插入的节点地址4 q->next = r;5 6 7 //写法二:8 q->pNext = p->pNext; //将原来指向下一节点的指针域赋值给插入的节点的指针域9 p->pNext = q; /...原创 2019-08-07 23:44:00 · 366 阅读 · 0 评论 -
如何判断链表是否为空以及如何求链表长度
#include<stdio.h>#include<malloc.h>#include<stdlib.h>//函数声明PNODE create_list();//创建链表,返回值是链表头结点的地址void traverse_list(PNODE pHead);//遍历链表bool is_empty(PNODE pHead...原创 2019-08-08 10:57:00 · 2208 阅读 · 0 评论 -
数据结构之链表的排序算法以及什么是泛型【重点】
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 //函数声明 6 PNODE create_list();//返回值是链表头结点的地址 7 void traverse_list(PNODE pHead); 8 bool...原创 2019-08-08 11:38:00 · 145 阅读 · 0 评论 -
数据结构中的链表插入和删除算法
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 //函数声明 6 PNODE create_list();//返回值是链表头结点的地址 7 void traverse_list(PNODE pHead); 8 bool...原创 2019-08-08 23:44:00 · 400 阅读 · 0 评论 -
如何有效利用指针和数组下标
指针和数组: 指针和一维数组: 数组名: 一维数组名是个指针常量 它的值不能被改变 它存放的是一维数组里第一个元素的地址 一维数组名指向的是数组的下标为0的第一个元素。下标和指针的关系:1 a[i]<<==>>*(a+i)<<==>>*(i+a)<<==>>i[a]...原创 2019-07-25 22:11:00 · 499 阅读 · 0 评论 -
数据结构中的指针与内存是什么?
数据结构的定义 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序而执行的相应操作,这个操作也叫算法) 数据结构 = 个体 + 个体的关系 算法 = 对存储数据的操作 衡量算法的标准: 时间复杂度:大概程序要执行的次数,而非执行...原创 2019-07-25 22:03:00 · 218 阅读 · 0 评论