数据结构C语言实现系列——队列

来源:csdn 作者:88250 2007-12-01 出处:pcdog.com

  • 数据结构
  • 下一页12
    #include <stdio.h>
    #include <stdlib.h>

    typedef int elemType;
    /************************************************************************/
    /*                    以下是关于队列链接存储操作的6种算法               */
    /************************************************************************/
    struct sNode{
        elemType data;            /* 值域 */
        struct sNode *next;        /* 链接指针 */
    };
    struct queueLK{
        struct sNode *front;    /* 队首指针 */
        struct sNode *rear;        /* 队尾指针 */
    };

    /* 1.初始化链队 */
    void initQueue(struct queueLK *hq)
    {
        hq->front = hq->rear = NULL;        /* 把队首和队尾指针置空 */
        return;
    }

    /* 2.向链队中插入一个元素x */
    void enQueue(struct queueLK *hq, elemType x)
    {
        /* 得到一个由newP指针所指向的新结点 */
        struct sNode *newP;
        newP = malloc(sizeof(struct sNode));
        if(newP == NULL){
            printf("内存空间分配失败! ");
            exit(1);
        }
        /* 把x的值赋给新结点的值域,把新结点的指针域置空 */
        newP->data = x;
        newP->next = NULL;
        /* 若链队为空,则新结点即是队首结点又是队尾结点 */
        if(hq->rear == NULL){
            hq->front = hq->rear = newP;
        }else{    /* 若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点 */
            hq->rear = hq->rear->next = newP;        /* 注意赋值顺序哦 */
        }
        return;
    }

    /* 3.从队列中删除一个元素 */
    elemType outQueue(struct queueLK *hq)
    {
        struct sNode *p;
        elemType temp;
        /* 若链队为空则停止运行 */
        if(hq->front == NULL){
            printf("队列为空,无法删除! ");
            exit(1);
        }
        temp = hq->front->data;        /* 暂存队尾元素以便返回 */
        p = hq->front;                /* 暂存队尾指针以便回收队尾结点 */
        hq->front = p->next;        /* 使队首指针指向下一个结点 */
        /* 若删除后链队为空,则需同时使队尾指针为空 */
        if(hq->front == NULL){
            hq->rear = NULL;
        }
        free(p);        /* 回收原队首结点 */
        return temp;    /* 返回被删除的队首元素值 */
    }

    /* 4.读取队首元素 */
    elemType peekQueue(struct queueLK *hq)
    {
        /* 若链队为空则停止运行 */
        if(hq->front == NULL){
            printf("队列为空,无法删除! ");
            exit(1);
        }
        return hq->front->data;        /* 返回队首元素 */
    }

    /* 5.检查链队是否为空,若为空则返回1, 否则返回0 */
    int emptyQueue(struct queueLK *hq)
    {
        /* 判断队首或队尾任一个指针是否为空即可 */
        if(hq->front == NULL){
            return 1;
        }else{
            return 0;
        }
    }

    /* 6.清除链队中的所有元素 */
    void clearQueue(struct queueLK *hq)
    {
        struct sNode *p = hq->front;        /* 队首指针赋给p */
        /* 依次删除队列中的每一个结点,最后使队首指针为空 */
        while(p != NULL){
            hq->front = hq->front->next;
            free(p);
            p = hq->front;
        }    /* 循环结束后队首指针已经为空 */
        hq->rear = NULL;        /* 置队尾指针为空 */
        return;
    }

    /************************************************************************/

    int main(int argc, char* argv[])
    {
        struct queueLK q;
        int a[8] = {3, 8, 5, 17, 9, 30, 15, 22};
        int i;
        initQueue(&q);
        for(i = 0; i < 8; i++){
            enQueue(&q, a[i]);
        }
        printf("%d ", outQueue(&q));    printf("%d  ", outQueue(&q));
        enQueue(&q, 68);
        printf("%d ", peekQueue(&q));    printf("%d  ", outQueue(&q));
        while(!emptyQueue(&q)){
            printf("%d ", outQueue(&q));
        }
        printf(" ");
        clearQueue(&q);
        system("pause");
    }

    更多内容请看PCdog.com--数据结构数据结构相关文章C/C++进阶技术文档专题
    下一页12
    上一篇:数据结构C语言实现系列——二叉树
    下一篇:硬盘软故障完全修复教程(数据结构篇)