数据结构—链队列

//链队列的实现
//设置一个头结点,初始的时候头指针和尾指针都指向队列头节点~

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



#define  Status      int
#define  QElemType   int

#define  INIT_SIZE   100
#define  INCREMENT   10
#define  OK          1
#define  ERROR       0

//链表队列节点类型
typedef  struct QNode {

    QElemType  data;
    struct QNode * next;
}QNode;

//链表队列类型
typedef struct{

    QNode *front;//指向链表的对头节点,用来删除
    QNode *rear;//指向链表的队尾节点,用来插入
}LinkQueue;



//初始化一个队列
Status   InitQueue (LinkQueue *Q)
{
    //让队头指针合队尾指针均指向头结点
    Q->front = Q->rear = (QNode *)malloc(sizeof(QNode ));//生成一个头结点类型
    if(!Q->front)
    {
        printf("队列初始化失败:内存分配失败\n");
        return ERROR;
    }
    return  OK;
}


//销毁一个队列
Status  DestroyQueue(LinkQueue * Q)
{

    while(Q->front)//如果Q->front 不为空
    {
        Q->rear=Q->front->next;
        free(Q->front);
        Q->front=Q->rear;
    }
    return OK;
}

//判断是否为空队列,如果是空队列,则返回OK,如果不是空队列,则返回ERROR
Status  QueueEmpty(LinkQueue *Q)
{
    if(Q->rear==Q->front)//如果对头指针和队尾指针相同则是空队列,头指针始终指向头节点
        return OK;
    return ERROR;
}


//向队列中插入元素
Status  EnQueue(LinkQueue *Q,QElemType e)
{
    QNode *s=(QNode *)malloc(sizeof(QNode));
    if(!s)
        return  ERROR;
    s->data=e;
    s->next=NULL;
    Q->rear->next=s;
    Q->rear=s;
    return OK;
}

//从队列中删除元素,并将元素值存放在e中
Status  DeQueue(LinkQueue *Q,QElemType  *e)
{
    if(Q->front==Q->rear)//队列为空
        return ERROR;
    QNode *s=Q->front->next;//令s指向队列的对头节点
    *e=s->data;
    Q->front->next=s->next;
    if(Q->rear==s)//如果只有一个元素
        Q->rear=Q->front;
    free(s);
    return OK;

}

//返回队列的长度
Status  QueueLength(LinkQueue *Q)
{
    int length=0;
    QNode *s=Q->front->next;
    while(s)
    {
        length++;
        s=s->next;
    }
    return length;
}

//返回队列的第一个元素
QNode*  GetHead(LinkQueue  *Q)
{
    QNode *s=Q->front->next;
    return s;
}

//打印输出整个队列
Status PrintQueue(LinkQueue *Q)
{
    if(Q->front==Q->rear)//如果队列为空
        return ERROR;
    QNode *s=Q->front->next;
    while(s)
    {
        printf("%d ",s->data);
        s=s->next;

    }
    printf("\n");
    return OK;
}


int main()
{

    LinkQueue *Q=(LinkQueue *)malloc(sizeof(LinkQueue));
    InitQueue(Q);
    EnQueue(Q,3);
    EnQueue(Q,5);
    EnQueue(Q,8);
    EnQueue(Q,14);
    EnQueue(Q,7);
    PrintQueue(Q);
    QElemType *e=(QElemType *)malloc(sizeof(QElemType));
    DeQueue(Q,e);
    printf("%d\n",*e);
    DeQueue(Q,e);
    printf("%d\n",*e);
    PrintQueue(Q);



    return 0;
}
 
 
链队列中需要特别注意的地方就是:删除操作的时候,如果队列中恰好只有一个元素的话,那么删除该元素也会删除队尾指针,所以这个操作需要提前判断队列中是不是只有一个元素~
 
 
 
 

你可能感兴趣的:(数据结构)