Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1730162
  • 博文数量: 358
  • 博客积分: 2180
  • 博客等级: 大尉
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 13:47
文章分类

全部博文(358)

文章存档

2016年(17)

2015年(55)

2014年(9)

2013年(67)

2012年(181)

2011年(29)

分类:

2012-03-15 20:40:55

原文地址:数据结构的基本使用技巧 作者:nx_even

说明:
    enum这个关键字来一次定义许多标记整型常量,其实它相当于定义一个整型常量的表,方便应用时查找。当然他的大部分功能都可以被宏定义代替,不过毕竟enum关键字定义的东东是支持类型检查的,可以用编译器来发现一些错误(enum定义的只能是整型的常量表)。

一、布尔类型的变量定义:

    typedef enum
    {
        faLse = 0,
        true  = 1
    }BOOL;

二、具有相关性的常量性质的枚举变量定义,常与数组搭配使用,或用作参数变量传递:
1、与数组元素关联

    const unsigned char* const bitmap_index[] =
    {
        bmp1,
        bmp2,
        bmp3,
        bmp4
    };

    typedef enum
    {
        BMP_BMP1 = 0,
        BMP_BMP2,
        BMP_BMP3,
        BMP_BMP4,//最后一个逗号可以省略
    }BITMAP_INDEX;

    //获取数组元素
    bitmap_index[BMP_BMP1];
    bitmap_index[BMP_BMP3];

2、方便函数参数定义与传递,强制函数形参为BITMAP_INDEX枚举变量中的常量元素:

    unsigned char* get_bitmap(BITMAP_INDEX index);

三、define定义访问结构体成员的宏函数:

    typedef struct example1
    {
        unsigned       a1;
        int            b1;
        unsigned char  *c1;
    }EXAMPLE1;


    typedef struct example2
    {
        unsigned       a2;
        int            b2;
        unsigned char  *c2;
        EXAMPLE *      d;
    }EXAMPLE2;

    #define GET_A1(pThis)    (pThis->d.a1)

四、实例,用C语言实现循环队列:

    线性结构的主要操作就是插入和删除,顺序线性表、单链表、双链表都没有限制插入和删除操作的位置。限定插入和删除操作在线性表的同一端进行那么这种结构就是栈;如果限定插入在一端而删除在另一端,这种结构就是队列;栈的特点是先进后出(FILO)而对列是先进先出(FIFO)。进行插入的一端叫队尾,删除的一端叫队头。
  队列的实现可以用顺序线性表也可以用链表,在实际使用中有一种更常用的队列叫循环队列。循环队列是把队列的头和尾在逻辑上连接起来,构成一个环。循环队列中首尾相连,分不清头和尾,此时需要两个指示器分别指向头部和尾部。插入就在尾部指示器的指示位置处插入,删除就在头部指示器的指示位置删除。
  循环队列在插入时也要判断其是否已满,删除时要判断其是否已空。为空的条件比较简单当头部指示器和尾部指示器指向同一个位置时表示循环队列为空;因为尾部指示器指示的是最后一个元素的下一个位置,所以循环队列已满时头部指示器和尾部指示器也指向同一个位置,为了区分这两种状况有两种方法,一种增加一个标识变量来区分,另一种损失循环队列中的一个元素,即头和尾之间的位置不用,此时循环队列为满的条件变成头部指示器加1等于尾部指示器;为空的条件成为头部指示器和尾部指示器指向同一位置。
   循环队列的首尾相连是通过取余操作来实现的,把头和尾的位置都除以队列最大长度然后取余。当到达尾部及最后一个位置时再加1就成了队列的长度刚好可以整除余0即又回到了队头。
   循环队列的主要操作:
   (1)创建循环队列
   (2)初始化循环队列
   (3)判断循环队列是否为空
   (4)判断循环队列是否为满
   (5)入队
   (6)出队

//采用牺牲队列中的一个元素的策略区分队列是否为空和满
#define MAXSIZE    16
typedef struct
{
    unsigned char head;
    unsigned char tail;
    unsigned char queue_array[MAXSIZE];
}circulate_queue;

typedef enum
{
    false = 0,
    true
}BOOL;

//利用宏函数判断队列状态
#define IS_FULL(pThis)    ((circulate_queue *)pThis->head == ((circulate_queue *)pThis->tail + 1) % MAXSIZE)//此处牺牲一个队列元素
#define IS_EMPTY(pThis)    ((circulate_queue *)pThis->head == (circulate_queue *)pThis->tail)

void init_circulate_queue(circulate_queue * queue)
{
    queue->head = 0;
    queue->tail = 0;
}

BOOL in_queue(circulate_queue * queue, unsigned char value)
{
    if (IS_FULL(queue))
    {
        U_printf("Queue is full!!\n");//用于调试
        return false;    
    }

    queue->queue_array[queue->tail] = value;
    queue->tail = (queue->tail + 1) % MAXSIZE;

    return ture;
}

unsigned char out_queue(circulate_queue * queue)
{
    if (IS_EMPTY(queue))
    {
        U_printf("Queue is empty!!\n");
        return 0xff;//返回一个默认的填充值
    }
    
    unsigned char temp = queue->queue_array[queue->head];
    queue->head = (queue->head + 1) % MAXSIZE;

    return temp;
}

阅读(695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~