Data Structure --- LinkQueue


#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct QNode
{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{
    (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
    if(!(*Q).front) exit(OVERFLOW);
    (*Q).front->next=NULL;
    return OK;
}
void ClearQueue(LinkQueue *Q)
{
    (*Q).rear=(*Q).front->next;  //之所以用rear是因为不想浪费变量 反正也是要清空

//不能改变front的信息 这样做会改变front的信息  最后一步找不到原本的front了
//    while((*Q).rear)
//    {
//        (*Q).front=(*Q).rear->next;
//        free((*Q).rear);
//        (*Q).rear=(*Q).front;
//    }

      while((*Q).rear)
      {
          (*Q).front->next=(*Q).rear->next;
          free((*Q).rear);
          (*Q).rear=(*Q).front->next;
      }

      (*Q).rear=(*Q).front;
}
void DestoryQueue(LinkQueue *Q)
{
    while((*Q).front)
    {
        (*Q).rear=(*Q).front->next;
        free((*Q).front);
        (*Q).front=(*Q).rear;
    }
}
Status QueueEmpty(LinkQueue Q)
{
    return Q.front==Q.rear?TRUE:FALSE;
}
int QueueLength(LinkQueue Q)
{
    QueuePtr p=Q.front->next;
    int i=0;
    while(p)
    {
        i++;
        p=p->next;
    }
    return i;
}
Status GetHead(LinkQueue Q,ElemType *e)
{
    if(Q.front==Q.rear)
        return ERROR;
    *e=(Q.front->next)->data;
    return OK;
}
Status EnQueue(LinkQueue *Q,ElemType e)
{
    QueuePtr p;

    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    p->next=NULL;
    p->data=e;

    (*Q).rear->next=p;
    (*Q).rear=p;

    return OK;
}
Status DeQueue(LinkQueue *Q,ElemType *e)
{
    QueuePtr p;

    if((*Q).front==(*Q).rear)
        return ERROR;

    p=(*Q).front->next;
    *e=p->data;

    (*Q).front->next=p->next;

    if((*Q).rear==p)
        (*Q).rear=(*Q).front;

    free(p);

    return OK;
}
void  TraverseQueue(LinkQueue Q,void (visit) (ElemType))
{
    QueuePtr p;
    p=Q.front->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
}
void Print(ElemType e)
{
    printf("%d ",e);
}
int main()
{
    LinkQueue Q;

    InitQueue(&Q);

    int i,m,n;

    for(i=1;i<=8;i++)
    EnQueue(&Q,2*i-1);

    printf("当前队中的元素有:\n");
    TraverseQueue(Q,Print);
    printf("\n");

    printf("当前队中的队头元素是:");
    GetHead(Q,&m);
    printf("%d",m);

    printf("\n");

    printf("当前队中删除的元素有:\n");
    for(i=1;i<=3;i++)
    {
        DeQueue(&Q,&n);
        printf("%d ",n);
    }

    printf("\n");

    printf("当前队中的元素有:\n");
    TraverseQueue(Q,Print);
    printf("\n");

    printf("当前队中的队头元素是:");
    GetHead(Q,&m);
    printf("%d",m);

    return 0;
}

测试结果:

当前队中的元素有:
1 3 5 7 9 11 13 15
当前队中的队头元素是:1
当前队中删除的元素有:
1 3 5
当前队中的元素有:
7 9 11 13 15
当前队中的队头元素是:7
Process returned 0 (0x0)   execution time : 3.613 s
Press any key to continue.
发布了34 篇原创文章 · 获赞 38 · 访问量 2648

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/104214890