
数据结构
爱橙子的OK绷
时刻准备着。。。
展开
-
线性表---单链表(创建、插入、删除、排序、测长和打印输出)
实现了动态建立一个学生信息的链表,并能够进行创建、插入、删除、排序、测长和打印输出等操作。/*-----------------------------------------------------------------////////关键部分代码用序号标出////////////--------------------------------------------------------原创 2015-10-16 15:57:37 · 2645 阅读 · 0 评论 -
队列---循环队列
前面讲到了队列的“假溢出”,解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。比如前面的例子,rear可以改为指向下标为0的位置,这样就不会造成指针指向不明的问题了。 但是如果继续进行入队操作的话,比如继续插入a6、a7,则rear指针就与front指针重合,同时指向下标为2的位置。 此时问题又出来了,我们刚才说,空队列时,等于转载 2015-10-21 16:57:12 · 823 阅读 · 2 评论 -
队列---循环队列与链队列比较
对于循环队列与链队列的比较,可以从两方面来考虑:1、从时间上,其实它们的基本操作都是常数时间,即都为0(1)的,不过循环队列是事先申请好空间,使用期间不释放,而对于链队列,每次申请和释放结点也会存在一些时间开销,如果入队出队频繁,则两者还是有细微差异。2、对于空间上来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题。而链队列不存在这个问题,尽管它需要一个指针域,会产生一些空间转载 2015-10-21 23:11:45 · 5352 阅读 · 0 评论 -
队列---顺序队列存储结构的不足(假溢出)
我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为0(1)。可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置,比如转载 2015-10-21 16:38:11 · 22725 阅读 · 11 评论 -
队列---链队列:队列的链式存储结构
一、链队列的基本结构队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。链队列示意图:当队列为空时,front和rear都指向头结点。二、链队列结构体定义链队列结构体的定义,需要两个步骤: (1)链队列节点的定义/* QElemType类型根据实际情况而定,这里假设为int */t原创 2015-10-21 23:06:28 · 7676 阅读 · 0 评论 -
栈---链栈
一、栈的链式存储结构栈的链式存储结构,简称为链栈。链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。栈是用栈顶来做插入和删除操作,那么对于链栈的栈顶放在链表的头部还是尾部呢?单链表有头指针,而栈顶指针也是必须的,所以比较好的办法是把栈顶放在单链表的头部。另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的。链栈的结构如下: 对于空原创 2015-10-23 10:58:46 · 1389 阅读 · 0 评论 -
栈---顺序栈
一、栈的顺序存储线性表用数组来实现顺序存储,但是对于栈这种只能在一端插入删除的线性表来说,可以用数组实现顺序存储吗?用那一端作为栈顶和栈底比较好?答案是肯定的。并且下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。我们定义一个top变量来指示栈顶元素在数组中的位置,top就如同游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度。原创 2015-10-22 15:28:40 · 943 阅读 · 0 评论 -
栈---定义、应用(递归、后缀表达式实现数学表达式求值)
一、定义栈是限定仅在表尾进行插入和删除操作的线性表。因此,栈的表尾端称为栈顶;表头端称为栈底。不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIF0结构。理解栈的定义需要注意:首先它是一个线性表,也即栈元素具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作,叫作出找,也有的叫作弹栈。转载 2015-10-23 17:22:35 · 4753 阅读 · 0 评论 -
堆(heap)和栈(stack)有什么区别?
简单的可以理解为: heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(he转载 2015-10-27 10:33:11 · 1000 阅读 · 0 评论 -
树---求给定二叉树中两节点的最低公共祖先(LCA)
一、问题描述对于一颗二叉树,给定其中的两节点n1,n2,求出他们的最低公共祖先(Lowest Common Ancestor )。例如: 二、问题求解利用递归思想。(1)从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。(2) 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则roo原创 2015-10-31 21:37:18 · 592 阅读 · 0 评论 -
树---Binary Search Tree(二叉搜索树BST)
一、什么是二叉搜索树BST中文翻译为:二叉搜索树,或者二叉查找树,或者二叉排序树。二叉树(binary)是一种特殊的树:二叉树的每个节点最多只能有2个子节点。 给二叉树加一个额外的条件,就可以得到一种被称作二叉搜索树(binary search tree)的特殊二叉树。二叉搜索树要求:每个节点都不比它左子树的任意元素小,而且不比它的右子树的任意元素大。 (如果我们假设树中没有重复的元素,那么上述原创 2015-10-30 17:25:23 · 1098 阅读 · 0 评论 -
树---求二叉树两个节点的距离
一、问题描述二叉树两节点距离是指从一个节点到达另一个节点需要的最少边数。如图:二、问题求解假设root是二叉树的根节点;n1和n2是给定二叉树的两个节点的数值。 lca是n1和n2的最小公共祖先;Dist(n1, n2)为n1和n2之间的距离。因此,两节点距离的计算公式为:Dist(n1, n2) = Dist(root, n1) + Dist(root, n2) - 2*Dist(root, l原创 2015-11-01 10:42:51 · 7140 阅读 · 1 评论 -
树---求二叉搜索树中两节点的最低公共祖先(LCA)
一、问题描述给定二叉搜索树(BST)中两节点,找出他们的最低公共祖先。例如对于下图: LCA(4, 14)=8; LCA(8, 10)=8.二、问题求解利用BST的性质,从根节点从上自下递归遍历BST。假设n1,n2都在BST中,并且n1 < n2。 (1)在遍历过程中,遇到的第一个值介于n1和n2之间的节点n,也即n1 =< n <= n2, 就是n1和n2的LCA。 (2)在遍历过程中,如原创 2015-11-02 20:44:41 · 1607 阅读 · 0 评论 -
树---判断两棵树是否相等
问题描述:请实现两棵树是否相等的比较,相等返回1,否则返回其他值,并说明算法复杂度。 数据结构为:typedef struct TreeNode{ char c; TreeNode *leftchild; TreeNode *rightchild;}TreeNode;函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);原创 2015-11-02 21:46:17 · 4420 阅读 · 0 评论 -
字符串---实现整数和字符串数的互相转换
解析:整数转化成字符串,可以采用加’0’,再逆序的方法,整数加’0’就会隐性转化成char类型的数。代码:#include<iostream>#include<stdio.h>using namespace std;int main(){ int num=12345, i=0, j=0; char temp[7], str[7]; while(num) {原创 2015-11-04 19:41:41 · 666 阅读 · 0 评论 -
字符串---转换字符串格式为字符+连续出现的次数
#include <iostream>#include <stdio.h>#include<cstring>using namespace std;void ConvertStr(char *pStr){ //两个指针:pCurrent指向当前统计的字符,pNext指向要与当前字符进行比较的字符 char *pCurrent =pStr; //首地址 char *p原创 2015-11-05 10:41:19 · 496 阅读 · 0 评论 -
队列---基本概念、顺序队列
一、基本概念队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。队列基本操作:InitQueue() ——初始化队列EnQueue() ——进队列DeQueue() ——出队列IsQueueEmpty()原创 2015-10-20 10:27:07 · 6274 阅读 · 2 评论 -
线性表---单链表(一次遍历找链表倒数第n个节点)
#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *head, *p, *q; head = (Node*)ma原创 2015-10-17 21:26:42 · 1696 阅读 · 0 评论 -
线性表---单链表(创建、找中间节点、删除头元素)
#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *head, *p, *q; head = (Node*)ma原创 2015-10-17 20:50:23 · 686 阅读 · 0 评论 -
线性表---单链表(逆置)
假设需要逆序的单链表为: 则逆置以后的链表为: 代码如下:#include<iostream>#include<malloc.h>using namespace std;typedef struct node{ int num; struct node *next;}Node;Node * CreateList(int a[], int n){ Node *he原创 2015-10-18 10:54:32 · 2441 阅读 · 0 评论 -
线性表---顺序表(查找、插入与删除)
代码:#include<iostream>using namespace std;#define maxsize 20/* 存储空间初始分配量 */typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */typedef struct{ ElemType a[maxsize];/* 数组,存储数据元素,最大值为MAXSIZE */原创 2015-10-18 15:06:16 · 1073 阅读 · 0 评论 -
线性表---双向链表(创建、正序逆序打印、插入、删除)
双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。建立双向非循环链表代码如下:#include<iostream>#include<malloc.h>using namespace std;typedef struct dnode{ int num; struct dnode *pre; struct dnode *next;}dNode;dNod原创 2015-10-18 18:36:42 · 1660 阅读 · 0 评论 -
线性表---顺序表
1、线性表线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。线性表——List,零个或多个数据元素的有限序列。首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最原创 2015-10-18 13:07:45 · 647 阅读 · 0 评论 -
线性表---顺序存储结构与链式存储结构比较
1、顺序存储结构优点: 1)随机存取(时间复杂度为O(1)); 2)无需为表示表中元素之间的逻辑关系而增加额外的存储空间; 缺点: 1)插入、删除操作需要移动大量元素,效率低(时间复杂度为O(n)); 2)表的长度难以确定2、链式存储结构优点: 1)插入、删除不需要移动数据,效率高(时间复杂度为O(1)); 缺点: 1)存取时需要遍历,效率低(时间复杂度为O(n));3、适用的场合顺转载 2015-10-18 15:15:06 · 1061 阅读 · 0 评论 -
线性表---单链表(头结点与头指针)
当链表的每个结点只包含一个指针域时,我们称此链表为单链表。关于单链表的存取,有时候我们在单链表的第一个结点(有效元素)之前附设一个结点,称之为头结点;指向头结点的指针,称之为头指针;对单链表的存取必须从头指针开始进行,由于单链表的最后一个数据元素没有直接后继,则指针为NULL。 对于头结点,数据域可以不存储任何信息,也可存储如链表长度等附加信息。下面是带头结点的单链表与空表的比较图。 头指针与头转载 2015-10-18 15:40:02 · 1866 阅读 · 0 评论 -
线性表---双向循环链表
双向链表双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。 注意:链表由头指针head惟一确定的。带头结点的双链表的某些运算变得方便。将头结点和尾结点链接起来,为双(向)循环链表。双向链表的结点结构和形式描述结点结构(见上图)形式描述如下:typedef char ElemType;struct NodeType2{转载 2015-10-18 17:02:18 · 487 阅读 · 0 评论 -
线性表---单循环链表(约瑟夫环问题)
约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。代码:#include <iostream>#include <stdio.h>#include<malloc.h>using namespace std;typedef struc原创 2015-10-19 14:52:16 · 954 阅读 · 0 评论 -
字符串---不使用库函数,编写函数strcpy
一、问题描述已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数 strcpy (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?二、问题求解(1)代码#incl转载 2015-11-04 20:39:47 · 3818 阅读 · 0 评论 -
字符串---求一个字符串中连续出现次数最多的子串
基本概念:字符串的前缀是指字符串的任意首部。字符串“abbc”的前缀有“a”,“ab”,“abb”,“abbc”。 字符串的后缀是指字符串的任意尾部。字符串“abbc”的后缀有“c”,“bc”,“bbc”,“abbc”。基本算法描述: 例如给出一个字符串abababa 求连续出现次数最多的子串。1、穷举出所有的后缀子串 substrs[0] = abababa; substrs[1] = ba转载 2015-11-04 23:10:01 · 897 阅读 · 0 评论 -
字符串---将一句话里的单词进行倒置,标点符号不倒换
#include <iostream>#include <cstring>using namespace std;//step1:全盘翻转void AllReverse(char *str){ int len=strlen(str); int i=0, j=len-1; while (i<j)//实现逆序的判别条件 {//全盘翻转:前后下标位置处遍历交换!!转载 2015-11-04 23:52:03 · 3409 阅读 · 0 评论 -
二叉树-四种遍历及其他应用
对于每一个节点而言,先不断的往其左孩子方向搜索。先序和中序的差别就是,先序搜索左孩子之前先把该节点访问到,而中序要先不断搜索完左孩子,再访问该节点。1、先序遍历先序遍历按照根结点->左孩子->右孩子的顺序进行访问。1.递归遍历void preOrder1(BiTree *root){ if(root != NULL) { cout<<root->key<<" ";转载 2016-05-24 10:47:05 · 4123 阅读 · 0 评论