• 单链队列


     /* c3-2.h 单链队列--队列的链式存储结构 */
     typedef struct QNode
     {
       QElemType data;
       struct QNode *next;
     }QNode,*QueuePtr;
    
     typedef struct
     {
       QueuePtr front,rear; /* 队头、队尾指针 */
     }LinkQueue;
     /* bo3-2.c 链队列(存储结构由c3-2.h定义)的基本操作(9个) */
     Status InitQueue(LinkQueue *Q)
     { /* 构造一个空队列Q */
       (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
       if(!(*Q).front)
         exit(OVERFLOW);
       (*Q).front->next=NULL;
       return OK;
     }
    
     Status DestroyQueue(LinkQueue *Q)
     { /* 销毁队列Q(无论空否均可) */
       while((*Q).front)
       {
         (*Q).rear=(*Q).front->next;
         free((*Q).front);
         (*Q).front=(*Q).rear;
       }
       return OK;
     }
    
     Status ClearQueue(LinkQueue *Q)
     { /* 将Q清为空队列 */
       QueuePtr p,q;
       (*Q).rear=(*Q).front;
       p=(*Q).front->next;
       (*Q).front->next=NULL;
       while(p)
       {
         q=p;
         p=p->next;
         free(q);
       }
       return OK;
     }
    
     Status QueueEmpty(LinkQueue Q)
     { /* 若Q为空队列,则返回TRUE,否则返回FALSE */
       if(Q.front==Q.rear)
         return TRUE;
       else
         return FALSE;
     }
    
     int QueueLength(LinkQueue Q)
     { /* 求队列的长度 */
       int i=0;
       QueuePtr p;
       p=Q.front;
       while(Q.rear!=p)
       {
         i++;
         p=p->next;
       }
       return i;
     }
    
     Status GetHead_Q(LinkQueue Q,QElemType *e) /* 避免与bo2-6.c重名 */
     { /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */
       QueuePtr p;
       if(Q.front==Q.rear)
         return ERROR;
       p=Q.front->next;
       *e=p->data;
       return OK;
     }
    
     Status EnQueue(LinkQueue *Q,QElemType e)
     { /* 插入元素e为Q的新的队尾元素 */
       QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
       if(!p) /* 存储分配失败 */
         exit(OVERFLOW);
       p->data=e;
       p->next=NULL;
       (*Q).rear->next=p;
       (*Q).rear=p;
       return OK;
     }
    
     Status DeQueue(LinkQueue *Q,QElemType *e)
     { /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */
       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;
     }
    
     Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
     { /* 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败 */
       QueuePtr p;
       p=Q.front->next;
       while(p)
       {
         vi(p->data);
         p=p->next;
       }
       printf("\n");
       return OK;
     }
     /* main3-2.c 检验bo3-2.c的主程序 */
     #include"c1.h"
     typedef int QElemType;
     #include"c3-2.h"
     #include"bo3-2.c"
    
     void visit(QElemType i)
     {
       printf("%d ",i);
     }
    
     int main()
     {
       int i;
       QElemType d;
       LinkQueue q;
       i=InitQueue(&q);
       if(i)
         printf("成功地构造了一个空队列!\n");
       printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
       printf("队列的长度为%d\n",QueueLength(q));
       EnQueue(&q,-5);
       EnQueue(&q,5);
       EnQueue(&q,10);
       printf("插入3个元素(-5,5,10)后,队列的长度为%d\n",QueueLength(q));
       printf("是否空队列?%d(1:空 0:否)  ",QueueEmpty(q));
       printf("队列的元素依次为:");
       QueueTraverse(q,visit);
       i=GetHead_Q(q,&d);
       if(i==OK)
         printf("队头元素是:%d\n",d);
       DeQueue(&q,&d);
       printf("删除了队头元素%d\n",d);
       i=GetHead_Q(q,&d);
       if(i==OK)
         printf("新的队头元素是:%d\n",d);
       ClearQueue(&q);
       printf("清空队列后,q.front=%u q.rear=%u q.front->next=%u\n",q.front,q.rear,q.front->next);
       DestroyQueue(&q);
       printf("销毁队列后,q.front=%u q.rear=%u\n",q.front, q.rear);
       return 0;
     }
    作者:cpoint
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    2017 多校联合训练 8 题解
    2017 多校联合训练 7 题解
    2017 多校联合训练 6 题解
    2017 多校联合训练 5 题解
    2017 多校联合训练 4 题解
    windows 安装python
    pygame 使用
    python 发布
    面向对象的思维方法
    python 基础
  • 原文地址:https://www.cnblogs.com/cpoint/p/3479524.html
Copyright © 2020-2023  润新知