队列的链式存储结构

队列的链式存储结构

先上代码:

#ifndef _QUEUE_H_
#define _QUEUE_H_

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

typedef int QElemType;

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

typedef struct QNode* QueuePtr;

typedef struct
{
    QueuePtr fronter,rearer;
}LinkQueue;


void CreatQueue(LinkQueue* Q);

int EnQueue(LinkQueue* Q,QElemType e);

int DeQueue(LinkQueue* Q,QElemType* e);

int ClearQueue(LinkQueue* Q);

void TraveQueue(LinkQueue* Q);
#endif // _QUEUE_H_

#include "queue.h"

void CreatQueue(LinkQueue* Q)
{
    QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
    q->data = 0;//存储列队长度
    q->next = NULL;
    Q->fronter = q;
    Q->rearer = q;
}

int EnQueue(LinkQueue* Q,QElemType e)
{
    QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
    q->data = e;
    q->next = NULL;

    Q->rearer->next = q;
    Q->rearer = Q->rearer->next;

    Q->fronter->data += 1;
    return 0;
}

int DeQueue(LinkQueue* Q,QElemType* e)
{
    QueuePtr p;
    if(Q->fronter == Q->rearer)
        return -1;
    p = Q->fronter->next;
    *e = p->data;
    Q->fronter->next = p->next;
    if(Q->rearer == p)//若队头是队尾
        Q->rearer = Q->fronter;
    free(p);
    Q->fronter->data -= 1;
    return 0;
}

int ClearQueue(LinkQueue* Q)
{
    QueuePtr p,q;
    Q->rearer = NULL;
    p = Q->fronter;
    while(p)
    {
        q = p->next;
        free(p);
        p = q;
    }
    Q->fronter = NULL;

    printf("Queue is clear!\n");
    return 0;
}

void TraveQueue(LinkQueue* Q)
{
    int i = 0;
    QueuePtr p;
    p = Q->fronter->next;
    while(p)
    {
        i++;
        printf("the number is %d,the data is %d\n",i,p->data);
        p = p->next;
    }
    printf("the Queue's length is %d\n",Q->fronter->data);
}


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

#include "queue.h"

int main()
{
    int i = 0;
    LinkQueue Q;
    srand(time(0));//初始化随机数种子

    CreatQueue(&Q);
    for(i = 0;i < 8;i++)
    {
        EnQueue(&Q,rand()%100 + 1);
    }
    TraveQueue(&Q);

    EnQueue(&Q,rand()%100 + 1);
    EnQueue(&Q,rand()%100 + 1);
    TraveQueue(&Q);

    DeQueue(&Q,&i);
    printf("i = %d is out of the Queue\n",i);
    DeQueue(&Q,&i);
    printf("i = %d is out of the Queue\n",i);
    TraveQueue(&Q);

    ClearQueue(&Q);
    return 0;
}

正文:

  • 队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
  • 链表结构中有两个指针。
  • 创建队列时,创建了一个头节点,其并不是队列元素。