![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 71
jack_ooneil
做人如果没有梦想和咸鱼有什么分别?
展开
-
C语言实现无头链表的基本操作
记录下学习过程,方便以后查看。自己参考些资料,瞎捣鼓的,有不对的地方欢迎指正,谢谢。直接上代码:linkList.h #ifndef _LINKLIST_H_#define _LINKLIST_H_#include #include #include typedef int ElemType;typedef struct _linkList{原创 2015-05-30 15:04:20 · 749 阅读 · 0 评论 -
排序算法——插入排序
以前学习严蔚敏版的数据结构在博客也写过这个算法,现在回过头来看觉得当时思路有点混乱,写得比较复杂而且难理解,现在学习数据结构基础时重写一下,个人觉得数据结构基础比严蔚敏版的要好,因为分析得更加详细思路更清晰,也有完整代码,当然也可能是我第二次学习数据结构的原因。插入排序的原理:首先将线性表的第一个元素当成有序表,然后从第二个元素开始,依次插入到第有序表中完成排序。例如,有数组原创 2016-06-01 10:55:24 · 348 阅读 · 0 评论 -
迷宫问题
想了很久, 终于做出来了, 不过数据结构的设计基本都是参照数据结构基础书上来的,如如何表示不同方向?怎么根据不同方向计算下一个位置的坐标等,数据结构设计的好做起来就相对会更方便。大致流程:1. 设计表示数据的结构。如迷宫可以用一个二维数组表示, 坐标也可以用二维数组表示, 移动的方向也可以用一个结构体表示,不同方向存在一个一维数组中, 这样设计的好处是方便计算下一个位置的坐标,以及遍历各个原创 2016-05-19 12:32:01 · 338 阅读 · 0 评论 -
改进的插入排序算法
使用数组来做插入排序时有三个过程。第一:要在有序表中查找插入的位置。第二: 要移动元素,以存储新的元素。第三:插入元素。插入元素很简单,给数组赋值就可以了,主要的优化在第一步和第二部,共有2中改进方法,分别对应第一步和第二步。1. 折半插入排序。 这种改进的方法主要是在上诉第一步,因为是有序表,如果使用折半查找效率比顺序查找高很多。2. 链式插入排序。原创 2016-06-01 20:40:54 · 1207 阅读 · 0 评论 -
快速排序的改进方法
可以在选择中枢结点时,选择left, right,(left+right)/2三个位置中关键字居中的元素。注意需要将选好的中枢结点与左端元素交换位置,因为如果不交换位置,算法就有问题了,这是由于right--在left++先执行,导致right最后退出循环时指向的值一定比中枢结点值小。例如选择的是right作为中枢结点,最后一步会把更小的值交换到最后。void quickSort(Element ...原创 2016-06-02 12:37:20 · 2790 阅读 · 0 评论 -
排序算法——快速排序
基本思想:1、 采用分治法,每次选择数组中一个元素(通常为第一个)作为关键字,将数组分成两个段,左边部分元素都小于关键字,右边部分元素都大于关键字。2.、采用递归的方法,分别对左边部分、右边部分依次递归。代码如下:// arr 为需要排序的数组,low 和 high 表示数组的下标,需要从low 到high 进行排序void qSort(int arr[], i原创 2015-06-08 01:08:52 · 411 阅读 · 0 评论 -
带头循环单链表的基本操作
记录一下写过的代码://list.h#include //封装一个带头循环单链表typedef struct Element{ int data; //other field} Element;typedef struct Node{ Element elem; struct Node * link;}Node;原创 2016-05-20 17:15:30 · 415 阅读 · 0 评论 -
排序算法——堆排序
堆其实是一颗完全二叉树, 结点编号从左到右,从上到下依次递增。通常为了方便计算 根节点的左右孩子结点,会从下表1开始计数。如下面的二叉树,用数组可以表示为:如一个数组为: A = {16, 4, 10, 14, 7, 9, 3, 2, 8, 1}其中 A[1] = 16, A[0] 不使用。其实不从1开始也可以:比如假设 root = i, 那么左孩子 为 2 *i + 1, 右孩子为 2 * i...原创 2016-06-03 11:47:19 · 330 阅读 · 0 评论 -
带头双向循环链表的插入和删除
typedef struct Element{ int elem; /*other field*/}Element;typedef struct Node * NodePointer;struct Node { Element data; NodePointer llink; NodePointer rlink;};原创 2016-05-21 16:07:22 · 1118 阅读 · 0 评论 -
排序算法——归并排序(递归)
参考了博文http://blog.csdn.net/morewindows/article/details/6678165/归并排序和快速排序的比较相似, 都是用分治法 + 递归来实现, 不过顺序刚好是反过来的。 快速排序是先找中枢点,将线性表分成2个区域,然后依次对左边部分排序、右边部分排序,是一个不断细化表的过程;而归并则是不停的将两个表合并成一个表的过程,typedef st原创 2016-06-02 17:37:50 · 488 阅读 · 0 评论 -
二叉搜索树的查找、插入、删除操作
对于查找和插入操作相对来说比较简单,删除操作则需要考虑的情况较多。比如有以下些情况,可能有些可以合并,但是我没想到更好的方法,因此代码里有一堆if else,虽然我不喜欢写这样的代码,但也没找到更好的方法。1. 考虑是否是空树、或者需要删除的结点不在树中。2. 考虑整棵树只有一个结点,删除后需要修改入参,将整棵树置空。3. 考虑删除的结点是叶子结点。4. 待删除的结点只原创 2016-05-30 20:37:52 · 715 阅读 · 0 评论 -
用数组创建二叉树的一种方法
很多面试题都是二叉树相关的, 因此经常需要测试自己的写的程序, 那么创建二叉树就必不可少, 用数组中的值初始化二叉树是一种比较简单的方法.typedef struct BSTreeNode{int m_nValue;struct BSTreeNode * m_pLeft;struct BSTreeNode * m_pRight;}BSTreeNode;原创 2016-07-06 17:33:02 · 10708 阅读 · 1 评论 -
红黑树性质的理解
【算法导论】红黑树详解之一(插入)2015年02月11日 ⁄ 综合 ⁄ 共 7264字 ⁄ 字号 小 中 大 ⁄ 评论关闭 本文地址:http://blog.csdn.net/cyp331203/article/details/42677833 作者:苦_咖啡 欢迎转载,但转载请注明出处,否则转载 2017-08-16 12:04:17 · 5240 阅读 · 0 评论 -
稳定排序和不稳定排序
稳定排序和不稳定排序转自: 转自:http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是转载 2016-05-31 17:59:47 · 236 阅读 · 0 评论 -
用单链表实现双向队列
纯为了练习码代码, 熟悉一下链表的使用#include #include #define DQSIZE 10#define LEFT 0 //左边#define RIGHT 1 //右边typedef struct Element{ int key; /*other field*/} Element;typ原创 2016-05-18 17:35:28 · 434 阅读 · 0 评论 -
循环队列
简单循环队列实现及测试#include #include #define QSIZE 10typedef struct Element{ int key; /*other field*/} Element;typedef struct Queue{ Element elem[QSIZE]; int front;原创 2016-05-18 12:07:56 · 253 阅读 · 0 评论 -
C语言实现栈的基本操作
直接上代码:#ifndef _SEQSTACK_H_#define _SEQSTACK_H_//顺序栈#include #include #include #define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int ElemType;typedef struct{原创 2015-05-30 15:17:26 · 850 阅读 · 0 评论 -
字符串常用操作的源码,拷贝、连接、比较、子串匹配
直接上代码:一、字符串连接:1. //src字符串连接到dest后面char * strcat(char * dest, const char * src){char *temp = test;while(*dest){dest++;}while((*dest++ = *src++) != '\0');return test;}2. //原创 2015-06-05 22:30:28 · 648 阅读 · 0 评论 -
直接插入排序法
基本思想:以数组为例,假设需要对N个元素的数组排序。将数组的分成两部分,一部分有序,一部分无序,遍历无序的数组,把其中元素插入到有序数组中,完成数组的排序。第一步,假设第一个元素或最后一个元素为有序数组,然后把N-1 个元素逐个插入到有序数组中。1. 先写写 将元素插入有序数组中的算法,以下有点类似与无头链表的插入,需要判断是不是在首位置,若设置“哨兵”就可以不用每次循环中判断原创 2015-06-08 00:43:12 · 805 阅读 · 0 评论 -
广义表的读取和输出,树的拷贝及比较的实现
1. 树采用链表的形式保存,每一个节点设计成一个数据域和n个指针域, n为树的度,为了方便固定为树的最大度,但是有点浪费空间。2. 实现的函数使用到栈来处理,遍历树时采用递归的方法。//tree.h#include #define DEGREE 3 typedef struct Node{ char ch; struct Node * link[原创 2016-05-23 18:29:13 · 1331 阅读 · 0 评论 -
二叉树的创建、销毁、各种递归、循环遍历方法(可运行测试)
因为二叉树的定义就是递归的, 所以二叉树、创建、销毁和各种遍历操作都使用递归的方法,会比较好理解。递归其实主要运用到了系统工作栈, 因此可以使用递归实现的,借助用户栈一般也可以实现, 本文中三种遍历方法都使用递归和循环两种方法实现。也可以使用队列来进行层序遍历。由此可见,队列和栈是两种很基础的工具,应该熟练掌握其使用方法。本文中的各种函数都可以输入不同二叉树来测试,唯一麻烦的一点的是输入树时需原创 2016-05-25 14:47:30 · 2389 阅读 · 0 评论 -
选择排序法及时间测试
#include #include #include #include #define MAX 101void slct_sort(int list[], int n);void show_array(int list[], int n);int main(void){ int n; int list[MAX]; int i;原创 2016-05-12 14:42:00 · 531 阅读 · 0 评论 -
假设有n个布尔变量x1, ..., xn,输出其所有可能的真值集合
例如,如果n=2, 有四种可能:, ,和。编写C语言函数实现之。分析:对于任意一个正整数n,所有可能的情况为2^n种,即n个2相乘。对于每一个元素,有两种可能:true或者false,我们可以将其中一种结果设定为一个长度为n的序列,在每一位上,它的值只能是true或false。可以用下面给出的简单算法来产生其所有可能的序列,即长度为n的序列由下列序列组成:(True,(n-1)序列所有结果),转载 2016-05-12 16:46:31 · 968 阅读 · 1 评论 -
ackerman函数的循环实现
在网上看到了一些人在找这个Ackerman函数 ,不知道这个函数的实际含义,首先看到了他的递归形式:注释部分是分析后的结果.int rackerman(int m,int n){ if(m==0) return n+1; //更新n值, else if(n==0) return rackerman(m-1,1); //分析后要入栈一次, 同时n更新为 1转载 2016-05-12 20:08:38 · 877 阅读 · 0 评论 -
大根堆的插入、删除、修改优先级实现
大根堆其实就是一个一维数组, 不过数组中数据的排列是基于完全二叉树模型的。根节点的数据大于等于左孩子和右孩子节点的数据,然后每个子树都和前面一样。它的主要应用是在优先级队列中, 因为大根堆或小根堆总是能很方便的找出最大的值或最小值,虽然有序的线性表一样可以实现该功能,但是有序线性表的致命缺陷在与入队时为了保持线性表仍是有序的,可能需要移动大量元素, 而大根堆和小根堆则相对有着更好的性能。原创 2016-05-26 14:22:23 · 6847 阅读 · 1 评论 -
powerset 幂集函数(组合问题)的递归实现
问题:如果一个集合为{A, B, C}那么他的幂集为{},A B C A B A C A B C B C , 如何用递归实现幂集函数 powerset?这个问题其实思路和 n 个布尔变量,求所有真值组合的问题思路类似,都可归类为组合问题。假设一个集合中有n 个元素{A, B, C ....}, 每个元素都有选中和不选中2中状态,我们可原创 2016-05-13 17:17:13 · 4009 阅读 · 0 评论 -
hanoi汉诺塔问题的递归实现
#include void hanoi(int n, char a, char b, char c);//n 个盘子, 从A 移动到C, 借助Bchar ch[3] = {'A', 'B', 'C'};int main(){ int n; printf("Enter a interger: "); scanf("%d", &n);原创 2016-05-16 09:25:46 · 431 阅读 · 0 评论 -
动态栈
一个简单例子, 记录一下学习过程。为了简单,就源码全放一个文件了#include #include #include #define CAP 10typedef struct Element { int key; /*other*/} Element;typedef struct Stack { Element * pelem原创 2016-05-18 10:38:41 · 223 阅读 · 0 评论