数据结构05 队列

队列

定义:
抽象数据类型:

循环队列的顺序存储结构、队列的链式存储结构

a.循环队列的顺序存储结构源码

#include<stdio.h>
#include<malloc.h>

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

typedef int Status;
typedef int QElemType;

typedef struct Queue            //队列顺序存储结构体 
{
    QElemType data[MAXSIZE];    //循环队列数组 
    int front;                  //队头游标 
    int rear;                   //队尾游标 
}SqQueue,*pointQ;

Status EnQueue(SqQueue *Q);
Status DeQueue(SqQueue *Q);
void showMainFun(SqQueue *Q);
Status DestroyQueue(SqQueue *Q);
Status ClearQueue(SqQueue *Q);
Status QueueLenght(SqQueue *Q);

Status EnQueue(SqQueue *Q)      //入队 
{

    int flag = 1;
    QElemType e;
    pointQ point = Q;
    while(flag)
    {
        if((point->rear+1)%MAXSIZE == point->front)     //判断队列是否已满 
        {
            puts("此队列已满!");
            return ERROR;
        }else
        {           
            puts("请输入入队元素值:");
            scanf("%d",&e);
            point->data[point->rear] = e;
            printf("本次入队的值为:%d\n",point->data[point->rear]); 
            point->rear = (point->rear+1)%MAXSIZE;      //队尾游标指向循环队列后一位置 
            puts("入队成功!");
        }
        puts("是否继续入队? 1.是  0.否");
        scanf("%d",&flag);
    }

}

Status DeQueue(SqQueue *Q)      //出队 
{
    int flag = 1;
    pointQ point = Q;
    while(flag)
    {
        if((point->front) == (point->rear))     //判空 
        {
            puts("队列为空!");
            return ERROR;
        }else if((point->front+1)%MAXSIZE == point->rear)   //判断是否为队尾元素 
        {

            printf("此次出队为第%d元素值为:%d\n",point->front,point->data[point->front]);         
            puts("队列已为空!");
            return ERROR;
        }else                                   //正常的出队 
        {
            printf("此次出队为第%d元素值为:%d\n",point->front,point->data[point->front]);
            point->front = (point->front+1)%MAXSIZE;        //队头游标向后移一位  
        }
        puts("是否继续出队? 1.是  0.否");
        scanf("%d",&flag);
    }

}

Status DestroyQueue(SqQueue *Q)         //销毁队列(有问题) 
{
    pointQ point = Q;
    free(point);
    puts("此队列销毁成功!"); 
    return OK;
}

Status ClearQueue(SqQueue *Q)           //清空队列 
{
    pointQ point = Q;
    while((point->front) != (point->rear))      //直到 队头游标  等于  队尾游标 
    {
        point->front = (point->front+1)%MAXSIZE;// 队头游标向后移一位 
    }
    puts("队列已清空!"); 
}

Status QueueLenght(SqQueue *Q)          //获取队列长度 
{
    int len;
    pointQ point = Q;
    len = (point->rear-point->front+MAXSIZE)%MAXSIZE;
    printf("此时队列的长度为:%d\n",len);
    return OK;
}

void showMainFun(SqQueue *Q)
{
    int select,flag = 1;
    while(flag)
    {
        puts("\t\t\t\t  1.入队        \t\t\t\t"); 
        puts("\t\t\t\t  2.出队        \t\t\t\t");
        puts("\t\t\t\t  3.销毁队列      \t\t\t\t");
        puts("\t\t\t\t  4.清空队列      \t\t\t\t"); 
        puts("\t\t\t\t  5.当前队列长度        \t\t\t\t");
        puts("\t\t\t\t  0.退出            \t\t\t\t");
        scanf("%d",&select);    
        switch(select)
        {
            case 1: EnQueue(Q);break;
            case 2: DeQueue(Q);break;
            case 3: DestroyQueue(Q);break; 
            case 4: ClearQueue(Q);break;
            case 5: QueueLenght(Q);break;           
            case 0: flag = 0;break;
        }
    }
} 
int main()
{
    SqQueue queue;      //定义一队列 queue 
    queue.front = 0;
    queue.rear  = 0;
    pointQ pQ = &queue;
    showMainFun(pQ);

} 

