数据结构和算法
mcgrady_tracy
这个作者很懒,什么都没留下…
展开
-
线性表(list)
线性表(list)一、线性表定义线性表是0或多个元素组成的有序序列,若将线性表记为:(a1, ..., ai-1, ai, ai+i, ..., an),则称ai-1是ai的直接前驱元素,ai+1为ai的直接后继元素,当i=1, 2, ..., n-1时,ai有且只有一个直接后继元素,当i=2, 3, ..., n时,ai有且只有一个直接前驱元素。线性表中元素的个数n(n>=0)定义为线性原创 2013-03-28 23:27:04 · 1705 阅读 · 0 评论 -
栈
栈是一个种特殊的线性表,它只能在栈顶进行插入和删除操作,它实现的是一种后进先出的策略。可以用数组来作为栈,插入操作称为push,删除操作称为pop,栈有个属性top[S],它指向最近插入的元素,称为栈顶,例如栈S包含元素S[1..top[S]],其中S[1]是栈底元素,S[top[S]]是栈顶元素。当top[S]=0时,栈不包含任何元素,称为空栈,判断空栈过程如下:STACK-EM原创 2013-08-26 15:54:07 · 765 阅读 · 0 评论 -
二叉搜索树
二叉搜索树(Binary Search Tree):假设x为二叉搜索树的一个节点,如果y节点位于左子树,则y.key=x.key。例如(摘自算法导论图12.2):二叉搜索树完整代码如下:#include #include struct bst_node { int key; struct bst_node *left; struct bst_node *right;原创 2013-09-23 22:05:57 · 1334 阅读 · 0 评论 -
二叉树
二叉树:二叉树是每个节点最多只有两个子节点的树,且子节点有左右之分。满二叉树:一棵深度为k,且有2^k-1个节点的二叉树称为满二叉树。完全二叉树:二叉树中,每个节点的序号都与相同的深度满二叉树序号完全一致,称为完全二叉树。二叉树的遍历:二叉树的遍历通常有三种主要的方法:前序遍历、中序遍历和后序遍历,三种方法都是递归实现的。1. 前序遍历访问根节点遍历左子树原创 2013-09-17 23:04:57 · 1430 阅读 · 0 评论 -
图遍历之深度优先搜索
1. 图(graph)的基本概念:(1). 图由顶点(vertex)和边组成(edge)。(2). 图分又分为有向图(directed graphs)和无向图(undirected graphs)。2. 图的表示方法:图的表示方法有两种,邻接表(adjacency lists)和邻接矩阵(adjacency matrix)。图的示例如下:上图为无向图(来自算法导论图22原创 2013-10-08 21:04:54 · 17435 阅读 · 0 评论 -
图遍历之广度优先搜索
4. 广度优先搜索(BFS)算法演示地址为:http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html伪代码如下:c完整代码如下:/* bfs.c */#include #include "queue.h"#define N 6struct adj_matrix { int vertex[N]; int edge[N][原创 2013-10-12 14:51:38 · 2652 阅读 · 0 评论 -
摘自C指针编程之道-队列
#define QueueSize_UartLen 8typedef struct{ int front; int rear; int counter; int uart_data[QueueSize_UartLen];}CIRQUEUE_UART;void InitQueue(CIRQUEUE_UART *queue){ queue->front = 0; queue->转载 2013-12-20 14:08:33 · 951 阅读 · 0 评论 -
深度优先搜索非递归实现
源代码如下:/* dfs.c */#include #include "stack.h"#define N 6struct adj_matrix { int vertex[N]; int edge[N][N]; };struct adj_matrix matrix = { {1, 2, 3, 4, 5, 6}, {{0, 1, 0, 1, 0, 0}, {0原创 2013-10-16 12:43:27 · 7789 阅读 · 4 评论 -
关于链表中头指针和头结点的理解
线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间。来看链表的定义:原创 2014-06-18 15:33:24 · 55829 阅读 · 12 评论 -
队列
队列也是一种特殊的线性表,队列只能在头部删除元素,只能在尾部添加元素,它实现的是一种先进先出(FIFO)的策略。队列就像新生开学交费一样,新来的学生只能站在队尾,离开的学生总是最前面的学生。队列有两个属性,head[Q]指向队列的头部,tail[Q]指向队列的尾部,删除元素只能在头部进行,插入元素只能在尾部进行,如果队列为空,从中删除元素时将会导致下溢,如果队列是满的,插入元素时将导致上溢原创 2013-09-02 12:49:38 · 894 阅读 · 0 评论 -
快速排序
快速排序同归并排序一样,也采用的是分治策略。快速排序最终要的步骤是划分子数组,假设有个数组A[p..r]被划分成两个子数组(可能为空)A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A[q],且A[q]小于等于A[q+1..r]中的每个元素。划分过程伪代码如下:PARTITION(A, p, r) x <-- A[r] i <-- p-1原创 2013-08-26 13:08:39 · 1335 阅读 · 0 评论 -
计算阶乘代码
两种实现方式,递归和循环:int factorial(int n){ if (n == 1) { return 1; } else { return n * factorial(n-1); }}int factorial(int n){原创 2013-03-23 16:58:12 · 2757 阅读 · 0 评论 -
计算1~n之和
传统方法:int sum(int n){ int i, s = 0; for (i = 1; i s += i; } return s;}高斯计算方法:int sum(int n){ if ((n % 2) == 0) {原创 2013-03-23 23:55:28 · 1130 阅读 · 0 评论 -
欧几里德算法
欧几里德算法用于求两个正整数m和n的最大公因子,即能同时整除m和n的最大正整数。欧几里德算法描述如下:以n除m并令r为所得余数,若r = 0,算法结束,n即为答案,否则置m = n,n = r,再让n除m,直到余数为0。c语言实现代码如下:unsigned int gcd(unsigned int m, unsigned int n){ unsigned int原创 2013-03-24 23:00:34 · 1128 阅读 · 0 评论 -
归并排序
分治法:分治法是将原问题分解成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,然后再合并其结果,就得到原问题的解。归并排序就采用了分治策略,首先将n个元素分成各含n/2个元素的子序列(2个子序列),使用归并排序法对两个子序列递归的排序,最后合并两个已排序的子序列得到最终结果。归并排序的关键在于合并两个已排序的子序列,还是以扑克牌为例。假设有两堆牌面朝上的扑克牌,每原创 2013-08-21 10:59:30 · 894 阅读 · 0 评论 -
插入排序
插入排序的原理同很多人打牌时,整理手中的牌时的做法差不多。在开始摸牌时,左手是空的,接着一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上,这样左手的牌永远都是顺序摆放的。插入排序伪代码如下:INSERT-SORT(A) for j <-- 2 to length[A] do key <-- A[j] > Insert A[j] into原创 2013-08-20 10:31:03 · 815 阅读 · 0 评论 -
冒泡排序
冒泡排序的思想是两两比较待排序的数据,如果前面数据比后面数据大,则交换两个数据,伪代码如下:BUBBLESORT(A) for i <-- 1 to length[A] do for j <-- length[A] downto i+1 do if A[j] < A[j-1] then exchange A[j] A原创 2013-08-21 14:00:13 · 846 阅读 · 0 评论 -
选择排序
选择排序的思想是每次遍历都会从待排序的数据中选择一个最小或最大值,所以称为选择排序。伪代码如下:SELECT-SORT for i <-- 1 to length[A]-1 do k <-- i for j <-- i+1 to length[A] do if A[j] < A[k] then k <-原创 2013-08-22 10:44:17 · 814 阅读 · 0 评论 -
斐波那契数
序列0, 1, 1, 2, 3, 5, 8, 13, 21, 34...中,每个数都是它前面两项之和,这样一组数称为斐波那契数。可以表示如下:F0 = 0; F1 = 1; Fn+2 = Fn+1 + Fn n >= 0由上面的定义可以很容易的写出程序,例子如下:unsigned long long fibonacci(int n){ if (n == 0)原创 2013-08-13 16:27:18 · 717 阅读 · 0 评论 -
链表c代码
#include #include struct node { int data; struct node *next;};int datas[] = {1, 2, 4, 8, 16, 32, 64, 128};void list_head_init(struct node *head){ head->data = 0; head->next = NULL;}int原创 2014-06-18 23:40:43 · 2861 阅读 · 0 评论