队列链表实现

队列链表实现

结构声明

图示:链表队列结构模型

对此可做 如下声明

#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;
}

猜你喜欢

转载自www.cnblogs.com/wjundong/p/11626495.html
今日推荐