编程实现队列的入队、出队、测长、打印

来源:互联网 发布:数据信息安全心得体会 编辑:程序博客网 时间:2024/04/30 07:07

http://blog.163.com/qingfeng_0818/blog/#m=0&t=1&c=fks_084070084087086070085094084095086086086069084085084066093(相关内容见此博客)

队列的定义及基本运算

1、定义
     队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表

      

  (1)允许删除的一端称为队头(Front)
  (2)允许插入的一端称为队尾(Rear)
  (3)当队列中没有元素时称为空队列
  (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表
     队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。
 【例】在队列中依次加入元素a1,a2,…,an之后,a1是队头元素,an是队尾元素。退出队列的次序只能是a1,a2,…,an

 

运行结果如下所示:

017编程实现队列的入队、出队、测长、打印 - 458905216 - SaEe的博客
 
/*017编程实现队列的入队、出队、测长、打印*/
#include <stdio.h>
#include <malloc.h>
/*队列的实现可以用链表或数组,本例用单链表来实现队列*/
typedef struct _Node
{
    int data;
 struct _Node *next;    /*指向链表下一个指针*/
}node;
typedef struct _Queue
{
    /*node表示队列中的每个节点元素,My Queue表示队列*/
 node *front;           /*队头*/
 node *rear;            /*队尾*/
}MyQueue;
/*在进行编程之前,首先要构造一个空的队列*/
MyQueue *CreateMyQueue()
{
    MyQueue *q = (MyQueue *)malloc(sizeof(MyQueue));    /*新建一个队列*/
 q->front = NULL;                                    /*把队首指针置空*/
 q->rear = NULL;                                     /*把队尾指针置空*/
    return q;
}
/*入队,从队尾一端插入节点*/
MyQueue *enqueue(MyQueue *q , int data)
{
    node *newP = NULL;
 newP = (node *)malloc(sizeof(node));                /*新建节点*/
 newP->data = data;                                  /*复制节点数据*/
 newP->next = NULL;
 if(q->rear == NULL)
 {
        /*若队列为空,新节点既是队首又是队尾*/
  q->front = q->rear = newP;
 }
    else
    {
        /*队列不为空,新节点放到队尾,队尾指针指向新节点*/
  q->rear->next = newP;
  q->rear = newP;
 }
 return q;
}
/*出队,从队头一端删除节点*/
MyQueue *dequeue(MyQueue *q)
{
    node *pnode = NULL;
 pnode = q->front;                     /*指向队头*/
 if(pnode == NULL)
 {
        printf("Empty queue!\n");
 }
 else
 {
        q->front = q->front->next;        /*新队头*/
  if(q->front == NULL)              /*若删除后队列为空时,对rear置空*/
  {
            q->rear = NULL;
  }
  free(pnode);                      /*删除原队头节点*/
 }/*如果要得到被删除的节点,可以不释放内存并且返回此节点*/
 return q;
}
/*队列的测长*/
int GetLength(MyQueue *q)
{
    int nlen = 0;
 node *pnode = q->front;               /*指向队头*/
 if(pnode != NULL)                     /*队列不能为空*/
 {
        nlen = 1;
 }
 /*注意在代码中,循环结束的条件是"pnode != q->rear",而不应该与NULL做比较,即"pnode != NULL",
 这是因为队尾有可能指向的不是一个链表的末节点*/
 while(pnode != q->rear)
 {
        /*遍历队列*/
  pnode = pnode->next;
  nlen++;                           /*遍历一次nlen递增1*/
 }
 return nlen;
}
/*队列的打印*/
void PrintMyQueue(MyQueue *q)
{
    node *pnode = q->front;
 if(pnode == NULL)
 {
        /*队列为空*/
  printf("Empty Queue!\n");
  return;
 }
 printf("data: ");
 while(pnode != q->rear)               /*遍历队列*/
 {
        printf("%d " , pnode->data);       /*打印节点数据*/
  pnode = pnode->next;
 }
 printf("%d " , pnode->data);           /*打印队尾节点数据*/
}
int main()
{
    int nlen = 0;
 MyQueue *hp = CreateMyQueue();        /*建立队列*/
 enqueue(hp , 1);                      /*入队1234*/
 enqueue(hp , 2);
 enqueue(hp , 3);
 enqueue(hp , 4);
 nlen = GetLength(hp);                 /*获得队列长度*/
 printf("nlen = %d\n" , nlen);
 PrintMyQueue(hp);                     /*打印队列数据*/
 dequeue(hp);                          /*出队两次*/
 dequeue(hp);
 nlen = GetLength(hp);                 /*再次获得队列长度*/
 printf("\nnlen = %d\n" , nlen);    
 PrintMyQueue(hp);                     /*再次打印队列数据*/
 printf("\n");
 return 0;
}
原创粉丝点击