- 博客(16)
- 收藏
- 关注
原创 【哈夫曼树】
【哈夫曼树】当用 n 个结点(都做叶子结点且都有各自的权值)试图构建一棵树时,如果构建的这棵树的带权路径长度最小,称这棵树为“最优二叉树”,有时也叫“赫夫曼树”或者“哈夫曼树”构建哈夫曼树:1.在 n 个权值中选出两个最小的权值,对应的两个结点组成一个新的二叉树,且新二叉树的根结点的权值为左右孩子权值的和;2.在原有的 n 个权值中删除那两个最小的权值,同时将新的权值加入到 n–2 个权值的行列中,以此类推;3.重复 1 和 2 ,直到所以的结点构建成了一棵二叉树为止,这棵树就是哈夫曼树。哈夫曼
2022-05-29 18:40:28 745
原创 【N皇后问题】
【N皇后问题】八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。我们可以通过回溯算法解决这个问题:回溯算法,又称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯算法。判断位置是否符合要求:bool place(int* paraS
2022-05-29 18:25:04 176
原创 【二叉树的创建与遍历】
二叉树的创建与遍历二叉树是由一个根结点和两棵互不相交的、分别称为左右子树的二叉树组成结构体定义:// 定义树中的结点结构typedef struct BTNode { char element; struct BTNode left; struct BTNode right;}*BTNodePtr,BTNode;// 循环队列表示结点顺序typedef struct BTNodePtrQueue { BTNodePtr* nodePtrs; int
2022-05-24 19:59:56 840
原创 【压缩矩阵的转置】
1.稀疏矩阵的压缩存储,至少需要存储以下信息:矩阵中各非 0 元素的值,以及所在矩阵中的行标和列标;矩阵的总行数和总列数;上图是一个稀疏矩阵,若对其进行压缩存储,矩阵中各非 0 元素的存储状态如图 2 所示:图 2 的数组中,存储的是三元组(即由 3 部分数据组成的集合),组中数据分别表示(行标,列标,元素值)。2、矩阵(包括稀疏矩阵)的转置,即互换矩阵中所有元素的行标和列标图 2a) 表示的是图 1 中转置之前矩阵的三元组表,2b) 表示的是图 1 中矩阵转置后对应的三元组表。矩阵转置
2022-05-19 19:59:24 216
原创 【二维数组与矩阵乘法】
本篇内容主要是用来实现两个二维数组元素相乘,从而得到一个新的矩阵创建二维数组的结构:// 动态创建typedef struct TwoDArray{ int rows; int columns; // 一个*表示指向二维数组的列TwoDArry[0]的首地址,两个*表示指向二维数组TwoDarry[0][0]的首地址 int** elements;}TwoDArray,*TwoDArrayPtr;// 静态创建,主要用来后面看一下地址typedef struct
2022-05-19 14:55:34 1456
原创 【链队列与循环队列】
链队列与循环队列链队列定义链队列的结点typedef struct LinkNode { int data; struct LinkNode* next;}*LinkNodePtr;定义链队列的结构:typedef struct LinkQueue { LinkNodePtr front; LinkNodePtr rear;}*LinkQueuePtr;入队:void enqueue(LinkQueuePtr paraQueuePtr, int para
2022-05-17 20:03:22 414
原创 【 递归实现累加与汉诺塔问题】
汉诺塔问题–递归实现汉诺塔问题是使用递归来实现的一个经典例子汉诺塔上的盘子移动过程:汉诺塔的核心代码:void hanoi(int paraN,char paraSource,char paraTransit,char paraDestination){ if(paraN<=0){ return; }else { hanoi(paraN-1,paraSource,paraDestination,paraTransit); pri
2022-05-11 20:45:20 123
原创 【表达式求值】
表达式求值表达式求值问题涉及到了括号的匹配,运算符的优先级等多种问题,需要从多方面进行考虑。在代码中,给出了可能遇到的7种运算符char opetr_char[7]={'+','-','*','/','%','(',')'};首先要判断一个字符是否是运算符int isOpetrChar(char ch){ int i; for(i=0;i<7;i++){ if(ch == opetr_char[i]) return i; } return
2022-05-10 21:17:23 622
原创 【栈的操作及应用--括号匹配】
栈的操作栈是只在表尾进行插入和删除操作的线性表,把允许插入删除的一端叫做栈顶,另一端叫做栈底,栈又称为先进后出的线性表定义结构体:typedef struct CharStac { int top; int data[STACK_MAX_SIZE];}*CharStackPtr,CharStack;进栈操作:void push(CharStackPtr paraStackPtr,int paraValue) { // 判断栈是否已经满了 if(paraStac
2022-05-10 20:29:38 180
原创 【多项式相加】
多项式相加多项式相加就是将两个多项式中幂相同的数相加起来,运用链表来实现定义结构体:typedef struct LinkNode{ int coefficient; int exponent; struct LinkNode *next;}*LinkList,*NodePtr;初始化链表:LinkList initLinkList(){ LinkList tempHeader = (LinkList)malloc(sizeof(struct LinkNode)
2022-05-06 13:00:26 1042
原创 【静态链表】
静态链表用数组描述的链表叫做静态链表;让数组的元素由两个数据域组成,data和;数据域data,cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。定义静态链表:初始化静态链表:静态链表的插入:静态链表的删除:全部代码:运行结果:...
2022-05-03 20:27:49 908 4
原创 【双向链表】
双向链表双向链表也叫双链表,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。结点结构:双链表的基本结构:定义双链表的结构体 :typedef struct DoubleLinkedNode{ char data; struct DoubleLinkedNode *previous; struct DoubleLinkedNode *next;} DLNode, *DLNodePtr;创建头结点
2022-05-03 19:48:43 467 1
原创 【链表的基本操作】
链表的基本操作链表是数据存储的一种链式结构,使用链表存储的数据元素,其物理存储位置是随机的。数据元素随机存储,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。链表的节点链表中每个数据的存储都由以下两部分组成:数据元素本身,其所在的区域称为数据域;指向直接后继元素的指针,所在的区域称为指针域一个存储 {1,2,3} 的完整链表结构如图 定义链表结构体:typedef struct LinkNode { char data; struct LinkNode *nex
2022-04-29 19:26:32 755
原创 【线性表的基本操作】
线性表是最基本、最简单、也是最常用的一种数据结构,是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的以下代码实现了线性表的一些基本操作:初始化、数据插入、数据删除、数据输出等操作自己写的代码//返回目的位置的元素 int getElement(SequentialListPtr paraListPtr, int paraPosition) { //判断元素位置是否
2022-04-25 22:43:25 151
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人