![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 66
BeALinuxGraphicCoder
代码是最好的自我介绍
展开
-
单向链表-C语言实现
只实现了几个简单的操作。在Linux内核中链表的使用非常多,不过使用方法与本例完全不一样。后续有时间再详述。 ChainNode.c#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_DATA_LEN 128#define CN_TRUE 0#define CN_...原创 2018-06-20 23:20:54 · 859 阅读 · 0 评论 -
插入排序
#include <stdio.h>#include <stdlib.h>void ShowArr(const int arr[], int len);void Sort(int arr[], int len){ printf("\nBefore sort: "); ShowArr(arr, len); int key, sortedIndex, j;...原创 2018-11-26 10:14:46 · 118 阅读 · 0 评论 -
外部排序 - 基于堆排序(最大堆)+最大赢者树完成 - C语言
传统的排序算法,需要将所有元素加载至内存.当对巨大数量的元素进行排序时,对系统资源要求比较高.这类算法称为内部排序法,比如冒泡排序,插入排序,堆排序.外部排序,则是每次进行部分排序,然后将各组部分排序的结果合并,再次排序得到最终的结果.本文中的程序用最大堆和最大赢者树完成了一个外部排序算法,基本思想如下:1. 将N个元素的大数组拆成每个元素为M的子数组,得到X=(N/M)个子数组;...原创 2018-07-19 22:24:14 · 1738 阅读 · 0 评论 -
堆排序 - 通过最大堆实现 - C语言
堆排序实际上是利用了完全二叉树的公式化描述特性,将一个数组以最大堆的方式呈现,并逐一删除其根节点。几个概念要理解:假设完全二叉树中一元素的序号为i,1 <= i <= n,则以下关系成立:1. 当i=1时,该元素为二叉树的根。若i>1,则该元素父节点的编号为i/2(int取整);2. 当2i>n时,该元素无左孩子,否则,其左孩子的编号为2i;3. 当2i+1>n时,该...原创 2018-07-07 17:47:21 · 1089 阅读 · 0 评论 -
赢者树WinnerTree - C语言
写WinnerTree实在是一件烧脑的事情。。。相关概念如下:赢者树:对于 n名选手,赢者树是一棵包含n个外部节点,n-1个内部节点的完全二叉树。其中每个内部节点记录了相应赛局的赢家。最大赢者树即每次都是值大的胜出;最小赢者树每次都是值小的胜出。赢者树采用数组公式化描述,最核心的是如何根据外部节点的序号计算内部节点的序号,公式如下:内部节点inner_index = (外部节点outer_inde...原创 2018-07-12 22:30:16 · 713 阅读 · 1 评论 -
二叉树 - 链表实现 - C语言
实现了二叉树的前序遍历,中序遍历,后序遍历,逐层遍历。其中逐层遍历,使用了TreeQueue.h里面定义的队列Queue。因此,程序由两个文件组成,BinaryTree.c和TreeQueue.h。程序输出:$ ./BinaryTree *****Tree***** + * /a b c d**************PreOrder:+ * a b / c d ...原创 2018-07-03 22:20:36 · 974 阅读 · 0 评论 -
Hashtable - C语言实现
程序要点:1. 原则上,谁malloc谁负责free;2. hash_index的计算:使用key字符串每个字符之和% max_node_index;3. 不允许添加相同的struct node *n,即对应的key=value已经在table中存在则添加失败;4. 允许相同的key,但不同的value.以单向链表的形式存放于table->nodes[hash_index]中。HashTab...原创 2018-07-02 22:06:38 · 1187 阅读 · 2 评论 -
高度优先左高树(HBLT) - C语言
相关概念:左高树(leftist tree)将树中的节点分为两类:外部节点:用于代替树中的空子树;其余节点均叫做内部节点.内部节点就是我们所能看到的树中的每个真实节点,如果某个节点的左子树为空,那它的这个左子树就是外部节点.外部节点的引入,其实主要是为了下面s(x)这个概念的计算,并不具备其它实际意义.s(x)为节点x至它的子树的外部节点的所有路径中最短的那一条.比如根节点30,左子树为20(内部...原创 2018-07-08 22:25:30 · 1961 阅读 · 0 评论 -
线性表
线性表是一种非常简单的数据结构,采用数组描述,非线程安全。LinearList.c#include <stdio.h>#include <stdlib.h>#define LL_TRUE 0#define LL_FALSE 1#define LL_ERROR -1typedef struct LinearList LinearList;struct ...原创 2018-06-19 23:50:26 · 115 阅读 · 0 评论 -
队列 - 采用数组实现 - C语言
根据初始化size参数,动态申请元素空间.#include <stdio.h>#include <stdlib.h>#include <string.h>#define RET_TRUE 0#define RET_FALSE -1typedef struct Queue Queue;struct Queue { char **da...原创 2018-06-30 16:53:35 · 401 阅读 · 0 评论 -
二分搜索
/* * 二分搜索:适用于从有序数组中寻找指定元素。提供了两个方法,作为对比,优先方法二。 * */#include <stdio.h>static void print_arr(int arr[], int arr_size){ int i; if(NULL == arr || arr_size <= 0) return; for(i = 0; i ...原创 2018-06-15 23:03:40 · 86 阅读 · 0 评论 -
堆栈 - 采用数组实现 - C语言
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_STACK_SIZE 10#define STACK_TRUE 0#define STACK_FALSE 1#define STACK_ERROR -1struct stack { char *data[...原创 2018-06-22 23:40:22 · 437 阅读 · 0 评论 -
Linux内核的双向链表
内核的双向链表,搞清楚以下两点就明白了:1. 把链表节点嵌入到数据结构中,而不是在链表节点中嵌入数据成员。比如,我们一般习惯这么定义链表:struct city { char name[128]; char province[128]; int population; struct city *next; strcut city *prev;};内核里面的用法:struct list...原创 2018-06-22 22:45:00 · 197 阅读 · 0 评论 -
冒泡排序的改进
假如输入本身就是有一个有序的数组,或者在经过一轮循环后就已经有序,则之前的冒泡排序和选择排序都做了不少不必要的循环比较。因此,添加一个判断,如果报文在某次循环后已经有效,则停止排序。以BubbleSort.c为例进行修改。BubbleSort_v2.c:/* * 冒泡排序v2:1. 对相邻的元素进行比较,如果左边的元素大于右边的元素,则交换这两个元素. * 2. 如果在某...原创 2018-06-14 23:15:31 · 188 阅读 · 0 评论 -
冒泡排序
BubbleSort.c/* * 冒泡排序:对相邻的元素进行比较,如果左边的元素大于右边的元素,则交换这两个元素. * 算法复杂度:与选择排序相同,等于O(n^2). * */#include <stdio.h>static void print_arr(int arr[], int arr_size){ int i; if(NULL == arr || arr...原创 2018-06-14 22:57:10 · 107 阅读 · 0 评论 -
选择排序
作为软件工程科班出身的程序员,数据结构与算法是必修课,可惜自己没有好好学,工作中也用的非常少.决定从今天起,把这门课重头学一遍,里面涉及的数据结构与算法,自己全部写一遍.看看能够坚持多久开篇从经典的排序算法-选择排序开始:/* * 选择排序:首先找出最大的元素,把它移动到a[n-1],然后在剩余下n-1个元素中寻找最大的元素,并把它移动到a[n-2],依次排序. * 算法复杂度:比较的次数是固...原创 2018-06-14 22:33:50 · 133 阅读 · 0 评论 -
三重指针使用demo
#include <stdio.h>#include <stdlib.h>/* * pop_out函数弹出size个(void *)类型的元素保存至数组(void*) arr[]中. * 因为每次弹出的数量不确定,所以数组arr的大小需要动态申请. * (*arr_p)等价于外部的 arr; arr_p 等价于 &arr */void pop_o...原创 2019-07-12 11:56:12 · 422 阅读 · 0 评论