单链表实现队列链式存储

本文详细介绍了如何使用单链表来实现队列的链式存储结构,包括队列的基本操作如入队、出队,并探讨了链表在实现队列时的效率和优势。
/*用单链表实现队列的链式存储*/ 
/*
   fron指向单链表的头结点,rear指向单链表的尾结点
   因为单链表的头结点做插入,删除都比较方便,但是尾结点做插入方便,删除不方便
   故我们让front指向头结点利于做删除操作,让rear指向尾结点利于做插入操作 
*/

#include <stdio.h>
#include <malloc.h> 
#define ElementType int
#define ERROR -1
struct Node{ /*单链表的节点结构*/
    ElementType Data;
    struct Node *Next;
};
typedef struct Node *node;



struct QNode{  /*链队列结构*/ 
    struct Node *rear;  /*指向队尾结点*/ 
    struct Node *front; /*指向队头结点*/ 
};
typedef struct QNode *Queue;
Queue PtrQ; 

/*初始化链队*/
void initQueue(Queue PtrQ)
{
   PtrQ->front=PtrQ->rear=NULL;        /*把队首和队尾指针置空*/
}

ElementType DeleteQ(Queue PtrQ)
{
    struct Node *FrontCell;
    ElementType FrontElem;
    if(PtrQ->front=NULL){
        printf("Queue is empty.");
        return ERROR;
    }
    FrontCell=PtrQ->front;
    if(PtrQ->front==PtrQ->rear) /*如果队列只有一个元素*/
     PtrQ->front=PtrQ->rear=NULL; /*删除后队列置为空*/ 
    else
     PtrQ->front=PtrQ->front->Next;
     FrontElem=FrontCell->Data;
     free(FrontCell);  /*释放被删除的结点空间*/ 
     return FrontElem; 
}

void AddQ(ElementType item,Queue PtrQ)
{
    node newNode;
    newNode=(node)malloc(sizeof(struct Node));
    if(newNode==NULL)
    {
        printf("内存空间分配失败!");        
    }
    newNode->Data=item;
    newNode->Next=NULL;
    /*若链队为空,则新结点既是队首结点又是队尾结点*/
    if(PtrQ->rear==NULL){
        PtrQ->front=PtrQ->rear=newNode; 
    }else{
        /*若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点*/
        PtrQ->rear->Next=newNode; 
        PtrQ->rear=newNode; 
    }
    return;
}

/*读取队首元素*/
int peekQueue(Queue PtrQ)
{   /*若链队为空则停止运行*/
    if(PtrQ->front==NULL)
    {
       printf("队列为空,无法删除! ");
       return ERROR;
    }
    return PtrQ->front->Data;      /*返回队首元素*/
}

/*检查链队是否为空,若为空则返回1,否则返回0*/
int emptyQueue(Queue PtrQ)
{
   /*判断队首或队尾任一个指针是否为空即可*/
   if(PtrQ->front==NULL)
   {
      return 1;
   }else
   {
      return 0;
   }
}

/*清除链队中的所有元素*/
void clearQueue(Queue PtrQ)
{
   struct Node *p=PtrQ->front;    /*队首指针赋给p*/
   /*依次删除队列中的每一个结点,最后使队首指针为空*/
   while(p!=NULL)
   {
       PtrQ->front=PtrQ->front->Next;
       free(p);
       p=PtrQ->front;
   }
   /*循环结束后队首指针已经为空*/
   PtrQ->rear=NULL;    /*置队尾指针为空*/
   return;
}

int main(int argc,char *argv[])
{
    Queue MyQueue;
    int a[8]={3,8,5,17,9,30,15,22};
    int i;
    initQueue(MyQueue);
    for(i=0;i<8;i++)
    {
       AddQ(a[i],MyQueue);
    }
    printf("delnode is %d\n",DeleteQ(MyQueue));
    printf("delnode is %d\n",DeleteQ(MyQueue));
    AddQ(68,MyQueue);
    printf("peeknode is %d\n",peekQueue(MyQueue));
    while(!emptyQueue(MyQueue))
    {
        printf("%d\n",DeleteQ(MyQueue));
    }
    clearQueue(MyQueue);
    return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值