顾十方
这个作者很懒,什么都没留下…
展开
-
C语言链表操作详解
为什么要使用链表在未学习链表时,我们常用的存储数据的方式无非就是数组。使用数组存储数据的好处就是查询快,但是它的弊端也很明显:使用前需声明数组的长度,一旦声明长度就不能更改 插入和删除操作需要移动大量的数组元素,效率慢 只能存储一种类型的数据.而链表则可以实现以上这些数组所不具备的功能,此时引入了结构体来实现创建链表的操作。链表的特点:n个节点离散分配 每一个节...原创 2018-12-29 19:01:55 · 146895 阅读 · 52 评论 -
C严蔚敏数据结构-循环队列
为解决"假溢出"的问题,将顺序队列变为一个环状的空间,称为循环队列。头尾指针以及队列元素之间的关系不变,只是在循环队列中,头尾指针"依环状增1"的操作可用"模"运算来实现。通过取模,头指针和尾指针就可以在顺序表空间以头尾衔接的方式"循环"移动。对于循环队列不能以头尾指针的值是否相同来判别队列空间是"满"还是"空",通常有两种处理方法: 1.少用一个元素空间,即队列空间大小为m时,...原创 2019-07-04 09:47:57 · 595 阅读 · 0 评论 -
C数据结构-链表习题解析
(1)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中不允许有重复的数据[题目分析]合并后的新表使用头指针Lc指向,pa和pb分别是链表La和Lb的工作指针,初始化为相应链表的第一个结点,从第一个结点开始进行比较,当两个链表La和Lb均为到达表尾结点时,依次摘取其中较小者重新链接在Lc表的最后。如果两个表中的元素相等...原创 2019-07-01 10:07:48 · 724 阅读 · 0 评论 -
C语言数据结构——二叉树
链式存储定义结构体typedef struct tree{ char data; struct tree *Lchild,*Rchild;}Tree;创建二叉树(采用先序遍历创建,也可采用中序或后序遍历创建)1.扫描字符序列,输入字符ch2.如果ch是一个'#'字符,则表明该二叉树为空树,即T为NULL;否则执行以下操作:申请一个节点空间 将ch赋...原创 2019-07-18 20:43:28 · 791 阅读 · 0 评论 -
C语言数据结构——线索二叉树
线索二叉树与二叉树的不同在于,线索二叉树多了两个标识域,便于二叉树寻找前驱和后继,使得遍历二叉树的效率大大提高typedef struct tree{ char data; int Ltag,Rtag; struct tree *Lchild,*Rchild;}Tree;其中Ltag和Rtag为标识域,其意义为:如果Ltag = 0,则表示Lchil...原创 2019-07-18 21:23:30 · 377 阅读 · 0 评论 -
C语言数据结构——图的邻接矩阵
转载地址:https://blog.youkuaiyun.com/qq_39630587/article/details/77374857无向图和有向图在邻接矩阵中的表示方法:无向图和有向图大同小异,在这里只以无向图为例,代码部分通过简单调整即可对应编译有向图邻接矩阵数据类型定义#define MaxVertices 100 //定义最大容量typedef ...转载 2019-07-22 11:41:04 · 3356 阅读 · 1 评论 -
图的应用——弗洛伊德两点最短路径
Dijkstra算法是求图中某一顶点到其余各顶点的最短路径,如果求图中任意一对顶点间的最短路径,则通常使用弗洛伊德算法Floyd算法:运行结果:输入:4 80 1 2 30 1 50 3 71 2 41 3 22 0 32 1 32 3 23 2 1void Floyd(AMGraph G,int path[][MaxVertices]){ ...原创 2019-07-31 12:37:31 · 459 阅读 · 3 评论 -
排序——插入类排序
插入类排序,一般是在一个有序的序列中,插入一个新的元素,要点在于如何找到这个插入的位置。插入类排序包括:直接插入排序,折半插入排序,希尔排序直接插入排序算法思想:每趟将一个待排序的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有关键字都被插入到有序序列中为止。时间复杂度分析:空间复杂度:O(1)最坏情况下,基本操作选取最内层循环中arr[j+1...原创 2019-08-04 12:01:21 · 299 阅读 · 0 评论 -
C语言数据结构——图的邻接表
转载地址:https://blog.youkuaiyun.com/qq_39630587/article/details/77409869邻接表数据结构类型如下:#define MaxVertices 100 typedef struct node //建立边表{ int adjvex; //该边所指向的节点位置 node* next; ...转载 2019-07-23 10:57:56 · 4797 阅读 · 4 评论 -
排序——交换类排序
冒泡排序算法思想:数组中第一个元素和第二个元素比较,按照规则进行交换,再让第二个和第三个进行比较,直到最大或最小的那个数交换到最后,一趟冒泡排序完成。以升序为例,冒泡排序主要是让大的下沉,小的上浮,每一趟排序确立一个当前无序序列中最大的那个数,使之下沉。时间复杂度分析: 最坏:整个数组逆序,最内层循环的语句执行(n-1+1)(n-1)/2 = ...原创 2019-08-05 11:51:12 · 685 阅读 · 0 评论 -
拓扑排序——AOV网
特点:顶点表示活动 边表示活动的先后次序,边没有权值 没有回路的有向图结构体定义:typedef struct node //边表{ int adjvex; struct node* next;}ArcNode;typedef struct //顶点表{ int data; int count; ...原创 2019-08-01 13:25:59 · 306 阅读 · 0 评论 -
图的深度遍历
深度优先搜索类似于树的前序遍历同样以如下连通图为例:构建其对应的邻接表:采用深度优先搜素的遍历顺序如下:邻接表深度遍历结果:范例输入:5 71 2 3 4 51 41 31 22 42 33 54 5邻接表深度遍历:void DFS(AdjList *G,int v){ //因为采用头插法创建邻接表,所以需要用栈进行逆序输出 /...原创 2019-07-28 19:38:14 · 445 阅读 · 0 评论 -
图的广度遍历-邻接表
广度优先搜索(又称宽度优先搜索)算法是最简便的图的搜索算法之一,该算法属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。广度优先搜素也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。广度优先搜素类似于树的层次遍历,遍历结果不唯一...原创 2019-07-28 19:47:46 · 1323 阅读 · 0 评论 -
图的应用——最小生成树
最小生成树(minimum spanning tree)是由n个顶点,n-1条边,将一个连通图连接起来,且使权值最小的结构。最小生成树可以用Prim(普里姆)算法或kruskal(克鲁斯卡尔)算法求出。我们将以下面的带权连通图为例讲解这两种算法的实现:Prim(普里姆)算法时间复杂度:O(N^2)(N为顶点数)prim算法又称“加点法”,用于边数较多的带权无向连通图方法:每次找与之...原创 2019-07-28 20:18:27 · 629 阅读 · 0 评论 -
图的应用——迪杰斯特拉最短路径
采用广度优先搜索思想,对有向赋权图寻找最短路径。该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法。时间复杂度:O(n^2)基本原理:不断为为每个顶点 v 保留目前为止所找到的从s到v的最短路径上图为迪杰斯特拉算法应用示意图。起点以左下角的红点,目标是右上角的绿点,中间灰色的倒L型为障碍物。蓝色空圈表示”暂定”,用以搜索下一步;已经填充颜色的表示探访过,图中颜色以红到绿,越...原创 2019-07-28 20:27:24 · 370 阅读 · 1 评论 -
排序——选择类排序
简单选择排序算法思想:从头至尾顺序扫描序列,找出最小的一个关键字,和第一个关键字交换,接着从剩下的关键字中继续这种选择和交换,直至序列有序。时间复杂度分析:空间复杂度:O(1)两层循环的执行次数和初始序列无关,外层循环执行n次,内层循环执行n-1次,总执行次数:(n-1+1)(n-1)/2 = n(n-1)/2,即时间复杂度为O(n^2)代码:void Select_...原创 2019-08-07 12:06:04 · 253 阅读 · 0 评论 -
排序——二路归并排序
算法思想:将无序序列拆分至只有一个关键字的子序列;然后两两归并,直至归并成一个序列时间复杂度分析:共需进行log2n趟排序,每趟排序执行n次归并操作,因此时间复杂度为O(nlog2n);时间复杂度与初始序列无关,平均和最好和最坏时间复杂度都是O(nlog2n)空间复杂度:需要转存整个无序序列,空间复杂度为O(n)代码:void Merge(int arr[],int left...原创 2019-08-07 12:12:58 · 1713 阅读 · 0 评论 -
C严蔚敏数据结构-单链表
单链表的插入时间复杂度:O(n) 查找节点ai-1并由指针指向该节点 生成一个新节点*s 将新节点*s的数据域置为e 将新节点*s的指针域指向节点ai 将节点*p的指针域指向新节点*sStatus ListInsert(List *L,int i,ElemType e) //在指定位置插入数据域为e的节点{ List* p = L,*node; ...原创 2019-06-27 10:16:20 · 979 阅读 · 0 评论 -
C严蔚敏数据结构-算法和算法分析
一.算法算法是为了解决某类问题而规定的一个有限长的操作序列。一个算法必须满足一下五个重要特性:有穷性 算法的每个步骤都能在有限时间内完成 确定性 对于每种情况下所应执行的操作,在算法中都有明确的规定 可行性 算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现 有输入 作为...原创 2019-06-24 09:32:35 · 802 阅读 · 0 评论 -
堆分配内存-calloc和realloc
1.calloc函数库:#include <stdlib.h>格式:void* calloc(size_t nmemb,size_t size);功能:在内存动态存储区中分配nmemb块长度为size字节的连续区域。calloc自动将分配的内存置0参数:nmemb 所需的内存单元数量 size 每个内存单元的大小(单元:字...原创 2019-06-17 16:27:40 · 339 阅读 · 0 评论 -
C语言顺序表操作
#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 10void create(struct link &L); void show(struct link L);void getelem(struct link L,int n);void insert(struct link &L,in...原创 2019-01-01 15:34:34 · 1924 阅读 · 0 评论 -
合并排序
什么是合并排序算法合并排序是用分治策略实现对n个元素进行排序的算法,其基本思想是:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成要求的集合。思路:对集合不断进行拆分,直至集合中只剩一个元素为止。再调用合并排序算法,将每一个子集合的元素进行排序,并将排序后的结果保存在临时数组中,再将临时数组赋值给初始数组即可。#include <s...原创 2019-01-02 15:43:43 · 1880 阅读 · 0 评论 -
快速排序
转载地址假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。 3 1 2 5 ...转载 2019-01-02 16:34:20 · 228 阅读 · 0 评论 -
链表排序
前言:最近总结了一下针对只有头结点的单链表进行排序的几个简单的方法。交换节点:插入排序,冒泡排序,简单选择排序交换数据:快速排序初始化:#include <stdio.h>#include <stdlib.h>#include <stdbool.h>//节点结构struct node{ int val; struc...转载 2019-01-13 20:57:14 · 217 阅读 · 0 评论 -
C严蔚敏数据结构-链栈
链栈的初始化Status InitStack(Stack* &s){ s = (Stack*)malloc(sizeof(Stack)); s->next = NULL; return OK;}元素入栈为入栈元素e分配空间,用指针p指向 将新节点数据域置为e 将新节点插入栈顶 修改栈顶指针为pStatus Push(Stac...原创 2019-01-18 19:21:38 · 373 阅读 · 0 评论 -
C严蔚敏数据结构-顺序栈
1)base为栈底指针,初始化完成后,栈底指针base始终指向栈底的位置,若base的值为NULL,则表示栈结构不存在。top为栈顶指针,其初值指向栈底。每当插入新的栈顶元素时,指针top+1;删除栈顶元素时,指针top-1.因此,栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。2)stacksize指示栈可使用的最大容量顺序栈的初始化...原创 2019-01-18 19:24:22 · 644 阅读 · 0 评论 -
C严蔚敏数据结构-链队
链队的初始化生成新节点作为头节点,队头和队尾指向此节点 头节点的指针域置空Status InitQueue(LinkQueue &q){ q.front = q.rear = (Queue*)malloc(sizeof(Queue)); //生成新节点作为头节点,队头和队尾指向此节点 q.front->next = NULL; ...原创 2019-01-22 10:53:22 · 368 阅读 · 0 评论 -
C语言链表的所有相关操作详解
#include <stdio.h>#include <stdlib.h>typedef struct list List;List *create(); void insertNode(List *L,int n);void deleteNode(List *L,int n);List *Listreverse(List *L);void merge(Li...原创 2019-02-26 10:00:49 · 447 阅读 · 0 评论 -
C语言数据类型
1.常量和变量1)关键字数据类型关键字(12个): char short int long float double unsigned signed struct union enum void 控制语句关键字(12个):if else switch case default for do while break continue goto return 存储类关键字(5个):auto...原创 2019-05-21 20:22:36 · 289 阅读 · 0 评论 -
C语言-字符串与字符数组区别
区别:C语言中没有字符串这种数据类型,可以通过char的数组来代替 字符串一定是一个char的数组,但char的数组未必是字符串 数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组。注: %s是打印一个字符串,%c是打印一个字符 %s会接收字符串结束标志'\0...原创 2019-05-25 21:56:48 · 28098 阅读 · 10 评论 -
C语言-字符处理函数
1.gets()格式:char * gets(char *s);功能:从标准输入读入字符,并保存到指定的内存空间,直到出现换行或读到文件结尾为止参数:s 字符串首地址返回值:成功-读入的字符串 失败-NULLgets(str)和scanf("%s",str)的区别:注: 由于gets()和scanf()无法知道字符串s大小,必须遇到换行符或读...原创 2019-05-27 20:04:36 · 357 阅读 · 0 评论 -
解决codeblocks无法编译,环境错误的问题
codeblocks通常出现上述问题的原因是环境配置错误,解决办法大多是下载一个mingw.zip的文件,然后再复制到codeblocks的文件夹里,这种方法不仅繁琐,有时候还不能彻底解决问题。这时,我发现官网里面可以直接下载有mingw的codeblocks,进行下载安装等一系列傻瓜式操作就可以正常使用codeblocks了。如图1.先点击Download the binary rele...原创 2019-05-23 16:40:56 · 23445 阅读 · 4 评论 -
C语言-内存管理
作用域C语言变量的作用域分为:代码块作用域(代码块是{}之间的一段代码) 函数作用域 文件作用域局部变量局部变量也叫auto自动变量,一般情况下代码块{}内部定义的变量都是自动变量,它有如下特点:在一个函数内定义,只在函数范围内有效 在复合语句中定义,只在复合语句中有效 随着函数调用的结束或复合语句的结束,局部变量声明,生命周期也结束 如果没有赋初值,内容随机...原创 2019-06-06 08:43:43 · 237 阅读 · 0 评论 -
C语言-指针
1.指针和指针变量内存区的每一个字节都有编号,这就是地址 如果在程序中定义了一个变量,在对程序进行编译和运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号) 指针的实质就是内存'地址',指针就是地址,地址就是指针 指针是内存单元的编号,指针变量是存放地址的变量 通常我们叙述时会把指针变量简称指针,实际上它俩含义不相同在指针声明时,*号表示所声明的变量为指针 ...原创 2019-06-04 10:07:38 · 320 阅读 · 0 评论 -
C严蔚敏数据结构-顺序表
顺序表C语言描述#define LIST_INIT_SIZE 80//线性表存储空间的初始分配量#define LISTINCREMENT 10//线性表存储空间的分配增量typedef int ElemType; //为int设置别名typedef struct{ ElemType *elem; //存储空间基址 int length; //当前长度...原创 2019-06-25 10:27:28 · 742 阅读 · 0 评论 -
C语言-结构体和共用体
概述:数组:描述一组具有相同类型数据的有序集合,用于处理大量相同类型的数据运算。有事我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号、姓名、性别、年龄、地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理,C语言中给出了另一种构造数据类型--结构体定义结构体格式struct Student{ //成员列表 char name[10]; ...原创 2019-06-11 19:16:25 · 2466 阅读 · 0 评论 -
C语言——链表排序
单链表排序前言:最近总结了一下针对只有头结点的单链表进行排序的几个简单的方法。交换节点:插入排序,冒泡排序,简单选择排序交换数据:快速排序初始化:#include <stdio.h>#include <stdlib.h>#include <stdbool.h>//节点结构struct node{ int val;...转载 2019-08-24 15:15:29 · 11298 阅读 · 3 评论