• 队列的实现


    一、队列的定义:

    队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。象日常生活中的排队,最早入队的最早离开。

    在队列中,允许插入的的一端叫队尾,允许删除的一端则称为队头

    抽象数据类型队列:

    ADT Queue{

    数据对象: D={ai| ai(-ElemSet,i=1,2,...,n,n>=0}

    数据关系: R1={<ai-1,ai> | ai-1,ai(- D,i=2,...,n}

    基本操作:

    InitQueue(&Q) 构造一个空队列Q

    Destroyqueue(&Q) 队列Q存在则销毁Q

    ClearQueue(&Q) 队列Q存在则将Q清为空队列

    QueueEmpty(Q) 队列Q存在,若Q为空队列则返回TRUE,否则返回FALSE

    QueueLenght(Q) 队列Q存在,返回Q的元素个数,即队列的长度

    GetHead(Q,&e) Q为非空队列,用e返回Q的队头元素

    EnQueue(&Q,e) 队列Q存在,插入元素e为Q的队尾元素

    DeQueue(&Q,&e) Q为非空队列,删除Q的队头元素,并用e返回其值

    QueueTraverse(Q,vivsit()) Q存在且非空,从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败

    }ADT Queue

    二、链队列-队列的链式表示和实现

    用链表表示的队列简称为链队列。一个链队列显然需要两个分别指示队头和队尾的指针。

    三、代码实现

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

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

    typedef int Status ;
    //存储表示
    struct STU{
      char name[20];
      char stuno[10];
      int age;
      int score;
    };
    typedef struct STU QElemType;
    typedef struct QNode{
      QElemType data;
      struct QNode *next;
    }QNode,*QueuePtr;

    typedef struct{
      QueuePtr front;
      QueuePtr rear;
    }LinkQueue;

    //操作说明
    Status InitQueue(LinkQueue *Q);
    //构造一个空队列Q
    Status Destroyqueue(LinkQueue Q);
    //队列Q存在则销毁Q
    Status ClearQueue(LinkQueue *Q);
    //队列Q存在则将Q清为空队列
    Status QueueEmpty(LinkQueue *Q);
    // 队列Q存在,若Q为空队列则返回TRUE,否则返回FALSE
    Status QueueLenght(LinkQueue *Q);
    // 队列Q存在,返回Q的元素个数,即队列的长度
    Status GetHead(LinkQueue Q,QElemType *e);
    //Q为非空队列,用e返回Q的队头元素
    Status EnQueue(LinkQueue *Q,QElemType e);
    //队列Q存在,插入元素e为Q的队尾元素
    Status DeQueue(LinkQueue Q,QElemType *e);
    //Q为非空队列,删除Q的队头元素,并用e返回其值
    Status QueueTraverse(LinkQueue *Q);
    //Q存在且非空,从队头到队尾,依次对Q的每个数据元素调用函数visit()。一旦visit()失败,则操作失败
    //操作的实现

    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存在则销毁Q
      while(Q.front){
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
      }
      return OK;
    }

    Status EnQueue(LinkQueue *Q,QElemType e) {
      QueuePtr p;    
      //队列Q存在,插入元素e为Q的队尾元素
      p=(QueuePtr)malloc(sizeof(QNode));
      if(!p) exit(OVERFLOW);
      p->data=e;p->next=NULL;
      /*printf("%s",(p->data).name);*/
      Q->rear->next=p;
      Q->rear=p;
      return OK;
    }

    Status DeQueue(LinkQueue Q,QElemType *e) {
      QueuePtr p;    
      //Q为非空队列,删除Q的队头元素,并用e返回其值
      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 ClearQueue(LinkQueue *Q) {
      if(Q->front==Q->rear)return ERROR;
      Q->front=Q->rear=NULL;       
    }    

    Status QueueEmpty(LinkQueue *Q) {
      if(Q->front==Q->rear)
        return FALSE;
      else
        return OK;      
    }    

    Status QueueLenght(LinkQueue *Q) {
      QueuePtr p;    
      int i;
      i=0;
      if(Q->front==Q->rear) return ERROR;
      else
      {
        p=Q->front; 
        while (p!=Q->rear) {  
          p=p->next; 
          ++i;
        } 
      }   
      return i;      
    }  

    Status GetHead(LinkQueue Q,QElemType *e) {
      QueuePtr p;         
      if(Q.front==Q.rear) return ERROR;
      else
      {
        p=Q.front->next;  
        *e=p->data;
      } 
    }   

    Status QueueTraverse(LinkQueue *Q) {
      QueuePtr p;    
      p=Q->front->next;    
      while(p!=Q->rear->next)
      { 
         printf("%s  %s  %d  %d\n",(p->data).name,(p->data).stuno,(p->data).age,(p->data).score);   
         p=p->next;
      }  
    }              

    int main()
    {
      QElemType e;
      LinkQueue *Queue;
      int i;

      /*clrscr();*/

      printf("\n\n-------------------SqStack Demo is running...----------------\n\n");
      printf("First is IniQueue function.\n");
      InitQueue(Queue);

      strcpy(e.name,"stu1");
      strcpy(e.stuno,"100001");
      e.age=80;
      e.score=1000;
      EnQueue(Queue,e);
      i=QueueLenght(Queue);
      printf("length is %d\n",i);
     
      strcpy(e.name,"stu3");
      strcpy(e.stuno,"100002");
      e.age=80;
      e.score=1000;
      EnQueue(Queue,e);
      i=QueueLenght(Queue);
      printf("length is %d\n",i);
      QueueTraverse(Queue);
      system("PAUSE"); 
      return 0;
    }

  • 相关阅读:
    文件操作一写操作
    文件操作一读操作
    python基础初识
    while循环和格式化输出
    python基础数据类型一(整数类型和布尔值)
    CentOS 6下安装nodejs 0.9.0(转)
    CentOS安装Python教程
    Discuz! X2.5数据库字典(转)
    SQL 语句中的union操作符
    thinkphp空操作和配置文件实现简化路由
  • 原文地址:https://www.cnblogs.com/djcsch2001/p/2035166.html
Copyright © 2020-2023  润新知