数据结构
文章平均质量分 73
-BearWolf
成长
展开
-
线性链表中的头结点和头指针
首先,先简单阐述一下头指针和头结点的区别。 图1为线性表的逻辑状态。头指针指示链表中第一个结点(即第一个数据元素的存储映像)的存储位置。同时,由于最后一个数据元素没有直接后继,则线性链表中最后一个结点的指针为“空”(NULL),通常用如图所示符号表示。图1 线性链表的逻辑状态由此可见,单链表可由头指针来唯一确定,而在C语言中用“结构指针”来描述。//-----线性原创 2013-11-16 13:01:33 · 2164 阅读 · 0 评论 -
递归的应用(一)
递归是一种数学上分而治之的思想,递归能将大型问题转化为与之类型相同的小问题来解决,同时,递归还需要边界条件。斐波那契递归数列解法:#include #include int fabonacci(int n){if( n > 1 ){return fabonacci(n-1)+fabonacci(n-2);//递推,a(n)=a(n-1)+a(n-2);原创 2014-02-07 16:56:51 · 627 阅读 · 0 评论 -
队列的实现方式
队列是一种特殊的线性表;队列仅在线性表的两端进行操作;队头:取出元素的一端; 队尾:插入元素的一端;顺序队列的实现:#ifndef _SEQQUEUE_H_#define _SEQQUEUE_H_typedef void SeqQueue;//数据封装SeqQueue* SeqQueue_Create(int capacity);//顺序队列,capacity表示队列的原创 2014-02-08 16:02:43 · 558 阅读 · 0 评论 -
队列的优化
顺序队列的瓶颈:顺序队列: 线性表的第一个元素作为队头; 线性表的最后一个元素作为队尾; 入队的新元素是在线性表的最后时间复杂度为O(1); 出队时需要将后续的所有元素向前时间复杂度为O(n);顺序队列的优化方案: 定义front使其始终代表队头的下标; 出队时将队头元素返回且front++; 定义rear使其始终代表队尾下一个元素的下标;原创 2014-02-08 17:54:09 · 593 阅读 · 0 评论 -
排序
排序中的关键操作: 比较: 任意两个数据元素通过比较操作确定先后次序; 交换: 数据元素之间需要交换才能得到预期结果;对于多关键字排序 只需要在比较操作时同时考虑多个关键字即可!多关键字排序操作:#include //关键字的比较typedef struct _tag_DataElem//结构体,变量是排序所需要的数据元素{ char desc原创 2014-02-09 11:20:49 · 477 阅读 · 0 评论 -
入门级排序算法
选择排序:void SelectionSort(int array[], int len) // O(n*n){ int i = 0; int j = 0; int k = -1;//k用于标识最小值位置 for(i=0; i { k = i; for(j=原创 2014-02-09 15:07:25 · 505 阅读 · 0 评论 -
进阶级排序算法
希尔排序:void ShellSort(int array[], int len)// O(n*n)//希尔排序关键思想先分组,再分别插入排序{ int i = 0; int j = 0; int k = -1; int temp = -1; int gap = len;//用间隔量gap分组 do原创 2014-02-09 17:04:53 · 678 阅读 · 0 评论 -
通用树的实现
树的存储结构: 无法直接用数组表示树的逻辑结构;但可以设计结构体数组对结点间的关系进行表述;利用链表组织树中的各个结点; 链表中的前后关系不代表结点间的逻辑关系;结点的逻辑关系由child 数据域描述; child 数据域保存其他结点的存储地址;树中每一个结点包含一个指向父结点的指针;树结点在链表中的位置不代表树原创 2014-02-11 15:37:46 · 583 阅读 · 0 评论 -
程序员如何快速准备面试中的算法
程序员如何快速准备面试中的算法前言 我决定写篇短文,即为此文。之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法。尽管在微博上简单梳理过,如下图所示: 但因字数限制,特撰此文着重阐述下:程序员如何快速准备面试中的算法,顺便推荐一些相关的书籍或资料。备战面试中算法的五转载 2014-02-13 00:03:45 · 668 阅读 · 0 评论 -
创建二叉树
#include #include #include "BTree.h"typedef struct _tag_BTree TBTree;struct _tag_BTree//定义头结点{ int count; BTreeNode* root;//根结点};static void recursive_display(BTreeNode原创 2014-02-12 23:51:10 · 511 阅读 · 0 评论 -
线索化二叉树(二叉树的简单遍历)
线索化二叉树:以线性方式遍历非线性二叉树;即将二叉树中的所有结点进行逻辑意义上的“重排列”,使其可以以线性的方式访问每一个结点;用链表的方式遍历二叉树,结点之间的逻辑关系有意义,而组织链表的逻辑关系缺毫无意义;线索化方式一:利用空的左指针域线索化二叉树(前序遍历)//经典算法,利用结点中的空指针域,使其指向后继结点void thread_via_left(BTr原创 2014-02-14 12:32:02 · 734 阅读 · 0 评论 -
遍历二叉树
void pre_order_traversal(BTreeNode* root)//前序遍历{ if( root != NULL )//根结点不为空时,访问根结点中的数据 { printf("%c, ", ((struct Node*)root)->v); pre_order_traversal(root->left原创 2014-02-14 12:03:39 · 507 阅读 · 0 评论 -
图的存储结构(邻接矩阵法)
#include #include #include "MGraph.h"//邻接矩阵表示法#include "LinkQueue.h"typedef struct _tag_MGraph//头结点{ int count;//记录顶点个数 MVertex** v;//和顶点相关的数据指针,记录与顶点相关的数据描述 int** matrix;原创 2014-02-14 23:13:21 · 822 阅读 · 0 评论 -
图的存储结构(邻接链表法)
#include #include #include "LGraph.h"#include "LinkList.h"#include "LinkQueue.h"typedef struct _tag_LGraph//定义头结点{ int count;//记录顶点个数 LVertex** v;//记录与顶点相关的数据描述 LinkList原创 2014-02-14 23:14:19 · 974 阅读 · 0 评论 -
队列的特殊实现方式
特别实现方案: 实现思路: 准备两个栈用于实现队列:inStack和outStack; 当有新元素入队时: :将其压入 将其压入inStack中; 当需要出队时:• 当outStack为空时:1. 将inStack中的元素逐一弹出并压入outStack中;2. 将outStack的栈顶元素弹出;• 当outStack不为空时:– 直接将outStac原创 2014-02-08 19:21:05 · 564 阅读 · 0 评论 -
递归的应用(二)
递归与回溯:递归在程序设计中经常用于回溯算法的场合;回溯算法的基本思想:1,从问题的某一状态出发,搜索可以达到的所有状态;2.当某个状态到达后,可向前后退,并可继续查找其他状态;3.当所有状态都到达后,回溯算法结束;程序设计中可以利用函数的活动对象保存回溯算法的状态数据,因此可以利用递归完成回溯算法;八皇后问题:任意位置,判断放皇后的三个方向,用偏移原创 2014-02-07 19:51:08 · 582 阅读 · 0 评论 -
栈与递归
程序中的“函数调用栈”是栈数据结构的一种应用,函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处;函数调用栈中存储的数据为活动记录,活动记录是函数调用时一系列相关信息的记录,活动记录:函数调用过程:程序的栈空间可以看做一个顺序栈的应用,栈保存了一个函数调用时所需要的维护信息,包括函数参数,函数返回地址,局部原创 2014-02-07 13:41:34 · 1912 阅读 · 0 评论 -
链表举例
源代码: L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i { P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1; } P->next=NULL; fo原创 2013-11-17 20:38:18 · 1265 阅读 · 0 评论 -
线性表的就地逆置
顺序表的逆置StatusListOppose_Sq(SqList &L){ int i; ElemType x; for(i=0;i x=L.elem[i]; L.elem[i]=L.elem[L.length-1-i]; L.elem[L.length-1-i]=x; }原创 2013-11-17 21:59:52 · 1486 阅读 · 0 评论 -
线性表
数据结构(C语言实现)分类: C/C++ 2013-03-18 23:26 172人阅读 评论(0)收藏 举报1.线性表的顺序存储[cpp] view plaincopyprint?#include #include #define MAX 20 typedef int DataType ; typedef stru转载 2013-11-19 20:41:15 · 831 阅读 · 0 评论 -
可复用的顺序表
#ifndef _SEQLIST_H#define _SEQLIST_Htypedef void SeqList;typedef void SeqListNode;//数据封装 SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList* list);void SeqL原创 2014-01-22 12:16:14 · 642 阅读 · 0 评论 -
可复用的单链表
#ifndef _LINKLIST_H#define _LINKLIST_Htypedef void LinkList;typedef struct _Tag_LinkListNode LinkListNode;struct _Tag_LinkListNode{LinkListNode* next;};LinkList* LinkList_Create(原创 2014-01-22 21:36:08 · 593 阅读 · 0 评论 -
关于srand(time(0)) rand() 的解释
计算机没有办法产生真正的随机数的,是用算法模拟,所以你只调用rand,每次出来的东西是一样的。设置一个种子后,根据种子的不同,就可以产生不同的数了。而怎么保证种子的不同呢?最简单的办法当然是用永远在向前的时间。srand(time(0)) ;//先设置种子rand();//然后产生随机数Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一转载 2013-11-20 13:33:20 · 1164 阅读 · 0 评论 -
可复用的静态链表
#ifndef _STATIC_LIST_H#define _STATIC_LIST_Htypedef void StaticList;typedef void StaticListNode;StaticList* StaticList_Create();void StaticList_Destroy(StaticList* list);vo原创 2014-01-24 23:41:15 · 644 阅读 · 0 评论 -
可复用的循环链表
#ifndef _CIRCLELIST_H_#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNode;struct _tag_CircleListNode{ CircleListNode* next;};Circ原创 2014-01-25 23:59:16 · 696 阅读 · 0 评论 -
可复用的双向链表
#ifndef _DLINKLIST_H_#define _DLINKLIST_H_typedef void DLinkList;typedef struct _tag_DLinkListNode DLinkListNode;struct _tag_DLinkListNode{ DLinkListNode* next; DLinkListNode*原创 2014-01-29 20:49:56 · 537 阅读 · 0 评论 -
可复用的链栈
#ifndef _LINKLIST_H_#define _LINKLIST_H_typedef void LinkList;typedef struct _tag_LinkListNode LinkListNode;struct _tag_LinkListNode{ LinkListNode* next;};LinkList* LinkList原创 2014-02-05 22:46:17 · 538 阅读 · 0 评论 -
可复用的顺序栈
#ifndef _SEQLIST_H_#define _SEQLIST_H_typedef void SeqList;typedef void SeqListNode;SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList* list);void SeqList_C原创 2014-02-05 21:14:35 · 628 阅读 · 0 评论 -
栈的应用实例--c程序括号的匹配
#include #include #include"LinkStack.h"int isleft(char c){int ret = 0;switch(c){case 'case '(':case '{':case '\'':case '\"':ret = 1;break;default :ret = 0;break;原创 2014-02-06 17:52:25 · 689 阅读 · 0 评论 -
栈的应用实例--简单表达式的计算
#include #include#include "LinkStack.h"int isNumber(char c){ return ('0' }int isOperator(char c){ return (c == '+') || (c == '-') || (c == '*') || (c == '/');}i原创 2014-02-06 21:48:09 · 804 阅读 · 0 评论 -
两个栈实现一个队列与两个队列实现一个栈
两个栈实现一个队列:原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素。入队:将元素依次压入主栈出队:先检测辅助栈是否为空,如果非空,那么直接弹出辅助栈顶元素,相当于出队。如果为空,那么将主栈元素倒入到辅助栈中,然后弹出辅助栈顶元素。达到先进先出的目的。以下是代码:[cpp] view plaincopy//两个个栈转载 2014-02-14 23:48:53 · 683 阅读 · 0 评论