C和指针:第十七章

1. 内存分配

三种内存分配方式:

    1.) 静态数组,它要求结构长度固定,长度必须在编译时确定,这个方案最为简单且最不容易出错;

    2.) 动态分配的数组,在运行时才决定数组的长度,可以分配一个新的,更大的数组,把原来数组的元素复制到新数组中,再删除原来的数组,从而达到改变数组长度的目的。决定是否采用动态数组时,需要由此增加的复杂性和随之产生的灵活性(不需要一个固定的,预先确定的长度)之间作一番权衡。

    3.) 动态分配的链式结构,它提供了最大程序的灵活性,因为每个元素在需要时才单独进行分配,所以除了不能超过机器的可用内存之外,这种方式对元素的数量几乎没有限制。但链式结构的链接字段需要消耗一定的内存,在链式结构中访问一个特定元素的效率不如数组。

 

2. 堆栈(stack)

    堆栈的数据结构特点是后进先出(Last-In First-Out,LIFO)。

    1.) 堆栈接口

    基本的堆栈操作通常被称为push和pop,push就是把一个新值压入到堆栈的顶部,pop就是把堆栈顶部的值移出堆栈并返回这个值。堆栈只提供对它的顶部值进行访问。我们还需要两个函数来使用堆栈,一个是检查堆栈是否为空,另一个是检查堆栈是否已满。

    另一种堆栈接口提供三种基本操作:push, pop 和 top,push 操作和上面一样;pop只负责把顶部元素从堆栈中移除,不负责返回这个值;top返回顶部元素的值,但不把顶部元素从堆栈中移除。

 

    2.) 实现堆栈

    堆栈的基本方法是:被push 到堆栈时把它们存储于数组中连续的位置上,记住最后一个被push值的下标。如果需要执行pop,只要简单地减少这个下标值即可。

    a. 使用静态数组实现堆栈操作,代码如下:

a

 

    b. 使用动态数组实现堆栈操作,代码如下:

b

 

    c. 使用动态链式实现堆栈操作,代码如下:

c

 

3. 队列

    队列的数据结构特点是先进先出(First-IN First-OUT, FIFO)。

    1.) 队列接口

    队列的修改是依先进先出的原则进行的,新加的元素总是加入队尾,销毁的元素总是队列头上的。这也正好准确地描述了现实生活中排除的实际体验。一个队列接口可以如下:

 

d

    2.) 实现队列

    实现队列的方法可以是动态数组、链表和循环队列(circular array),现在主要介绍循环队列的实现。它需要两个指针,一个指向队列中第一个元素(front),一个指向队列最后一元素(rear)。示例图如下:

image                    image 

 image    image

注:上面队列为满的队列,实际上没有满,目的是为了让front和rear不指向同一位置,因为队列为空时,它们是指向同一个位置的。这样便可以区分队列为空或为满了。

当队列为空时,front 与 rear关系为:(rear + 1) % QUEUE_SIZE == front

当队列为满时,front 与 rear关系为:(rear + 2) % QUEUE_SIZE == front

代码如下:

d

以上参考:http://student.zjzk.cn/course_ware/data_structure/web/zhanhuoduilie/zhanhuoduilie3.2.2.1.htm

 

4. 二叉树

    树是一种重要的非线性数据结构,树形结构是结点之间有分支,并具有层次关系的结构。二叉树(binary search tree)是树中一种特殊形式,它的每个节点最多有两个子树,分别为左子树和右子树。最上面的那个节点,称为树根,它没有父节点。没有子节点的节点称为叶节点(leaf node)。

    二叉树有个额外的属性:每个节点的值比它的左子树的所有节点的值都要大,但比它的右子树的所有节点的值都要小。

 

    1.) 二叉树接口

    #define TREE_TYPE  int  // 树值的类型

    // insert 向树添加一个新值,参数是需要被添加的值,它必须是原先不存在于树中

    void insert(TREE_TYPE value);

 

    // find 查找一个特定的值,这个值作为第1参数传递给函数

    TREE_TYPE *find(TREE_TYPE value);

 

    // pro_order_traverse 执行树的前序遍历,它的参数是一个回调函数指针,它所指向的函数将在树中处理每个节点被调用,节点的值作为参数传递给这个参数

    void pre_order_traverse (void (*callback) (TREEE_TYPE value));

 

    2.) 实现二叉树

   

d
posted @ 2010-12-25 20:47  jeff_nie  阅读(221)  评论(0编辑  收藏  举报