队列再来一题

来源:互联网 发布:免费顶级域名申请 编辑:程序博客网 时间:2024/04/29 21:12
//3.13 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。

//先定义链队结构:
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
typedef struct queuenode{
    int data;
    struct queuenode *next;
}QueueNode;//以上是结点类型的定义

typedef struct{
    QueueNode *rear;
}LinkQueue;    //只设一个指向队尾元素的指针

//(1)置空队
void InitQueue(LinkQueue *Q)
{//置空队:就是使头结点成为队尾元素
    QueueNode *s;
    s=(QueueNode*)malloc(sizeof(QueueNode));
    
    Q->rear=Q->rear->next;//将队尾指针指向头结点
    while(Q->rear!=(Q->rear->next))//当队列非空,将队中元素逐个出队
    {
        s=Q->rear->next;
        Q->rear->next=s->next;    
        free(s);//回收结点空间
    }
    s=NULL;
}
//(2)判队空
int EmptyQueue(LinkQueue *Q)
{//判队空
    //当头结点的next指针指向自己时为空队
    return Q->rear->next->next==Q->rear->next;
}

//(3)入队
void EnQueue(LinkQueue *Q,int x)
{//入队
    //也就是在尾结点处插入元素
    QueueNode *p;
    p=(QueueNode*)malloc(sizeof(QueueNode));//申请新结点
    p->data=x;p->next=Q->rear->next;//初始化新结点并链入
    Q->rear->next=p;
    Q->rear=p;//将尾指针移至新结点
}

//(4)出队
int DeQueue(LinkQueue *Q)
{//出队,把头结点之后的元素摘下
    int x;
    QueueNode *p;
    if(EmptyQueue(Q))
        printf("Queue underflow");
    p=Q->rear->next->next;//p指向将要摘下的结点
    x=p->data;//保存结点中数据
    if(p==Q->rear)
    {//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
        Q->rear=Q->rear->next;Q->rear->next=p->next;
    }
    else
        Q->rear->next->next=p->next;//摘下结点p
    free(p);//释放被删结点
    return x;
}

 int main()
{  
    LinkQueue *Q;
    int i,e,n;
    Q=(LinkQueue*)malloc(sizeof(LinkQueue));
    Q->rear->next=(QueueNode*)malloc(sizeof(QueueNode));//这个语句得注意,十分关键,弄了一下午才弄出来
       InitQueue(Q);
      printf("input the number of the data:");
       scanf("%d",&n);
       for(i=0;i<n;i++)
    {
        printf("enter the queue:");
          scanf("%d",&e);
          EnQueue(Q,e);
    }
    
    printf("input the number of the datas to out:");
    scanf("%d",&n);
    
    for(i=0;i<n;i++)
    {
          printf("output first data in  the queue:");
           DeQueue(Q);
           printf("%d\n",Q->rear->data);
    }  
    return 0;
}
0 0