
数据结构
凤源blog
永不言弃
展开
-
单链表归并排序
/*输入元素,-1结束输入*/#include <iostream>#include <malloc.h>using namespace std;typedef struct LNode { int data; struct LNode *next;} *LinkList;void List_TailInsert(LinkList &L) { int c; LinkList p; L = (LinkList) malloc (sizeof(LNo原创 2020-10-21 20:43:13 · 123 阅读 · 0 评论 -
二叉树的横向打印
/*二叉链表的树状打印AB#D##CE#F###124##5##36##7##*/#include <iostream>#include <malloc.h>using namespace std;const int maxsize = 100;typedef struct BiNode{ char data; BiNode *lchild, *rchild;}*BiTree;void createTree(BiTree &t){ char原创 2020-09-15 15:56:18 · 657 阅读 · 0 评论 -
循环链表实现k阶斐波那契数列
/*循环队列 实现 k阶斐波那契数列注意:1、maxsize是队列大小+1,输入的k值不能超过max-1 2、使用循环注意更新循环变量 输入:10 1020 1030 20*/#include <iostream>#include <malloc.h>using namespace std;const int maxsize = 100+1;struct Queue{ int data[maxsize]; int front, rear; in原创 2020-09-14 14:52:22 · 501 阅读 · 0 评论 -
双循环链表根据查询次数非递增排序
/*双向循环链表新增freq每进行一次locate操作,freq增1并按照freq非递增排序输入:1 2 3 4 5 -1 */#include <iostream>#include <malloc.h>using namespace std;const int FLAG = -1;typedef struct DNode{ int data; struct DNode *prior, *next; int freq;}DNode, *DLinkLi原创 2020-09-14 09:11:01 · 131 阅读 · 0 评论 -
递归删除二叉树结点并释放空间
/*递归算法删除值为x的整棵子树,并释放空间输入:高度为3的满二叉树:124##5##36##7## 删除结点:2 6 */#include <iostream>#include <malloc.h>#include <deque>using namespace std;const int MAXSIZE = 100;typedef char ElemType;typedef struct BiTNode{ ElemType data;原创 2020-09-14 08:36:50 · 2346 阅读 · 1 评论 -
冒泡排序改写
/*起泡排序算法(冒泡排序算法的改进)经控制作用的布尔变量改为一个整型变量,指示每一趟排序中进行交换的最后一个记录的位置并以它作为下一趟起泡排序循环终止的控制值*/#include <iostream>using namespace std;void bubbleSort(int a[], int n){ int i, j; int isChange; isChange = 0; for(i=0; i<n; i++){ for(j=n-1; j>=isCha原创 2020-09-05 17:53:23 · 405 阅读 · 0 评论 -
非递归快速排序(待排记录数<=3,使用直接插入排序)
/*非递归快速排序使用栈存放待排序列的首尾下标 */#include <iostream>#include <stack>using namespace std;int partition(int a[], int low, int high){ int pivok = a[low]; while(low<high){ while(low<high && a[high]>pivok) high--; a[low] = a[h原创 2020-09-05 10:19:02 · 122 阅读 · 0 评论 -
奇偶交换排序
/*奇偶交换排序思路:使用循环,先从奇数位置开始两两比较,再在偶数位置两两比较,直到全部有序出现过的错误:奇偶循环中的循环条件要设置为i+1处,i+1位置可能越界 */#include <iostream>using namespace std;void jiouSort(int a[], int n){ int i; bool isChange = true; while(isChange){ isChange = false; for(i=0; i+1&l原创 2020-09-05 08:35:23 · 997 阅读 · 0 评论 -
直接插入排序变体
/*直接插入排序第k+1个数做观察哨 */ #include <iostream>#include <malloc.h>using namespace std;const int maxsize = 100;struct List{ int r[maxsize]; int length;};void insertSort(List &L){ int i, j; if(L.length){ for(i=2; i<=L.length; i++原创 2020-09-05 08:18:33 · 116 阅读 · 0 评论 -
相似二叉树(非递归)
/*相似二叉树判断:非递归实现相似:两个二叉树都是空的二叉树或只有一个根结点 或者 左右子树都是相似的通俗说法:两棵树的结构一样,一棵树某个位置有结点另一棵树相对应位置也有思路:层次遍历的变体,依次判断两树对应结点是否都空或都不空如果只是通过先序输入判断是否相似,可以直接比较序列的对应位置 */#include <iostream>#include <cstdlib>#include <queue>using namespace std; typ原创 2020-08-31 07:53:39 · 557 阅读 · 0 评论 -
树(二叉链表,非递归)两结点的最近公共祖先结点
/*二叉链表非递归 查找两个结点的最近公共结点思路:把一个结点的全部父结点都放到栈中(类似于查找从根结点到某一结点的路径)依次出栈判断这棵树的后代中是否包括另一个结点*/#include <iostream> #include <cstdlib>using namespace std;const int maxsize = 100;typedef struct BiTNode{ char data; struct BiTNode *lchild, *rc原创 2020-08-29 10:15:44 · 341 阅读 · 0 评论 -
判断顺序存储的二叉树中u结点是否是v结点的子孙结点(已知孩子结点)
/*使用两个数组存储一个结点的左孩子和右孩子(数字存储,0表示空),判断结点u是否为结点v的子孙思路:将结点v的非空子结点全部入队 ,判断是否有结点u 输入深度为3的满二叉树:72 34 56 70 0 0 0 0 00 0uv值:1 2; 2 1; 1 1 ; 0 0 ;6 2;6 3*/#include <iostream>using namespace std;const int maxsize = 100;bool f(int L[], int原创 2020-08-29 09:16:28 · 714 阅读 · 0 评论 -
判断顺序存储的二叉树中u结点是否是v结点的子孙结点(已知父结点)
/*一维数组T表示二叉树,第i个分量表示第i个结点的双亲,判断结点u是否为结点v的子孙结点思路:将结点u的祖先结点全部入队,看有没有结点v输入:高度为3的二叉树:0 1 1 2 3uv: 5 2;2 5;1 3;3 1;4 2;2 4;4 3;3 4; */#include <iostream>using namespace std;const int maxsize = 100;bool f(int T[], int n, int u, int v){ //结点u原创 2020-08-29 09:15:34 · 782 阅读 · 0 评论 -
求二叉树各个结点的子孙结点数
/*在二叉链表中增加DescNum域,求二叉树每个结点的子孙数目并存入DescNum域思路:初始全部设置为0,使用递归计算子孙结点数输入:三层的满二叉树:124##5##36##7##*/#include <iostream>#include <malloc.h>#include <deque>using namespace std;const int maxsize = 100;typedef struct BiTNode{ char da原创 2020-08-28 08:45:03 · 3293 阅读 · 0 评论 -
二叉树到指定叶子结点的路径(要求深度比树的深度小1)
/*二叉树求一条路径,从根结点开始到叶子结点,长度=深度-1多条输出最左边的一条思路:1、求二叉树的深度2、层序遍历 1数值和长度是否符合 2是不是叶子结点参照 二叉树从根结点到指定结点的路径问题后序非递归遍历的变体注意:由于栈是从-1开始计数的,所以栈非空的条件必须设置为top>=0,而不能设置为top>0,否则就会出现错误 输入:深度为3的满二叉树124##5##36##7##分别输入结点4 5 2 3查看路径*/#include <iostrea原创 2020-08-28 08:30:53 · 368 阅读 · 0 评论 -
二叉树繁茂度
/*二叉树的繁茂度 = 最大宽度 * 树的高度思路:分别求树的最大宽度和高度,求乘积输入:高度为3的满二叉树:124##5##36##7##高度为3的完全二叉树:124##5##36###*/#include <iostream>#include <malloc.h>#include <deque>using namespace std;const int maxsize = 100; //三元组最多个数 typedef struct BiT原创 2020-08-27 13:24:20 · 2100 阅读 · 0 评论 -
根据三元组创建二叉树
/*三元组输入二叉树(父结点,子结点,标识符(L/R))层次输入构建对应的二叉树举例^ALABLACRBDLCELCFRDGRFHL^^L二叉树: A / \ B C / /\ D E F \ / G H思路:层次遍历的变体*/#include <iostream>#include <malloc.h>#include <deque>using namespace std;cons原创 2020-08-26 15:04:01 · 754 阅读 · 0 评论 -
复制二叉树
递归/*复制一棵二叉树的非递归算法*/#include <iostream>#include <deque>#include <malloc.h>using namespace std;typedef struct BTNode { int data; struct BTNode *left, *right;}*BiTree;BiTree creat_bt(){ //按扩展前序建二叉树 BiTree t; int x;原创 2020-08-26 07:59:25 · 466 阅读 · 0 评论 -
递归求平均值
/*递归套餐*/#include <iostream>using namespace std;//递归求平均值double diguiAvg(double L[], int n, int i, int sum) { if(i==n-1) return (sum+L[i])/n; else diguiAvg(L, n, i+1, sum+L[i]);}double diguiAvg1(double A[], int n){ float avg; if(n==1)原创 2020-08-24 08:14:02 · 871 阅读 · 0 评论 -
单向循环链表改为双向循环链表
/*单项循环链表改双向循环链表data数据域,next后继结点指针域,prior前驱结点指针域说明:这里的链表带头结点*/#include <iostream> #include <cstdlib>using namespace std;const int flag = -1;typedef struct SiLinkCirList{ int data; struct SiLinkCirList *next, *prior;}*List;//创建单向循环原创 2020-08-20 08:17:43 · 3271 阅读 · 0 评论 -
单链表模拟循环队列
/*带头结点的循环链表表示队列只设一个指针指向队尾元素结点编写相应的队列初始化、入队列和出队列的算法*/#include <iostream>#include <cstdlib>using namespace std;const int flag = -1;typedef struct Queue{ int data; struct Queue *next;}*LinkQueue;LinkQueue initList(LinkQueue &Q){原创 2020-08-19 14:17:29 · 1087 阅读 · 0 评论 -
单链表(升序)交集,结果放到一个单链表中
/*单链表AB递增有序找到相同的元素放到A中(最后A是交集)最后的交集元素各不相同*/#include <iostream>#include <cstdlib>using namespace std;const int flag = -1; typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}*LinkList;void tailInsert(LinkL原创 2020-08-18 08:15:45 · 278 阅读 · 0 评论 -
有序的线性表ABC,在A中删除BC的交集
线性表是单链表/*递增有序的单链表ABC(表内元素可以重复)删去表A中BC的交集元素*/#include <iostream>#include <cstdlib>using namespace std;typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}LNode, *LinkList;//尾插法创建链表//输入元素单个空格分隔,回车结束输入 void原创 2020-08-18 08:02:36 · 925 阅读 · 0 评论 -
删除单链表中值相同的多余元素
/*删除单链表(有头结点)中所有值相同的多余元素,同时释放被删除的结点空间思路:依次遍历单链表中的全部结点,判断该位置后边有没有重复的结点,如果有重复的结点,则删除该结点并释放空间 */#include <iostream>#include <cstdlib>using namespace std;const int flag = -1;typedef int ElemType;typedef struct LNode{ ElemType data; str原创 2020-08-15 09:51:05 · 2664 阅读 · 0 评论 -
两个单链表的批量插入删除
/*指针la和lb分别指向两个 无头结点 单链表中的首元结点。从表la中删除第i个元素起共len个元素,将它们插入到表lb中第j个元素之前。思路:找la表的第i-1、i、i+len-1个结点,找lb表第j-1个结点删除:把la表第i-1的结点指向第i+len的元素插入:把lb表第j-1的结点指向la表第i个结点,la表第i+len-1的结点指向lb表第j个结点*/#include <iostream>#include <cstdlib> using namesp原创 2020-08-15 09:29:59 · 358 阅读 · 0 评论 -
提取单链表中不重复的元素
/*集合A包含集合B中不重复的元素思路:已知一个"纯集合"B,试构造一个集合 A,使 A 中只包含 B 中所有值各不相同的数据元素。 */#include <iostream>#include <cstdlib>using namespace std;const int flag = -1;typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *next;}*LinkLi原创 2020-08-14 07:55:27 · 532 阅读 · 0 评论 -
单链表合并
/*已知集合 A 和 B,求两个集合的并集,使 A=A∪B,且 B 不再单独存在。 */#include <iostream>#include <cstdlib>using namespace std;const int flag = -1;typedef int ElemType;typedef struct LinkNode{ ElemType data; LinkNode *next;}*LinkList;LinkList List_TailInser原创 2020-08-13 13:55:13 · 296 阅读 · 0 评论 -
两种图的结构
邻接矩阵const int MAX_VERTEX_NUM = 20; //最大顶点数const int MAX_EDGE_NUM = 95; //最大边数:(20-19)/2typedef int VertexType; //顶点类型typedef int EdgeType; //边权值类型struct MGraph{ VertexType vex[MAX_VERTEX_NUM]; //顶点表 EdgeType edge[MAX_EDGE_NUM][MAX_EDGE_NUM]; //边的权.原创 2020-08-04 08:41:20 · 207 阅读 · 0 评论 -
折半查找
//折半查找#include <iostream>#include <cstdlib>using namespace std;//非递归折半查找int binarySearch1(int A[], int n, int e){ int low, mid, high; low=0; high=n-1; while(low<=high){ mid = (low+high)/2;// cout << mid << " " <&l原创 2020-08-04 07:40:17 · 98 阅读 · 0 评论 -
数组归并排序
#include <iostream> #include <cstdlib>using namespace std;void print(int A[]) { int i; for(i=0; i<5; i++) cout << A[i] << " "; cout << endl;// system("pause");}/*归并排序思路:1、归并排序:条件(小下标小,大下标大); 分别对左半段和右半段进行归并排序,然原创 2020-08-03 08:59:18 · 261 阅读 · 0 评论 -
选择排序和冒泡排序
选择特点:和同一个数比较,最后交换简单选择排序:不断把最小值放到最前面void SelectSort(int A[], int n){ int i, j, min; //min是最小值下标 for(i=0; i<n; i++){ min = i; for(j=i+1; j<n; j++) if(A[j]<A[min]) min = j; if(min!=i) swap(A[i], A[min]); }}双向选择排序:不断把最大的放在最后,最小原创 2020-08-02 08:24:29 · 151 阅读 · 0 评论 -
线性表的查找和交换
/*题目源自王道数据结构如果找到要查找的元素,将要查找的元素前移一位在顺序表和单链表中实现说明:在顺序表中,通过折半查找进行查找,找到待查找元素之后交换位置在单链表中,通过两种方法进行交换,一种是结点不变,交换结点的值,函数类似于顺序表;另一种是交换结点 问题:使用链式结构的顺序结构,在初始化的时候如果录入的元素超出了初始的空间,应该怎样扩大空间并继续保存录入*/#include <iostream>#include <cstdlib>using namesp原创 2020-07-28 12:46:41 · 667 阅读 · 0 评论 -
折半查找
/*折半查找说明:使用顺序表做数据结构,下标从0开始 */#include <iostream>#include <cstdlib>>using namespace std;const int INITSIZE = 100;typedef int ElemType;struct SqList{ ElemType *elem; int length;};//初始化顺序表 void InitList(SqList &l){ ElemType e原创 2020-07-28 08:29:00 · 121 阅读 · 0 评论 -
二叉树的双分支结点数
/*二叉树的双分支结点个数思路:在先序遍历的基础上修改 */#include <iostream>#include <cstdlib>#include <queue>using namespace std;const int MAXSIZE = 100;typedef char ElemType;typedef struct BitNode{ ElemType data; struct BitNode *lchild, *rchild;}*BiT原创 2020-07-27 13:45:58 · 3874 阅读 · 0 评论 -
二叉树的层次遍历(递归和非递归)
/*二叉树的层次遍历结果:递归和非递归内容源自网络,部分代码修改*/#include <iostream>#include <cstdlib>#include <queue>using namespace std;typedef char ElemType;typedef struct BitNode{ ElemType data; struct BitNode *lchild, *rchild;}*BiTree;//创建二叉树void Cre原创 2020-07-27 08:35:32 · 656 阅读 · 0 评论 -
二叉树最大宽度
/*二叉树的宽度(即具有结点数最多的那一层的结点数)思路:在二叉树的层次遍历算法的基础上修改 */#include <iostream>#include <cstdlib>#include <deque>using namespace std;typedef char ElemType;typedef struct BitNode{ ElemType data; struct BitNode *lchild, *rchild;}*BiTree;/原创 2020-07-27 08:13:46 · 206 阅读 · 0 评论 -
交换二叉树中所有结点的左右结点
/*交换二叉树中所有结点的左右结点*/#include <iostream>#include <cstdlib>#include <deque>using namespace std;const int MAXSIZE = 100;typedef char ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild;}*BiTree;//创建二叉树原创 2020-07-26 13:14:25 · 813 阅读 · 0 评论 -
判断满二叉树
/*判断二叉树是否是满二叉树思路:满二叉树的叶子结点数=2的(n-1)次方,n代表树的高度(一个结点表示树的高度为1) */#include <iostream>#include <cstdlib>#include <cmath>using namespace std;typedef char ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild原创 2020-07-26 08:49:28 · 1527 阅读 · 0 评论 -
相似二叉树
/*判断二叉树是否相似相似:两个二叉树都是空的二叉树或只有一个根节点 或者 左右子树都是相似的算法源自王道数据结构 */#include <iostream>#include <cstdlib>using namespace std; typedef char ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild;}*BiTree;//创建二叉树voi原创 2020-07-26 08:14:11 · 1231 阅读 · 0 评论 -
二叉树的遍历
/*二叉树的遍历(先序中序后序,递归非递归) 输入示例:124##5##36##7##(高度为3的满二叉树) */#include <iostream>#include <cstdlib>using namespace std;const int MAXSIZE = 100;typedef char ElemType;typedef struct BiTNode{ ElemType data; struct BiTNode *lchild, *rchild;}原创 2020-07-26 07:46:17 · 112 阅读 · 0 评论