数据结构与算法
zhaol92
这个作者很懒,什么都没留下…
展开
-
链表
链表的原理比较容易理解,但很多教材上都是伪代码,导致写出第一个完整可运行代码花了不少时间(自己太蠢,代码量太少了),现在把我写的代码贴出来分享。 这个代码不是非常完善,仅供初学者或者看了伪代码,明白了原理,但写不出完整代码的同学参考。如有错误的地方,烦请大神指出,一定改正。 代码如下:#include <stdio.h>#include <stdlib.h>struct node {原创 2015-04-04 14:36:35 · 557 阅读 · 0 评论 -
栈(可运行完整代码)
栈的具体原理就不讲了,其主要特点是Last in First Out(LIFO),只在末尾(栈顶)进行删除和插入操作。 看书的时候发现两个比较细节的东西(了解即可)分享给大家: 用链表实现的栈的缺点在于对malloc和free函数的调用的开销是昂贵的; 用数组实现的栈的潜在危害是需要提前申明一个数组的大小,除此之外, 还要对pop空栈与push满栈进行错误检测,会花费较多的时间 下面贴出代原创 2015-04-06 21:38:34 · 645 阅读 · 0 评论 -
队列(链表实现)
队列的特点就是先进先出(fifo),在队尾入队列,在队头出队列(现实生活中买火车票排队就和队列差不多,后面的人加入队列,前面买到票的人离开队列),下面代码实现了队列最基本的操作:#include <stdio.h>#include <stdlib.h>#define Status int#define OK 1#define ERROR 0typedef struct Qnode {原创 2015-04-07 20:16:12 · 467 阅读 · 0 评论 -
约瑟夫问题
问题来历(摘自百度百科):据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人原创 2015-04-27 21:03:20 · 527 阅读 · 0 评论 -
邻接矩阵的深度优先搜索
深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。 假设初始状态图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点V出发,访问此顶点,然后一次从V的未被访问的邻接点出发深度优先搜索遍历,直至图中所有和v有路径想通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至所有顶点都被访问为止。 有大神看到这个程序,请帮忙讲解下程序标注处的问原创 2015-04-27 22:25:02 · 1411 阅读 · 0 评论 -
邻接矩阵的广度优先搜索
广度优先搜索遍历类似于树的按层次遍历的过程。操作步骤: 假设从图中某顶点v出发,在访问了v之后一次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发一次访问他们的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻结点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,,重复上述过程,直至所有顶点都被访问到为原创 2015-04-28 22:11:19 · 2313 阅读 · 0 评论 -
堆排序
一般的教科书上在heapsort函数构建堆的过程中写的是for(i = N / 2;i >= 0; i--) { PercDown(A, i, n);}实际上这个有丁点问题,数组是从下标0开始的,因此下标为i的结点的双亲为(i - 1) / 2;所以最后一个又孩子的结点的下标为(N - 1) / 2,读者可以亲自实验,因此应修正为:for(i = (N - 1) / 2;i >= 0; i原创 2015-05-05 22:54:58 · 611 阅读 · 0 评论