数据结构
Big_xbc
这个作者很懒,什么都没留下…
展开
-
数据结构----动态查找(哈希表)
摘自《零基础学数据结构》原创 2022-02-04 16:55:38 · 383 阅读 · 0 评论 -
数据结构----查找(动态查找)
摘自《零基础学习数据结构 》原创 2022-01-30 10:26:36 · 1012 阅读 · 0 评论 -
数据结构----顺序表应用
1、顺序表逆置/*将顺序表逆置*/void convertList(SeqList *l) { int i; int length = (l->size) / 2; printf("length:【%d】\n", length); printf("l->size:【%d】\n", l->size); DataType temp;//暂放中间值 for (i = 0; i < length; i++) {//相互交换 int len = l->size -.原创 2022-01-15 12:38:26 · 534 阅读 · 0 评论 -
数据结构----数组(二维动态数组)
数组(二维动态数组)/* 二维数组 */ #include <stdio.h>#include <malloc.h>/* 创建二维数组 */int **Make2DArray(int row,int col){ //申请row行,col列的二维数组 int **a,i; a = (int**)calloc(row,sizeof(int *)); for(i=0;i<row;i++){ a[i]=(int*)calloc(col,sizeof(i原创 2021-04-12 20:21:00 · 194 阅读 · 0 评论 -
数据结构----二路归并排序
二路归并排序的基本思想设数组a中存放了n个数据元素,初始时把它们看成是n个长度为1的有序子数组,然后从第一个有序子数组开始,把相邻的有序子数组两两合并,得到[n/2]个长度为2的新的有序子数组(当n为奇数时,最后一个新的有序子数组的长度为1)。对这些新的有序子数组再进行两两归并。如此重复,直到得到一个长度为n的有序数组为止。一次二路归并排序算法的目标是把若干个长度为k的相邻有序子数组从前、向后进行两两归并,得到个数减半的长度为2k的相邻有序子数组。算法设计中要考虑的一个问题是:若元素个数为2k的整数倍,原创 2021-07-07 11:13:46 · 15697 阅读 · 1 评论 -
数据结构----快速排序
快速排序算法的基本思想快速排序是一种二叉树结构的交换排序方法。设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素(通常取a[low])作为标准,调整数组a中各个元素的位置,使排在标准元素前面元素的关键字均小于标准元素的关键字,排在标准元素后面元素的关键字均大于或等于标准元素的关键字。这样一次过程结束后,一方面将标准元素放在未来排好序的数组中该标准元素应在的位置,另一方面将数组中的元素以标准元素为中心分成了两个子数组,位于标准元素左边子数组中元素的关键字原创 2021-07-06 19:12:17 · 1166 阅读 · 0 评论 -
数据结构----冒泡排序
冒泡排序的基本思想设数组a中存放了n个数据元素,循环进行n-1趟如下的排序过程:第1趟时,依次比较相邻两个数据元素a[i].key和a[i+1].key(i=0, 1, 2, …, n-2),若为逆序,即a[i].key>a[i+1].key,则交换两个数据元素,否则不交换,这样数值最大的数据元素将被放置在a[n-1]中;第2趟时,数据元素个数减1,即数据元素个数为n-1,操作方法和第1趟的类似,这样整个n个数据元素集合中数值次大的数据元素将被放置在a[n-2]中;当第n-1趟结束时,整个n个数据元原创 2021-07-06 11:42:44 · 244 阅读 · 0 评论 -
数据结构----堆排序
堆排序思想在直接选择排序中,待排序的数据元素集合构成一个线性结构,要从有n个数据元素的线性结构中选择出一个最小的数据元素需要比较n-1次。如果能把待排序的数据元素集合构成一个完全二叉树结构,则每次选择出一个最大(或最小)的数据元素只需比较完全二叉树的深度次,即lbn次,则排序算法的时间复杂度就是O(nlbn)。这就是堆排序的基本思想。大根堆的定义设数组a中存放了n个数据元素,数组下标从0开始,如果当数组下标2i+1<n时有a[i].key≥a[2i+1].key,当数组下标2i+2<n时有a[i].k原创 2021-07-05 16:04:21 · 505 阅读 · 0 评论 -
数据结构----选择排序
直接选择排序的基本思想从待排序的数据元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括第一个位置上数据元素的集合中选取关键字最小的数据元素,并将它与原始数据元素集合中的第二个数据元素交换位置;如此重复,直到数据元素集合中只剩一个数据元素为止。算法设计...原创 2021-07-05 08:53:25 · 121 阅读 · 2 评论 -
数据结构----希尔排序
希尔排序的基本思想把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次减少;当完成了所有数据元素都在一个组内的排序后,排序过程结束。希尔排序又称作缩小增量排序。希尔排序是在分组概念上的直接插入排序,即在不断减少组的个数时把原各小组的数据元素插入到新组中的合适位置上。在讨论直接插入排序算法的时间复杂度时,我们曾指出,原始数据元素集合越接近有序,直接插入排序算法的时间效率越高。这个结论是希尔排序算法能够成立的基础。希尔排序算法把待排序数据元素分成若干小组,在小组内用直接插原创 2021-06-29 18:48:01 · 114 阅读 · 1 评论 -
数据结构----直接插入排序
直接插入排序的基本思想顺序地把待排序的数据元素按其关键字值的大小插入到已排序数据元素子集合的适当位置。子集合的数据元素个数从只有一个数据元素开始,逐次增大,当子集合大小最终和集合大小相同时,排序完毕。设待排序的n个数据元素存放在数组a中,初始时,子集合a[0]已排好序;第一次循环准备把数据元素a[1]插入到已排好序的子集合中,这只需比较a[0].key和a[1].key,若a[0].key≤a[1].key,则说明序列已有序,否则将a[1]插入到a[0]之前,这样子集合的大小增大为2;第二次循环准备把数原创 2021-06-29 17:37:42 · 439 阅读 · 0 评论 -
算法分析与设计----从对头到第k个输出
#include <stdio.h>#include <queue>using namespace std;queue<int> qu; //队列void Remove(int array[], int n, int k){ int i,j; for (int i = 0; i < n; i++) { qu.push(array[i]); } for (int i = 1; i <= n; i++) { j = qu.front()原创 2021-04-02 11:32:42 · 81 阅读 · 0 评论 -
算法分析与设计----找第k小的元素
#include <stdio.h>#include <queue>using namespace std;priority_queue< int, vector<int>, less<int> > heap; //堆 less<int>()//内置类型的由小到大排序 greater<int>()//内置类型的由大到小排序int main(){ int n,k,x; printf("请输入无序队列的元素个数和原创 2021-04-02 11:07:46 · 116 阅读 · 0 评论 -
算法分析与设计----贪心算法
贪心算法一.装箱问题代码实现/* Name: Copyright: 贪心算法测试---->解决装箱问题 Author: Date: 02/03/21 21:07 Description: */#include <stdio.h> #include <stdlib.h>#define N 6#define V 100 //固定体积 //1.定义一个结构体,实现链表,有链表的首部,记录剩余的空间量,物品链表的首指针所在位置typedef原创 2021-03-03 22:09:36 · 203 阅读 · 1 评论 -
数据结构----哈夫曼编码
一、基本概念在一棵二叉树中,我们定义从A结点到B结点所经过的分支序列为从A结点到B结点的路径;定义从A结点到B结点所经过的分支个数为从A结点到B结点的路径长度;定义从二叉树的根结点到二叉树中所有叶结点的路径长度之和为该二叉树的路径长度。如果二叉树中的叶结点都带有权值,则可以把这个定义加以推广。设二叉树有n个带权值的叶结点,定义从二叉树的根结点到二叉树中所有叶结点的路径长度与相应叶结点权值的乘积之和为该二叉树的带权路径长度(WPL),即:式中,wi为第i个叶结点的权值,li为从根结点到第i个叶结点的路径原创 2021-06-28 17:49:50 · 3390 阅读 · 0 评论 -
数据结构----线索二叉树
线索二叉树在遍历二叉树时都没有把遍历时得到的结点的后继结点信息和前驱结点信息保存下来,因此,不能像操作双向链表那样操作二叉树。当按某种规则遍历二叉树时,保存遍历时得到的结点的后继结点信息和前驱结点信息的最常用的方法是建立线索二叉树。1.线索二叉树的概念和存储结构对二叉链存储结构的二叉树分析可知,在有n个结点的二叉树中必定存在n+1个空链域。我们希望能利用这些空链,建立起相应结点的前驱结点信息和后继结点信息。我们做如下规定:当某结点的左指针为空时,令该指针指向按某种方法遍历二叉树时得到的该结点的前原创 2021-06-28 16:13:45 · 242 阅读 · 0 评论 -
数据结构----二叉树(二叉树的基本函数)
头文件/* 二叉树节点结构体 */typedef struct Node{ DataType data; struct Node *leftChild; struct Node *rightChild;}BiTreeNode;/* 初始化*/void Initiate(BiTreeNode **root){ *root=(BiTreeNode*)malloc(sizeof(BiTreeNode)); (*root)->leftChild=NULL; (*root.原创 2021-04-27 18:05:26 · 1377 阅读 · 0 评论 -
数据结构----线性表(基础使用)
算法基础#线性表——顺序表的基础用法#include<stdio.h>#include<malloc.h>#include<conio.h> #include<stdlib.h>#define LIST_INIT_SIZE 10#define LISTNCREMENT 10#define ERROR 0#define OK 1#define OVERFLOW -2typedef struct{ int *elem; int len原创 2021-03-23 21:50:52 · 113 阅读 · 0 评论 -
数据结构----回溯算法(迷宫问题)
-回溯算法回溯算法是递归算法的一种特殊形式。回溯算法的基本思想是:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法;当搜索到某个结点、发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支;如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止。由于回溯算法每前进一步,在新的结点上进行的搜原创 2021-04-14 16:01:14 · 528 阅读 · 0 评论 -
数据结构----递归调用(求最大公约数)
理论公式具体代码#include <stdio.h>/* 递归函数 */ int Gcd(int n,int m){ if(n<0||m<0){ //错误 return -1; } if(m==0){ //递归出口 return n; }else if(m>n){ return Gcd(m,n); }else{ return Gcd(m,n%m); }}/* 循环函数 */ int Gcd2(int n,int.原创 2021-04-14 15:20:34 · 442 阅读 · 0 评论 -
数据结构----递归算法(倒立三角)
/* 输出倒立三角 */#include <stdio.h>void Display(int n){ int i; for(i=1;i<=n;i++){ printf("%d ",n); } printf("\n"); if(n>0){ Display(n-1); }}void main(void){ Display(5); getch();}原创 2021-04-13 20:48:38 · 605 阅读 · 0 评论 -
数据结构----递归算法(斐波那契数列)
/* 求第n项斐波那契数列的递归函数*/#include <stdio.h>long Fib(int n){ if(n==0||n==1){ return n; //递归出口 }else{ return Fib(n-1)+Fib(n-2); //递归调用 }}void main(void){ int x; do{ printf("请输入你要求斐波那契数列第几项:"); int n; scanf("%d",&n); x=n; printf("原创 2021-04-13 20:40:38 · 391 阅读 · 0 评论 -
数据结构----递归算法(汉诺塔)
/* 汉诺塔问题 */#include <stdio.h>void Towers(int n, char A, char B, char C){ if(n==1){ //递归出口 printf("%s%c%s%c\n\n","移动盘 1 从 ", A," 到盘 ",C); return; } //把n-1个盘从A盘借助B盘移动到C盘 Towers(n-1,A,C,B); //把圆盘n从A盘直接移动到C盘 printf("%s%d%s%c%s%c原创 2021-04-13 20:27:08 · 211 阅读 · 0 评论 -
数据结构----递归算法(折半查找)
/* 折半查找 查找前的数组必须是有序的 */#include <stdio.h> int BSearch(int a[], int x, int low, int high){ int mid; if(low>high){ return -1; //查找失败 } mid = (low+high)/2; if(x==a[mid]){ return mid; //查找成功 }else if(x<a[mid]){ return BSearch(a原创 2021-04-13 20:03:55 · 4326 阅读 · 3 评论 -
数据结构----递归算法(阶乘)
实践代码/* 计算阶乘函数的递归算法,并给出n = 3时递归算法的执行过程。*/#include <stdio.h> long Fact(int n){ int x; long y; if(n<0){ printf("error!"); return -1; } if(n==0){ return 1; }else{ x = n-1; y = Fact(x); //递归调用 return n*y; }}void main(voi.原创 2021-04-13 19:52:28 · 625 阅读 · 0 评论 -
数据结构----数组(对称矩阵压缩存储)
数组(对称矩阵压缩存储) 设aij为n阶对称矩阵A中i行j列的数据元素,k为一维数组va的下标序号,则其数学映射关系为:注意:数学中,n阶对称矩阵元素aij的下标满足条件:1≤i≤n和1≤j≤n实践具体代码如下:#include <stdio.h>/* n阶对称矩阵 C = A+B,矩阵采用压缩存储*/ void Add(int a[], int b[], int c[], int n){ int i; for(i=0;i<=n*(n+1)/2-1原创 2021-04-13 19:40:04 · 5116 阅读 · 0 评论 -
数据结构----数组(二维数组)
数组(二维数组)/* 二维数组 */ #include <stdio.h>#include <malloc.h>/* 创建二维数组 */int **Make2DArray(int row,int col){ //申请row行,col列的二维数组 int **a,i; a = (int**)calloc(row,sizeof(int *)); for(i=0;i<row;i++){ a[i]=(int*)calloc(col,sizeof(int原创 2021-04-12 20:26:09 · 362 阅读 · 0 评论 -
数据结构----数组(一维动态数组)
数组(一维动态数组)/* 动态数组 ,申请一个数组存放1-10 */#include <stdio.h>#include <malloc.h>void main(void){ int *a,n=10,i; a = (int *)calloc(n,sizeof(int)); for(i=0;i<n;i++){ a[i] = i+1; } for(i=0;i<n;i++){ printf("%d ",a[i]); } getch(); f原创 2021-04-12 20:20:03 · 276 阅读 · 0 评论 -
数据结构----串(两种匹配模式对比)
两种匹配模式效率的对比#include <stdio.h>#include <malloc.h>#include <string.h>#include "DString.h"/* Brute-Force模式匹配*/int BFIndexCount(DString S, int start, DString T){ //返回比较次数 int i = start, j = 0, v; while(i<S.length && j&原创 2021-04-12 19:43:41 · 137 阅读 · 0 评论 -
数据结构----串(Brute-Force算法匹配)
串的Brute-Force算法匹配Brute-Force算法头文件/* Brute-Force模式匹配*/int BFIndex(DString S, int start, DString T){ int i = start, j = 0, v; while(i<S.length && j<T.length){ if(S.str[i]==T.str[j]){ i++; j++; }else{ i=i-j+1; j=0; }原创 2021-04-12 17:14:31 · 187 阅读 · 0 评论 -
数据结构----串(基本操作函数)
串的基本操作函数#include <stdio.h>#include <malloc.h> #include <string.h>/*===========串的动态数组结构体=======================*/typedef struct{ char *str; int maxLength; int length;}DString;/*================初始化串===========================*/原创 2021-04-12 16:50:53 · 623 阅读 · 1 评论 -
数据结构---串
利用c语言自带函数实现姓与名的位置转换/*##串函数的应用 名和姓对换问题 */#include <stdio.h>#include <string.h>void ReverseName(char *name, char *newName){ char *p; p = strchr(name,' '); //p指向空格''位置 *p = '\0'; //把空格换位'\0' 因此name的长度只包含名部分 strcpy(newName,p+1); //指针p+原创 2021-04-12 11:28:28 · 92 阅读 · 0 评论 -
数据结构--顺序优先队列
/**/typedef struct{ int priority; ElemType elem;}DataType; /**/typedef struct{ int size; DataType queue[MaxQueueSize];}SeqPQueue;void QueueInitiate(SeqPQueue *Q){ Q->size = 0;}int QueueNotEmpty(SeqPQueue Q){ if(Q.size<=0){ return 0原创 2021-04-09 11:20:34 · 101 阅读 · 0 评论 -
数据结构--队列:顺序循环队列
顺序循环队列头文件顺序循环队列结构假溢出现象3种情况头文件 /*顺序队列有“假溢出 ”现象,一般使用顺序循环队列 对于顺序循环队列,队列空和队列满的差异区别:1.少用一个存储空间: 队列满:(rear+1)%MaxQueueSize == front; 队列空:rear == front; 2.设置一个标志位tag,初始tag=0;入队成功tag=1;出队成功tag=0; 队列满:rear==front && tag==1; 队列空:原创 2021-04-02 15:32:15 · 377 阅读 · 3 评论 -
数据结构--队列:链队列
链队列的头文件链队列的结构图/*链式队列 除摧毁队列时间复杂度为O(n),其余的都是O(1) *//*===============链式队列结构体============================*/typedef struct qnode{ DataType data; struct qnode *next;}LQNode;/*===============头结点和尾结点=============================*/typedef struct{.原创 2021-04-02 15:26:34 · 159 阅读 · 0 评论 -
数据结构----括号匹配问题(顺序栈解决)
用顺序栈解决括号匹配问题测试代码#include <stdio.h>#include <string.h>#define MaxStackSize 100typedef char DataType;#include "SeqStack.h"void ExpIsCorrect(char exp[], int n){ //判断有n个字符的字符串exp,左右括号是否匹配正确 SeqStack myStack; int i; char c; StackInit原创 2021-03-31 22:06:17 · 261 阅读 · 0 评论 -
数据结构----顺序栈(基本函数与使用)
顺序栈顺序栈相关函数的头文件/*顺序堆栈的相关函数 因为没有循环,时间复杂度为 O(1) *//*==============栈的结构体========================*/typedef struct{ DataType stack[MaxStackSize]; int top;}SeqStack;/*================初始化栈==========================*/void StackInitiate(SeqStack *s){原创 2021-03-31 20:40:35 · 411 阅读 · 0 评论 -
数据结构----循环链表与单链表操作实现的差异描述
循环链表的实现指导说明循环链表与单链表操作实现的差异:1.在初始化函数中把语句(*head)->next = NULL 改为 (*head)->next =head2.在其他函数中把循环条件p->next!=NULL 和 p->next->next !=NULL 中的 NULL 该为头指针 head 即可...原创 2021-03-30 21:38:09 · 215 阅读 · 0 评论 -
数据结构----单链表
单链表的基本使用单链表的相关函数放在LinkList.h头文件中/**单链表的实现与操作 优点:不需要预先确定数据元素的个数缺点:空间单元利用率不高 *//*==================单链表结构体=============================*/ typedef struct Node{ DataType data; //数据域 struct Node *next; //指向下一个结点的指针 }SlNode;/*=================初始化原创 2021-03-30 21:22:38 · 114 阅读 · 0 评论 -
数据结构----顺序表
顺序表基础用法SeqList.h 头文件用来存放顺序表的相关函数与结构体#include <stdio.h>/*顺序表优点:算法简单,内存单元利用率较高 缺点:需要预先确定数据元素的最大个数 *注意:DataType未指定具体的数据类型,需自己定义一下 MaxSize的大小也没有确定,需要根据自己的情况确定 */ /*==================顺序表的结构体======================================*/typede原创 2021-03-29 21:58:17 · 177 阅读 · 0 评论