首页 > 其他 > 详细

队列链表实现

时间:2019-10-06 09:44:09      阅读:93      评论:0      收藏:0      [点我收藏+]

队列链表实现

结构声明

图示:链表队列结构模型
技术分享图片
对此可做 如下声明

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int QElemType;

#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10

typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode,*QuenePtr;

typedef struct 
{
    QuenePtr front; /* 队头指针 */
    QuenePtr rear;  /* 队尾指针 */
    int len;
}LinkQuene;

/*构造一个空队列 Q */
Status InitQuene(LinkQuene *Q)
{
    Q->front = Q->rear = (QuenePtr)malloc(sizeof(QNode));   /* 创建头结点 */
    if(!Q->front)
        return ERROR;
    Q->front->next = NULL;  /* 设置头结点指向next指向空 */
    Q->len = 0;             /* 队列个数清零 */
    return OK;
}

插入元素e到队尾

图示:空队列情况以及往空队列插入元素
技术分享图片
图示:队列非空时的插入情况
技术分享图片

/* 插入元素e到队尾 */
Status EnQuene(LinkQuene *Q, QElemType e)
{
    QuenePtr p = (QuenePtr)malloc(sizeof(QNode));
    if(!p)
        return ERROR;
    p->data = e;
    p->next = NULL; 
    Q->rear->next = p;   /* 插入到尾部 */
    Q->rear = p;         /* 插入好后再将尾指针指向p */
    Q->len++;
    return OK;
}

从队头弹出队列元素

图示:将队列元素从队头弹出
技术分享图片
图示:只有一个元素的弹出情况
技术分享图片

/* 从队头弹出队列元素 */
Status DeQuene(LinkQuene *Q, QElemType *e)
{
    if(Q->front == Q->rear)
        return ERROR;              /* 队列为空 */
    QuenePtr p = Q->front->next;   /* 指向第一个结点 */
    *e = p->data;
    Q->front->next = p->next;      /* 头结点的next指针指向第一个结点的下面 */
    if(Q->rear == p) 
        Q->rear = Q->front;        /* 如果只包含一个结点,删除后需尾指针指向空,需要从指向头结点 */
    free(p);
    return OK;
}

其他函数

/* 销毁队列 */
Status DestroyQuene(LinkQuene *Q)
{
    while(Q->front) {
        Q->rear = Q->front->next;   /* 让队尾指针指向第一个结点 */
        free(Q->front);             /* 从头结点开始释放 */
        Q->front = Q->rear;         /* 指向下一个结点 */
    }
    return OK;
}

/* 从队头到队尾打印队列 */
void printQuene(LinkQuene * Q)
{
    QuenePtr p = Q->front->next; /* 从第一个结点开始 */
    while(p) {                   /* 当前节点不为空 */
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}

测试函数


int main()
{
    LinkQuene Quene;
    LinkQuene * Q = &Quene;
    InitQuene(Q);
    EnQuene(Q,1);
    EnQuene(Q,2);
    EnQuene(Q,3);
    EnQuene(Q,4);

    printQuene(Q);
    QElemType e;
    DeQuene(Q,&e);
    printf("e %d\n",e);
    printQuene(Q);
    DestroyQuene(Q);
    return 0;
}

队列链表实现

原文:https://www.cnblogs.com/wjundong/p/11626495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!