数据结构
文章平均质量分 83
坚决不做程序狗
这个作者很懒,什么都没留下…
展开
-
静态链表的实现与操作(C语言实现)
我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了。没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能。1,静态链表其实是单链表的另一种实现方式2,静态链表的实现“媒介”不是指针而是数组3,静态链表主要用于不支持指针的程序设计语言中4,静态链表的实现是一种内存管理的简易方法原创 2014-06-04 17:01:23 · 3473 阅读 · 2 评论 -
递归(以及几个关于递归的小例子)
递归的正式定义: 在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。例如,下列为某人祖先的递归定义: 某人的双亲是他的祖先(基本情况)。 某人祖先的双亲同样是某人的祖先(递归步骤)原创 2014-06-13 21:26:33 · 17637 阅读 · 1 评论 -
顺序线性表的实现及操作(C语言实现)
什么是顺序线性表.....自己百度。原创 2014-06-02 00:24:41 · 6897 阅读 · 3 评论 -
递归之回朔算法应用----八皇后问题
从前,有个皇帝,取了八个皇后,由此产生一系列乱七八糟的问题,八皇后问题由此产生。哈哈开个玩笑~~~~八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。原创 2014-06-16 23:12:45 · 1399 阅读 · 1 评论 -
队列的定义与实现(C语言实现)
小时候,我们做早操的时候或者军训的时候,都排成一列,有头有尾。假设你迟到了,只能站到最后面一个,退场的时候,都是由第一个先走的。这就是队列雏形。队列的定义队列是一种特殊的线性表队列仅在线性表的两端进行操作队头(Front):取出数据元素的一端队尾(Rear):插入数据元素的一端队列不允许在中间部位进行操作!原创 2014-06-17 23:13:52 · 16101 阅读 · 1 评论 -
优化后队列的实现(C语言实现)
上一篇中的队列的定义与实现(C语言实现) 中,无论是顺序队列还是链式队列,在尾加和删除头部的操作时,总有一个时间复杂度让人不满意。比如在顺序队列中,删除头部的操作后,总要将后面所有的结点都向前移动一位,这里消耗的较大的;又如在在链式队列中,尾加结点时,为了寻找到最后一位结点,要遍历整个队列,时间复杂度同样是O(n)。为此,这里需要做出一些改变。原创 2014-06-18 21:25:28 · 1671 阅读 · 1 评论 -
利用栈实现队列(C语言实现)
在上一篇优化后队列的实现(C语言实现) 中,虽然我们对队列的时间复杂度进行了优化,但是却让代码的可读性变差了,代码显得略微臃肿(当然,这些话你看看就好,主要是为了奉承这篇博文的)。这里主要实现的是:利用栈来实现队列基本思路:1,创建两个栈2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移入outst原创 2014-06-19 19:00:03 · 3455 阅读 · 1 评论 -
排序(2)---------简单插入排序(C语言实现)
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。通俗解释:①假设初始序列的第一个元素是有序的(当一个序列只有1个元素时,我们可以认为其是有序的)。②从第二个元素开始与前面的元素进行比较,如果比前面的大就不动位置原创 2014-06-21 17:12:07 · 3041 阅读 · 2 评论 -
排序(3)---------冒泡排序(C语言实现)
说到冒泡排序,大一的时候第一次学习这个排序算法,可能大家不知道,“冒泡”在我说的方言里面是吹牛逼的意思。所以就觉得这个排序算法特吹牛逼有木有。 相信大家对所有的排序算法,这个想必是最熟悉的。大学老师多次强调,去培训,讲师也会提到,这个在面试经常被问到,所以我建议大家最好把这个算法背下来,做到心中有冒泡,手上写出来 哈哈。好了,言归正传。原创 2014-06-22 22:06:31 · 1608 阅读 · 1 评论 -
二叉树的实现与操作(C语言实现)
孩子兄弟表示法: 每个结点包含一个数据指针和两个结点指针--->数据指针:指向保存于树中的数据--->孩子结点指针:指向第一个孩子--->兄弟结点指针:指向第一个右兄弟二叉树是由 n( n>=0 ) 个结点组成的有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。原创 2014-08-21 15:37:12 · 2277 阅读 · 1 评论 -
链表的实现与操作(C语言实现)
链表的基本概念表头结点:链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点:链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点:链表中的最后一个数据结点,其下一元素指针为空,表示无后继原创 2014-06-03 11:32:25 · 4172 阅读 · 2 评论 -
树的实现与操作(C语言实现)
首先来简单说下一些关于的基本概念。树是一种非线性的数据结构 1,树是由 n(n>=0) 个结点组成的有限集合 如果n = 0 ,称为空树 如果n > 0,则: 有一个特定的称之为根(root)的结点,它只有直接后继,但没有直接前驱 除了根以外的其他结点划分为:m(m>=0)个互不相交的有限集合,T0,T1,T2…Tn-1,每个集合又是一棵树,并且称之为根的子树原创 2014-07-04 21:00:29 · 7851 阅读 · 4 评论 -
约瑟夫问题--循环链表实现
约瑟夫问题,循环链表实现问题描述:n 个人围成一个圆圈, 首先第 1 个人从 1 开始一个人一个人的顺时针报数,报到第 报到第 m 个人, 令其出列。 然后再从下一 个人开始从 1 顺时针报数 , 报到第 m 个人, 再令其出列,如此下去 , 求出列顺序。原创 2014-06-05 15:19:25 · 1783 阅读 · 3 评论 -
双向链表的实现与操作(C语言实现)
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。单链表的局限1,单链表的结点都只有一个指向下一个结点的指针2,单链表的数据元素无法直接访问其前驱元素3,逆序访问单链表中的元素是极其耗时的操作原创 2014-06-07 17:40:31 · 2183 阅读 · 3 评论 -
排序(4)---------希尔(shell)排序(C语言实现)
前面的介绍的三种排序算法,都属于简单排序,大家可以看下具体算法,时间复杂度基本都在0(n^2),这样呢,很多计算机界、数学界的牛人就很不爽了,他们在家里想啊想,吃饭的时候在想,窝粑粑的时候也在想,究竟能不能把时间复杂度搞低点呢。终于,皇天不负有心人啊,王母娘娘显灵了,终于被DL. SHELL这哥们给想出来了。他所创造的希尔(shell)排序是世界上第一个打破0(n^2)的时间复杂度的算法。牛逼不? 好了,言归正传。原创 2014-06-27 20:57:30 · 1352 阅读 · 1 评论 -
栈的实现与操作(C语言实现)
栈的定义 1, 栈是一种特殊的线性表 2,栈仅能在线性表的一端进行操作 3,栈顶(Top): 允许操作的一端 允许操作的一端 4,栈底(Bottom): ,不允许操作的一端 不允许操作的一端这里我们实现了顺序栈和链式栈~~~~原创 2014-06-09 12:16:02 · 16962 阅读 · 1 评论 -
排序(5)---------快速排序(C语言实现)
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为:1,从数列中挑出一个元素,称为 "基准",2,重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。3,递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。4,递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递原创 2014-06-28 23:49:29 · 1119 阅读 · 1 评论 -
栈的应用---编译器左右符号的语法匹配
各位程序猿在写代码的时候,使用的编译器(如VisualStudio、Eclipse)都有左右括号的自动匹配功能,如果写错了,它就会即时编译,提示错误。那么现在,就利用栈的特点就简单实现了这一功能。可以实现基本‘ { ’、‘ [ ’、‘(’、‘ “ ’、‘ ‘ ’、’ < ‘的左右匹配功能。基本实现思路:1,将代码视为一条字符串,创建栈空间2,遍历字符串,遇到左符号->压栈3,遇到右符号,弹栈,弹出的左符号与右进行匹配4,执行步骤2 ,直到遍历到'\0'(字符串结原创 2014-06-10 13:33:28 · 1472 阅读 · 1 评论 -
排序(6)---------归并排序(C语言实现)
归并排序:归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。归并操作的过程如下: (1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 (2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置 (3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 (4) 重复步骤3直到某一指针到达序列尾 (5) 将另一序列剩下的所有元素直接复制(抄)到合并序列尾原创 2014-06-29 23:25:36 · 7880 阅读 · 2 评论 -
循环链表的实现与操作(C语言实现)
循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。循环链表的操作1,循环链表的新操作2, 获取当前游标指向的数据元素3, 将游标重置指向链表中的第一个数据元素4,将游标移动指向到链表中的下一个数据元素5,直接指定删除链表中的某个数据元素CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);CircleListNode* Ci原创 2014-06-05 14:55:13 · 3770 阅读 · 1 评论 -
栈的应用--计算字符串表达式
计算机的本质工作就是做数学运算,那计算机可以读入字符串"1+2+3+4+5+6+7"并计算值吗?答案是肯定的。这里我基本实现了个位数的加减乘除,当然这个算法最简单的解决方式是采用二叉树(后面会实现~),这里作出了栈的实现方式。首先引入两个概念:中缀表达式和后缀表达式 1,在生活中我们通常书写1+1的时候都会写成1+1,废话~,这就是中缀表达式,更符合人们的思维习惯与想法。 2,所谓后缀表达式就是将运算符写在操作数的后面,这样更符合计算机的思维。原创 2014-06-11 22:55:15 · 1853 阅读 · 1 评论 -
排序(1)---------选择排序(C语言实现)
选择排序的基本思想:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动原创 2014-06-20 21:18:37 · 1057 阅读 · 1 评论