数据结构(C语言版)
数据结构(C语言版)
鸣鼓ming
这个作者很懒,什么都没留下…
展开
-
(一)1.1_时间复杂度的计算
前言 同一个算法用不同的语言实现,或者用不同的语言实现,或者用不同的编译程序进行编译,或者在不同的计算机上运行时,效率均不同.所以用绝对的时间单位衡量算法的效率是不合适的.于是,便引入了时间复杂度这一概念来衡量算法的效率. 一般情况下,算法中的基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记做T(n)=O(f(n)) ,它表示随问题规模n的增大,算法执行时间的增长率和...原创 2018-11-24 15:07:56 · 3505 阅读 · 0 评论 -
(六)1.3_非递归遍历二叉树(先序、中序、后序、层序四种遍历方式)
一.非递归先序遍历1.思路分析 a.使用while循环从树根节点开始用指针p遍历二叉树 b.如果遍历到的节点p不是空树,则访问该节点,并把节点p入栈(入栈是因为回溯访问其右子树需要通过其获得它的右子树),然后p指向p的左子树(向左走) c.如果遍历到空树(说明向左走到了尽头),则出栈一个节点,p指向该节点的右子树(向右走) d.就这样一直循环直到栈为空且p指针指向空,则先序遍历...原创 2018-12-23 22:26:59 · 235 阅读 · 0 评论 -
(七)1.1_普里姆算法求无向连通网的最小生成树
注意:本算法使用的是邻接表来存储图一.普里姆算法 以一个起点为连通分量(这里以v1为起点),从其他未连接至该连通分量的顶点中找出一个顶点,该顶点连接该连通分量的最短边是所有未连接到该连通分量中的边中最短的,然后连接该顶点,然后继续从其他未连接至该连通分量的顶点中找出一个顶点,重复上述步骤…直到所有顶点都被连接二.思路分析 1.我们要构建一个辅助数组closeedge[MAX_VER...原创 2019-01-20 00:17:29 · 1125 阅读 · 0 评论 -
(七)1.2_迪杰斯特拉算法求最短路径
注意:本算法采用邻接表存储图一:迪杰斯特拉算法 假如以顶点v1起点,用迪杰斯特拉算法求起点分别到顶点v2,v3,v4,v5的最短路初始我们计算出起点到各个顶点的最短路径,然后连接路径是所有路径中最短的那个顶点(加入到S集),然后接着重复这样的步骤,最短所有顶点都被连接二.思路分析三.代码实现#include"stdio.h"#include"stdlib.h"#d原创 2019-01-23 16:24:24 · 6775 阅读 · 3 评论 -
(九)1.1_二叉排序树
一.相关概念 二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树;二.插入节点算法思路: 如果插入元素小于遍历到的结点元素,就在结点左子树继续查找插入位置,如果大于则在右子树...原创 2019-02-06 16:32:14 · 289 阅读 · 0 评论 -
(十)1.1_希尔排序
一.相关概念希尔排序简单的理解就是分组式的插入排序,记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止如图:第一趟排序时以增量为3进行分组,图中a1 a4 a7为一组,a2 a5 a8为一组,a3 a6 a9为一组,每组内进行插入排序,排序后完成再以增量为2和1进行相同的操作,最后便会得到...原创 2019-02-06 20:11:49 · 241 阅读 · 0 评论 -
(十)1.2_快速排序
一.相关概念 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列如图: 1.我们首先把表中的第一个元素作为...原创 2019-02-07 14:34:20 · 153 阅读 · 0 评论 -
(十)1.3_堆排序
一.相关概念①什么是堆? 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值总是小于等于(或者大于等于)它的父节点。 1.父结点的键值总是不小于它的两个子结点的键值的堆称之为"大顶堆"(简称"大堆") 2.父结点的键值总是不大于它的两个子结点的键值的堆称之为"小顶堆"(简称"小堆")②建什...原创 2019-02-09 20:44:20 · 818 阅读 · 0 评论 -
(十)1.4_归并排序
一.相关概念 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 线性表在合并时用的是有序线性表快速合并的算法,即要合并两个有序递减线性表La,Lb,则需创...原创 2019-02-09 22:28:51 · 169 阅读 · 0 评论 -
(六)1.2_递归遍历二叉树(先序、中序、后序三种遍历方式)
绪论1.前言 二叉树的先序、中序、后序三种遍历方式都可以使用递归或者非递归实现,但是使用递归会简单很多(下一篇博客将会介绍非递归的实现方法),这里递归实现很简单,就不过多陈述了,直接看代码2.二叉树结构定义typedef char TElemType; //树的数据的类型 typedef struct BiTNode //树节点 { TEl...原创 2018-12-13 20:19:40 · 1582 阅读 · 0 评论 -
(六)1.1_创建二叉树(先序、后序、层序、广义表四种创建方法)
绪论 我依次介绍先序、后序、层序、广义表四种形式创建二叉树的方法,二叉树样例均使用下方样例来进行举例讲解1.二叉树样例2.二叉树结构定义typedef char TElemType; //树的数据的类型 typedef struct BiTNode //树节点 { TElemType data; //数据成员 ...原创 2018-12-13 19:51:28 · 998 阅读 · 0 评论 -
(二)1.1_线性表求集合的并集
一.集合求并集一般算法1.思路分析: 有两个集合A和B,用线性表L1,L2表示,求他们的并集,一般我们都会想到的方法:用两个循环遍历两个线性表L1,L2中的元素,把L2中的元素与L1中的元素依次比较,如果L2中的元素不和L1中的元素相同,则把L2中这个元素存到L1的末尾,否则不存.2.代码实现 //集合求并集,这里使用顺序表表示集合 void Union(SqList *L1,SqLi...原创 2018-11-24 16:40:48 · 4731 阅读 · 0 评论 -
(二)1.2_顺序表的插入与删除
一.顺序表的插入元素到指定位置1.思路分析 从指定位置,把往后所有元素(包括指定位置的元素)的位置都向后移动一个位置,注意要从最后一个元素开始移动,从后向前遍历,依次移动元素,直到遍历到指定位置元素,并把它移动,移动操作完成后,再把指定位置赋值为你要插入的元素2.代码实现//顺序表指定位置插入元素,参数:顺序表指针,插入元素,插入位置 void InsertElem(sqList* ...原创 2018-11-24 17:52:27 · 1441 阅读 · 0 评论 -
(二)1.3_链表的创建插入与删除
一.链表的创建1.思路分析 链表创建节点有两种方法,一种是前插法,一种是后接法;前插法就是在头节点和首元节点之间插入节点,后接法是在链表的最后一个节点的末尾插入节点. 这里可能有人又有疑问了.什么是头节点?什么是首元节点?那么这里来解释一下:通常为了方便操作,链表的第一个节点是不用来存储数据元素的,这个节点就称作头节点,而从链表的第二个节点才开始存储数据元素,这个节点称为首元节点,又称为...原创 2018-11-24 22:28:32 · 214 阅读 · 0 评论 -
(五)1.1_稀疏矩阵乘法的快速运算
一.问题描述 有矩阵M和N,都是用三元组压缩存储,设计高效率算法求矩阵M*N得到的矩阵Q(也用三元组压缩存储).二.思路分析假设矩阵M*N=Q 如下那么得到的矩阵Q有三行三列,第一列中的元素有这样的关系所以我们可以这样,在遍历到M11时,由于N11,N12,N13是在顺序表中连续排列的,所以我们可以创建一个3个累加器(int QElem[4]={0}),遍历到M11时,先算Q...原创 2018-11-30 01:01:41 · 16883 阅读 · 7 评论 -
(三)1.1_中缀式转化为后缀式并求值
一.问题描述 输入一串中缀式,将其转化为后缀式,并利用该后缀式计算出算式的结果.例如:输入的中缀式为2*(4-2)+6/3;转化为后缀式为242-*63/+;计算结果为6;二.思路分析 我们先从键盘中输入中缀式(以’#‘开始和结束,为了方便后面的操作);然后把中缀式存入顺序表La中1.中缀式转化为后缀式算法概述: 先构建一个存储运算符的栈,和一个存储后缀式的顺序表Lb.刚...原创 2018-12-02 17:42:08 · 337 阅读 · 0 评论 -
(三)1.2_迷宫求解(使用队列)
一.问题描述 1.迷宫问题.假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),设计一个算法,找出一条最短的路径,如果没有路径报告无法通过的信息. 2.输入m,n,用二维数组创建一个m行n列的迷宫 3.迷宫的任一位置(i,j)上均有八个可以移动的方向(上, 右上, 右, 右下, 下, 左下, 左, 左上)二.思路分析 1.这里我们用队...原创 2018-12-02 18:59:45 · 4113 阅读 · 3 评论 -
(二)1.4_一元稀疏多项式计算器
一.问题描述(1)设Pn(x)和Qm(x)为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x).(2)从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出.(3)实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x).(4)实现Pn(x)和Qm(x)相减,并输出两者的和Pn(x)-Qm(x).(5)就地逆置两者的差Pn(x)-Qm(x)....原创 2018-12-02 20:55:02 · 1530 阅读 · 0 评论 -
(五)1.2_稀疏矩阵快速转置(三元组存储)
一.问题分析 一个稀疏矩阵M用三元组表示,设计高效率的算法将矩阵M转置后得到矩阵N二.思路分析1.我们先对矩阵M的顺序表进行遍历,用数组num[]记录M矩阵每一列非零元素分别有多少个,这也就是逆矩阵N每一行的非零元素有多少个.2.利用逆矩阵N每一行的非零元素有多少个这个信息,我们就可以求出逆N矩阵中每一行非零元素在顺序表中的位置序号,每一行首非零元素在顺序表中的位置序号是上一行首非零...原创 2018-12-03 21:19:32 · 1213 阅读 · 0 评论 -
(十)1.5_基数排序
一.相关概念 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort.它是桶排序的扩展,其中基数指得是一个关键字取值的种数,例如十进制的整数,每位的数字都可以取0~9中的一个数,有10种取法,所以十进制整数的基数是10 基数排序的基本思想是:将整数按位切割成不同的数字,然后将每位的数字进行排序;...原创 2019-02-11 22:00:50 · 265 阅读 · 0 评论