b.队列的链式村存储结构源码

#include<stdio.h>
#include<malloc.h>

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

typedef int QElemType;
typedef int Status;

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

typedef struct
{
    QueuePtr front,rear;
}LinkQueue;

void showMainFun(LinkQueue *Q);
Status EnQueue(LinkQueue *Q);
Status DeQueue(LinkQueue *Q);
//Status ClearQueue(LinkQueue *Q);

Status EnQueue(LinkQueue *Q)        //入队 
{
    LinkQueue *point = Q;
    QueuePtr pNew;                  //队元素结点 
    QElemType e;
    int flag = 1;

    while(flag)
    {
        pNew = (QueuePtr)malloc(sizeof(QNode));     //开辟队元素结点空间 
        puts("请输入入队元素值:");
        scanf("%d",&e);
        pNew->data = e;
        pNew->next = NULL;                          //元素结点指针域为空 

        point->front->data++;                       //队节点数加 1 
        point->rear->next = pNew;                   //将新生成的入队元素与前一个队元素 链起来 
        point->rear = pNew;                         //将队尾指针指向最新入队的结点 
        printf("入队成功,元素值为:%d\n",point->rear->data);
        puts("是否继续入队? 1.是  0.否");
        scanf("%d",&flag);
    }   
}

Status DeQueue(LinkQueue *Q)        //出队 
{
    LinkQueue *point = Q;
    QueuePtr temp = point->front;   //定义一个临时 队元素指针变量 
    int flag = 1;

    while(flag)
    {

        if(temp == (point->rear))   //判空 
        {
            puts("此队列为空!");
            return ERROR; 
        }else if((temp->next) == (point->rear)) //判断是否只有一个队结点的情况(除去头结点) 
        {
            printf("出队元素为:%d\n",point->rear->data);
            free(point->rear);
            point->rear = temp;
            point->front->data = 0; 
            puts("出队成功!此队列已为空!");
            return ERROR; 
        }else                   //出队 
        {
            temp = temp->next;  //将临时指针指向第一个队结点元素 
            printf("出队元素为:%d\n",temp->data);
            point->front->next = temp->next;    //将头结点的指针域指向出队后新的第一个队结点元素 
            free(temp);         //释放刚刚出队的队元素内存空间 
            point->front->data--;//队结点元素减 1  
            temp = point->front;//临时结点重新指向头结点,为下一次出队做准备 
            puts("出队成功!");          
        }
        puts("是否继续出队? 1.是  0.否");
        scanf("%d",&flag);
    }   
}

//Status ClearQueue(LinkQueue *Q)
//{
//  LinkQueue *point = Q;
//  QueuePtr temp = point->front;
//  
//  if(point->front == point->rear)
//  {
//      puts("队列本来为空!");
//      return ERROR;
//  }
//  while((temp->next) !=NULL)
//  {
//      temp = temp->next;
//      if(temp->next )
//      free(point->rear);
//      point->rear = 
//  }
//}

void showMainFun(LinkQueue *Q)
{
    int select,flag = 1;
    while(flag)
    {
        puts("\t\t\t\t  1.入队        \t\t\t\t"); 
        puts("\t\t\t\t  2.出队        \t\t\t\t");
//      puts("\t\t\t\t  3.销毁队列      \t\t\t\t");
//      puts("\t\t\t\t  4.清空队列      \t\t\t\t"); 
//      puts("\t\t\t\t  5.当前队列长度        \t\t\t\t");
        puts("\t\t\t\t  0.退出            \t\t\t\t");
        scanf("%d",&select);    
        switch(select)
        {
            case 1: EnQueue(Q);break;
            case 2: DeQueue(Q);break;
//          case 3: DestroyQueue(Q);break; 
//          case 4: ClearQueue(Q);break;
//          case 5: QueueLenght(Q);break;           
            case 0: flag = 0;break;
        }
    }
}

int main()
{
    QNode qNode;
    qNode.data = 0;
    qNode.next = NULL;
    LinkQueue link;
    link.front = link.rear = &qNode;
    showMainFun(&link);

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值