考研一轮队列链式存储完全实现含测试效果(王卓版)

本文详细介绍了如何使用链式结构实现队列,包括初始化、入队、出队、判断空队、获取队头元素和销毁队列的过程。适合数据结构复习,提供C语言代码示例。

本博文源于数据结构一轮复习基础,主要是对王卓老师的数据结构进行测试实现,如果有需要的读者可以收藏,谢谢。

1、队列链式存储结构定义

两个结构体,一个结构体data,next,另外一个结构体的类型rear和front。

typedef struct QNode{
    QElemType  data;
    struct QNode *next;
}QNode,*QuenePtr;

//队头指针指向链表的头部
//队尾指针指向队列的尾部
typedef struct{
    QuenePtr front;//队头指针
    QuenePtr  rear;//队尾指针
}LinkQueue;

2、初始化链式队列

步骤如下:

  • 创建结点,并判断是否成功
  • front与rear同时指向他,
  • 头指针下一条指向NULL
  • 返回OK
 Status InitQueue(LinkQueue &Q){
    Q.front = Q.rear = new QNode;
   // Q.front = Q.rear = (QuenePtr) malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}

3、入队

跟单链表一样,创建一个结点,data,next赋值好,然后让rear的next指向新创建的节点,新创建结点指向rear

 Status EnQueue(LinkQueue &Q,QElemType e){
     QNode *p = new QNode;
     if(!p)exit(OVERFLOW);
     p->next = NULL;
     p->data = e;
     Q.rear->next = p;
     Q.rear = p;
     return OK;
 }

4、出队

出队的话主要是队头出队,因此改一下front的下一条地址就行,如果直接是尾巴元素,记得让front指向rear

 Status DeQueue(LinkQueue &Q,QElemType &e){
     if(IsEmpty(Q)) return ERROR;
     QNode* p = Q.front->next;
     e = p->data;
     Q.front->next = p->next;
     if(Q.rear==p) Q.rear = Q.front;//删除恰好是尾结点
     free(p);

     return OK;
 }

5、队列是否为空

直接判断rear和front同时指向

Status IsEmpty(LinkQueue Q){
     if(Q.front==Q.rear) return TRUE;
     else return FALSE;
 }

6、获取队列头元素

队头元素,先判定队列是否为空,然后获取front的值

 Status GetHead(LinkQueue Q,QElemType &e){
     if(IsEmpty(Q)) return ERROR;
     e = Q.front->next->data;
 }

7、销毁队列

销毁队列从头销毁,跟单链表一样,

Status DestroyQueue(LinkQueue &Q){
     while(Q.front){
         QNode* p = Q.front->next;
         free(Q.front);
         Q.front = p;
     }
     return OK;
 }

测试效果

在这里插入图片描述

完整代码

#include<iostream>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAXQSIZE 10
using namespace std;
typedef int Status;
typedef int QElemType;

typedef struct QNode{
    QElemType  data;
    struct QNode *next;
}QNode,*QuenePtr;

//队头指针指向链表的头部
//队尾指针指向队列的尾部
typedef struct{
    QuenePtr front;//队头指针
    QuenePtr  rear;//队尾指针
}LinkQueue;

//链式队列初始化
 Status InitQueue(LinkQueue &Q){
    Q.front = Q.rear = new QNode;
   // Q.front = Q.rear = (QuenePtr) malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}
Status IsEmpty(LinkQueue Q){
     if(Q.front==Q.rear) return TRUE;
     else return FALSE;
 }
//销毁链式队列
Status DestroyQueue(LinkQueue &Q){
     while(Q.front){
         QNode* p = Q.front->next;
         free(Q.front);
         Q.front = p;
     }
     return OK;
 }

 //链队列入队
 Status EnQueue(LinkQueue &Q,QElemType e){
     QNode *p = new QNode;
     if(!p)exit(OVERFLOW);
     p->next = NULL;
     p->data = e;
     Q.rear->next = p;
     Q.rear = p;
     return OK;
 }
 //队列出队
 Status DeQueue(LinkQueue &Q,QElemType &e){
     if(IsEmpty(Q)) return ERROR;
     QNode* 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 GetHead(LinkQueue Q,QElemType &e){
     if(IsEmpty(Q)) return ERROR;
     e = Q.front->next->data;
 }



int main(){
    LinkQueue Q;
    InitQueue(Q);
    cout << "after init,Is  Queue empty? 1 represent yes:" << IsEmpty(Q) << endl;
    for(int i=0;i<5;i++){
        EnQueue(Q,i+1);
    }
    QElemType  e;
    GetHead(Q,e);
    cout << "get queue head value: " << e << endl;
    DeQueue(Q,e);
    cout << "delete 1 queue value: " << e << endl;
    DestroyQueue(Q);
    bool flag = false;
    if(!Q.front){
        flag = true;
    }
    cout << "destroy Q,if Q.front is NULL:1 NULL 0 not NULL: " << flag << endl;
    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值