数据结构笔记2

下面是我学习数据结构笔记的第二部分:(第一部分地址:http://www.cnblogs.com/stream2011/archive/2012/08/30/2663514.html

1.c中取等价函数名
  typedef int zhangsan;//int为已有变量类型,张三为新名字,下面的代码中用zhangsan就可以代替int,int t=3和zhangsan t=3是等价的。
用typedef取别名一个结构体:
typedef struct student
{int sid;
 char name[100];
 char sex;
}st;  //划线的部分就是一个结构体定义,st就是typedef为结构体定义的别名。这样可以方便使用,st st1;就能代替struct student st1;.
st前面也可以加*代码结构体类型的指针类型。
也可以同时取两个,}*pst,st;这样的话前者代码结构体指针类型,后者代码结构体类型。

2.链表结构体自定义
  typedef struct Node
{ int data;//数据域
  struct Node * pNext;//指针域,指向下一个节点
}NODE,*PNODE;

3.一般函数后面加一个return表示程序结束。

4.线性结构两种常见结构之二  队列 先进先出
  链式队列  : 用链表实现
  静态队列  : 用数组实现(通常都是循环队列)

   循环队列的讲解:
        1.静态队列为什么必须是循环队列
 2.循环队列需要几个参数确定
    两个,front,rear头尾指针
    (1)队列初始化
  front和rear都为0
    (2)队列非空
  front代表队列的第一个元素;rear代表队列最后一个有效元素的下一个元素
    (3)队列空
  front和rear的值相等,但不一定等于0

 3.循环队列各个参数的定义

 4.循环队列入队为算法讲解
   (1). 将值存入r所代表的位置
   (2).通过r=(r+1)%数组的长度实现数组下标的循环使用

 5.循环队列出队为算法讲解 
   f=(f+1)%数组的长度

 6.如何判断循环队列为空
   front和rear的值相等时队列是空还是满

 7.如何判断循环队列已满
   两种方式:
  (1)多增加一个表示参数
   (2)少用一个元素(通常使用第二种方式):如果r和f的值紧挨着,则队列已满
  if ((r+1)%数组长度==f)
   已满
  else
          不满

 

5.队列的应用
  所有和时间有关的操作都有队列的影子

 

6.递归
  一个函数直接或者间接调用自己(用栈实现)

递归的3个条件: 递归必须有一个明确的终止条件
  该函数处理的数据规模必须在递减(循环值可以增加,但是对于终止条件来说,规模是递减的,比如5开始增,到8就终止也是可以的)
               这个转化必须是可解的


循环和递归:理论上,循环都可以转化为递归,反之不成立

递归:易于理解
 速度慢
 存储空间大
循环:不易理解
 速度快
 存储空间小

递归的应用:
 树和森林就是以递归的方式定义的
 数和图的很多算法都是以递归来实现的
 很多数学公司就是以递归方式定义的:斐波拉切数列:1 2 3 5 8 13 21
 

 

7.非线性结构树和图
  树:
 专业定义:(1)有且只有一个称为根的节点
           (2)有若干个互不相交的子树,这些子树本身也是一棵树
 
 通俗的讲:(1)树是由节点和边组成
    (2)每一个节点的父节点只有一个(根节点除外),但是可以有多个子节点(叶子节点除外)

 专业术语:节点    父节点   子节点    子孙   堂兄弟
                  深度(从根节点到最底层节点的层数称之为深度,根节点为第一层)
    叶子节点(没有子节点的节点)    非终端节点(非叶子节点)
           度(子节点的个数称为该节点的度,树中节点最大的度称为树的度)


 树分类:
  一般树  :  任意一个节点的子节点的个数都不受限制
  
  二叉树  :  任意一个节点的子节点个数最多两个,且子节点的位置不可更改(左节点和右节点不能交换,是有序树)
   
   二叉树分类:
    一般二叉树:
    
    满二叉树  :不增加树的层数的情况下,无法再添加一个子节点的二叉树。满二叉树的提出是为了提出完全二叉树。
 
   完全二叉树就是满二叉树从底层右边开始连续删掉一些节点的二叉树。完全二叉树包含满二叉树。

    完全二叉树:如果只是删除了满二叉树最底层最右边的连续若干个节点,这样形成的二叉树就是完全二叉树。
      
    提出完全二叉树是为了解决存储为题。


  
 森林   :   n个不同相交的树的集合


树的存储
 二叉树的存储  :
   连续存储【必须是完全二叉树】 ,要存储一个一般二叉树,必须先把原来的二叉树扩充为完全二叉树,就是用一些无效的子节点扩充成完全二叉树,然后用的时候才能恢复到开始树的形状。          在转换成完全二叉树后在通过一定顺序(先序,中序,后续)将完全二叉树转化为线性结构存入内存(内存为线性存储)。


   链式存储  : (左孩子指针域,数据域,右孩子指针域)

 


一般树的存储  : 
  双亲表示法:

  孩子表示法:

  双亲孩子表示法:

  二叉树表示法:

 


二叉树操作 
 遍历     先序遍历  :  先访问根节点,在先序访问左子树,在先序访问右子树

 


 已知两种遍历方式,还原二叉树结构(先序,中序)(中序,后序),但是先序和后序无法推出原始树结构。
先序:  ABCDEFGH
中序:  BDCEAFHG
求后序:DECBHGFA


先序 :ABDGHCEFI
中序 :GDHBAECIF
求后序 :GHDBEIFCA


中序 :BDCEAFHG
后序 :DECBHGFA
求先序 :ABCDEFGH

 


树的应用  :
  树是数据库中数据组织的一种重要形式
  操作系统子父进程的关系本身就是一棵树(任务管理器进程右键菜单)
  面向对象语言中类的继承关系本身也是一棵树
  赫夫曼树

 

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  图:

 

 

8.排序
 冒泡 :相邻元素比较
      
 插入 :第2个放在第一个的某个位置保证有序,第3个放在前两个的某个位置,保证前3个有序,。。。。。。。

 选择 :把最小的和第一个互换,次小的和第二个互换。。。。

 快速排序 :

 归并排序 :先两个之间,在4个之间,在8个之间。。。。

posted on 2012-08-30 12:41  stream2011  阅读(202)  评论(0)    收藏  举报