
基本初级低等数据结构
Sodaoo
Deep Inner Peace
展开
-
16 - 12 - 11 二叉排序树
二叉排序树:( BST : Binary_Sort_Tree ) 设查找的数据集是普通的顺序存储,那么插入操作就是将记录放在表的末端,给表记录数加一即可,删除操作可以删除后,后面的记录向前移,也可以是要删除的元素与最后一个元素互换,表记录数减一,反正整个数据集也没有什么顺序,这样的效率也不错。应该说,插入和删除对于顺序存储结构来说,效率是可以接受的,但是这样的表由于无序造成查找的效率很低 如果查原创 2016-12-11 09:28:40 · 1167 阅读 · 0 评论 -
16 - 12 - 24 二叉树的中序线索化
线索二叉树 按照某种遍历方式对二叉树进行遍历时,可以把二叉树中的所有节点排列成为一个线性序列,在该序列中,除了第一个节点外,每个节点有且仅有一个直接前驱(直接后继), 但是 ! 当以二叉链表作为存储结构时,只能得到节点的左右孩子信息,而不能直接得到节点在某种遍历序列中的前驱和后继节点。这种信息只有在对二叉树进行动态遍历的过程中才能得到。 为了保存节点在某种遍历序列中直接前驱(后继)信息,可以利原创 2016-12-20 15:41:57 · 533 阅读 · 0 评论 -
16 - 12 - 23 二叉树遍历的非递归-栈实现
/二叉树遍历之章/原创 2016-12-20 12:04:47 · 525 阅读 · 0 评论 -
16 - 11 - 16 二叉树(C)生成之--终极奥义--书上没讲的!!
先 说说 几种遍历方式把 先序遍历:访问根结点 ;先序遍历左子树,先序遍历右子树。 顺序:A B D G E H I C F J 中序遍历:中序遍历左子树,访问根节点,中序遍历右子树 例如,如果要中序遍历A的左子树{B D E G H I},根据中序遍历的递归定义,要先中序遍历B的左子树{D G},然后再访问根节点B,访问完根节点B后,中序遍历B的右子树。注意,这里的根节点都是相对原创 2016-11-16 17:02:58 · 669 阅读 · 0 评论 -
16 - 11 - 07 入栈时,内存中的 小变化
在这里摘出来了一个普通的入栈函数,但因为对指针的理解任重道远,所以对每一步代码,都用了打印地址的方法追踪其变化。 注:这整个函数的目的是通过 构建 - 插入的方式来构建 链栈 。 —-原函数—-:LinkStack Push(LinkStack top,int e) //入栈函数{ LinkStack p; p=(LinkStack)malloc(sizeof(SNODE));原创 2016-11-07 20:58:59 · 504 阅读 · 1 评论 -
16 - 12 - 22 二叉树的基本操作
typedef struct node{ struct node *lchild,rchild; DataType data;}*BiTree,BiNode;BiTree *T;/*初始化二叉树*/void InitBiTree(BiTree *T){ *T = NULL;} /*先序递归创建二叉树*/void CreateBiTree(BiTree *T)原创 2016-12-19 17:31:22 · 531 阅读 · 0 评论 -
17 - 01 - 03 链表逆序合并
【问题】 现有两个单链表A、B,他们的元素都是递增有序。 编写算法将A、B 归并成一个按元素值递减有序的(允许有相同值) 链表C、要求用A、B、中的原结点形成,不能重新申请新节点。/*两个单链表的有序合并*/LinkList Merge(LinkList A,LinkList B){ LinkList C; LNode *p,*q; p = A->next; q原创 2016-12-26 08:29:16 · 587 阅读 · 1 评论 -
17 - 01 - 02 单链表的逆置
/*单链表的逆置 是面试官非常青睐的题,这个题可以看出面试者对链表和指针的操作*/ /*代码如下*/#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node*next;} Node;//创建链表Node *CreatList(void) { int i,原创 2016-12-25 15:04:19 · 597 阅读 · 0 评论 -
16 - 12 - 21 栈的应用实例(走迷宫)
栈的应用举例————【一:数制转换】 需要不断的重复求余算法。 由于计算时是从低位到高位顺序产生二进制的各个数位。 而打印出时应从高位到低位进行。非常适合用栈来进行这个过程。//N是待转数字,R是进制数。//函数 1、typedef int DataType;void conversion(int N,int R){ SeqStack s; DataType x;原创 2016-12-19 10:17:05 · 420 阅读 · 0 评论 -
17 - 01 - 01 单链表-删除重复元素
// 用图 请与作者联系哦~typedef struct Node{ DataType data; struct Node *next;}LNode,LinkList; //头指针:LinkList H;/*删除重复结点*/void pur_LinkList(LinkList H){ LNode *q, *p, r; p = H->next; i原创 2016-12-25 14:58:04 · 420 阅读 · 0 评论 -
16 - 12 - 30 关键路径
———————–《《大话数据结构》》原创 2016-12-23 19:29:51 · 417 阅读 · 0 评论 -
16 - 12 - 26 图的存储结构-邻接矩阵、邻接表、十字链表
一、邻接矩阵 二、邻接表三、十字链表原创 2016-12-21 11:59:34 · 1014 阅读 · 0 评论 -
16 - 12 - 29 拓扑排序
拓扑排序原创 2016-12-23 17:31:16 · 499 阅读 · 0 评论 -
16 - 12 - 07 迪杰斯特拉(Dijkstra)算法-最短路径 - の わもがたり
↑ 上图是帮助理解的。只要认真看懂 ↑↑ 这张图,其他的问题不大。(下面程序中的图会稍微简单一些。) 下面 ↓ 是代码的图,可以对照着在脑海中,草纸上把程序过一遍,以加深理解。轮子哥说:如何记忆算法?把算法运用的像1+1=2一样熟练就可以了。!()迪杰斯特拉算法的证明包含在下面: 算法思想 -令G = (V,E)为一个带权有向图,把图中的顶点集合V分成两组, 第一组为已求出最短路径的原创 2016-12-06 23:35:37 · 1145 阅读 · 0 评论 -
16 - 12 - 06 克鲁斯卡尔(Kruskal)算法详解
算法思路: 直接以边为目标去构建,直接去找最小权值的来构建生成树也是很自然的想法。 只需在构建时小心不要形成环路即可。自然地用到了边集数组。 运行结果↓: <<<想看代码吗 ? 在最下面 >>>//////精华分析:之 一步一步分析代码: 污深深带你浪哟带你飞////////因为一条边由两个顶点组成,我们把一条边的前后两个顶点按大小排好,填入edges方格列表,暂且 一个叫前点,一个叫后点原创 2016-12-06 12:50:02 · 1333 阅读 · 0 评论 -
16 - 12 - 05 普里姆(Prim)算法-最小生成树-奥义
//算法思路://① 从图中任意找一个点,加入到最小生成树中;//②在剩下的顶点中,找权重最小的边,将该顶点纳入最小生成树;//③重复步骤②;//```/* 邻接矩阵表示的图结构*/#include <stdio.h>#include <stdlib.h>//#include <curses.h> 这是啥?typedef char VertexType; //顶点类型应原创 2016-12-05 21:47:25 · 715 阅读 · 0 评论 -
16 - 12 - 28 图的遍历-广度优先遍历(BFS)
如果说树的深搜像是树的先序遍历,那么宽搜就像是树的层序遍历。(1)顶点v入队列。 (2)当队列非空时则继续执行,否则算法结束。 (3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。 (4)查找顶点v的第一个邻接顶点col。 (5)若v的邻接顶点col未被访问过的,则col入队列。 (6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。直到顶点v的所有未被访问过的邻接点处理原创 2016-12-21 16:49:17 · 571 阅读 · 0 评论 -
16 - 12 - 27 图的遍历-深度优先遍历(DFS)
**深搜(DFS)与宽搜(WFS)—(deep_first_search) 1、深搜始终先访问靠右的节点,访问过的节点 做标记visited[0\1],直到所有节点都被标记为访问过(连通图)————递归过程。 2、对于非连通图,只需要对他的连通分量分别进行深度优先遍历。即在先前一个顶点进行过一次深度优先遍历后,若图中尚有顶点未被访问,则另选图中一个未曾被访问的节点作为起始点,重复上述过程,直到图原创 2016-12-21 16:23:20 · 537 阅读 · 0 评论 -
单链表逆置
单链表逆置原创 2017-11-29 22:01:45 · 693 阅读 · 0 评论