【数据结构】队列的链式存储结构

⭐️写在前面的话⭐️

📒博客主页: 程序员好冰
🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】
📌本文由 程序员好冰 原创,CSDN 首发!
📆入站时间: 🌴2022 年 07 月 13 日🌴
✉️ 是非不入松风耳,花落花开只读书。
💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》
💬参考在线编程网站:🌐牛客网🌐力扣
🍭 作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!🍭


队列的链式存储结构

0、自定义声明

需要定义两个结构体

一个表示单个结点的结构,数据和下一个结点的地址

另一个表示整个队列,队头和队尾结点

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

//链队的实现
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;

typedef struct LinkQueue
{
    LNode *front;//front是头结点,不存放元素
    LNode *rear;
}LinkQueue;

1、初始化链队

初始链队,队头和队尾均指向头结点

并置 L->front->next=NULL;

Status InitQueue(LinkQueue *L)
{
    L->front=(LNode*)malloc(sizeof(LNode));
    L->rear=L->front;
    if(!L->front){
        printf("初始化失败.\n");
        return ERROR;
    }
    L->front->next=NULL;
    printf("初始化队列成功.\n");
    return OK;
}

2、判断队列是否为空

front和rear指向同一个位置,又因为front不存放元素,说明队列为空

Status QueueEmpty(LinkQueue L)
{
    if(L.front==L.rear){
        printf("队列为空.\n");
        return OK;
    }
    printf("队列不为空.\n");
    return ERROR;
}

3、队列的长度

从队头遍历到队尾

Status QueueLength(LinkQueue L)
{
    int i=0;
    LNode *p;
    p=L.front;
    while(L.rear!=p){
        i++;
        p=p->next;
    }
    printf("队列的长度为%d.\n",i);
    return OK;
}

4、清空队列

清空队列可以分为两步:

将遍历队列中的每个元素,并释放

将队头和队尾结点初始化

Status ClearQueue(LinkQueue *L)
{
    LNode *temp;
    while(!L->front->next){
        temp=L->front->next;
        L->front->next=temp->next;
        free(temp);
    }
    L->rear=L->front;
    L->front->next=NULL;
    printf("队列清空成功.\n");
    return OK;
}

5、入队

从队尾插入元素

Status EnQueue(LinkQueue *L,ElemType e)
{
    LNode *s=(LNode*)malloc(sizeof(LNode));
    if(!s){
        printf("初始化结点失败.\n");
        return ERROR;
    }
    s->data=e;
    L->rear->next=s;
    s->next=NULL;
    L->rear=s;
    printf("元素%d入队成功.\n",e);
    return OK;
}

7、销毁队列

先清空,再释放。

Status DestroyQueue(LinkQueue *L)
{
    ClearQueue(L);
    free(L);
    return OK;
}

8、获取队头元素

Status GetHead(LinkQueue L)
{
    if(QueueEmpty(L)){
        return ERROR;
    }
    printf("队头元素为:%d.\n",L.front->next->data);
    return OK;
}

9、出队

从队头删除元素

ElemType DeQueue(LinkQueue *L)
{
    if(QueueEmpty(*L)){
        return ERROR;
    }
    printf("队头元素%d出队成功.\n",L->front->next->data);
    LNode *p;
    p=L->front->next;
    L->front->next=p->next;
    //处理最后一个元素出队的情况
    if(L->rear==p){
       L->rear=L->front;
    }
    free(p);
    return OK;
}

10、打印队列中所有元素

//队列先进先出,先打印队头元素
Status PrintfQueue(LinkQueue L)
{
    if(QueueEmpty(L)){
        return ERROR;
    }
    printf("队列为:");
    LNode *p;
    p=L.front->next;
    while(p){
        printf("%d  ",p->data);
        p=p->next;
    }
    return OK;
}

主函数

int main()
{
    LinkQueue L;
    int input;
    int value;
    printf("请继续操作...\n");
    while(1){
        printf("\n==========================\n");
        printf("1、初始化循环队列.\n");
        printf("2、销毁队列.\n");
        printf("3、清空队列.\n");
        printf("4、判断队列是否为空.\n");
        printf("5、获得队头元素.\n");
        printf("6、插入队尾元素.\n");
        printf("7、删除队头元素.\n");
        printf("8、返回队列中元素个数.\n");
        printf("9、打印队列中所有元素.\n");
        printf("\n==========================\n");
        printf("请输入对应操作的序号:");
        scanf("%d",&input);
        switch(input){
        case 1:
            InitQueue(&L);
            break;
        case 2:
            DestroyQueue(&L);
            break;
        case 3:
            ClearQueue(&L);
            break;
        case 4:
            QueueEmpty(L);
            break;
        case 5:
            GetHead(L);
            break;
            break;
        case 6:
            printf("请输入需要入队的元素:");
            scanf("%d",&value);
            EnQueue(&L,value);
            break;
        case 7:
            DeQueue(&L);
            break;
        case 8:
            QueueLength(L);
            break;
        case 9:
            PrintfQueue(L);
            break;
        default:
            printf("输入的序号有误,请重新输入.\n");
            break;
        }
    }
    return 0;
}

程序源码

运行效果

image-20230407004526791
#include <stdio.h>
#include <stdlib.h>

//链队的实现
#define OK 1
#define ERROR 0

typedef int ElemType;
typedef int Status;

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode;

typedef struct LinkQueue
{
    LNode *front;//front是头结点,不存放元素
    LNode *rear;
}LinkQueue;

//函数声明
Status InitQueue(LinkQueue *L)
{
    L->front=(LNode*)malloc(sizeof(LNode));
    L->rear=L->front;
    if(!L->front){
        printf("初始化失败.\n");
        return ERROR;
    }
    L->front->next=NULL;
    printf("初始化队列成功.\n");
    return OK;
}

Status QueueEmpty(LinkQueue L)
{
    if(L.front==L.rear){
        printf("队列为空.\n");
        return OK;
    }
    printf("队列不为空.\n");
    return ERROR;
}

Status QueueLength(LinkQueue L)
{
    int i=0;
    LNode *p;
    p=L.front;
    while(L.rear!=p){
        i++;
        p=p->next;
    }
    printf("队列的长度为%d.\n",i);
    return OK;
}

Status ClearQueue(LinkQueue *L)
{
    LNode *temp;
    while(!L->front->next){
        temp=L->front->next;
        L->front->next=temp->next;
        free(temp);
    }
    L->rear=L->front;
    L->front->next=NULL;
    printf("队列清空成功.\n");
    return OK;
}

Status EnQueue(LinkQueue *L,ElemType e)
{
    LNode *s=(LNode*)malloc(sizeof(LNode));
    if(!s){
        printf("初始化结点失败.\n");
        return ERROR;
    }
    s->data=e;
    L->rear->next=s;
    s->next=NULL;
    L->rear=s;
    printf("元素%d入队成功.\n",e);
    return OK;
}

Status DestroyQueue(LinkQueue *L)
{
    ClearQueue(L);
    free(L);
    return OK;
}

Status GetHead(LinkQueue L)
{
    if(QueueEmpty(L)){
        return ERROR;
    }
    printf("队头元素为:%d.\n",L.front->next->data);
    return OK;
}

ElemType DeQueue(LinkQueue *L)
{
    if(QueueEmpty(*L)){
        return ERROR;
    }
    printf("队头元素%d出队成功.\n",L->front->next->data);
    LNode *p;
    p=L->front->next;
    L->front->next=p->next;
    //处理最后一个元素出队的情况
    if(L->rear==p){
       L->rear=L->front;
    }
    free(p);
    return OK;
}

//队列先进先出,先打印队头元素
Status PrintfQueue(LinkQueue L)
{
    if(QueueEmpty(L)){
        return ERROR;
    }
    printf("队列为:");
    LNode *p;
    p=L.front->next;
    while(p){
        printf("%d  ",p->data);
        p=p->next;
    }
    return OK;
}

int main()
{
    LinkQueue L;
    int input;
    int value;
    printf("请继续操作...\n");
    while(1){
        printf("\n==========================\n");
        printf("1、初始化循环队列.\n");
        printf("2、销毁队列.\n");
        printf("3、清空队列.\n");
        printf("4、判断队列是否为空.\n");
        printf("5、获得队头元素.\n");
        printf("6、插入队尾元素.\n");
        printf("7、删除队头元素.\n");
        printf("8、返回队列中元素个数.\n");
        printf("9、打印队列中所有元素.\n");
        printf("\n==========================\n");
        printf("请输入对应操作的序号:");
        scanf("%d",&input);
        switch(input){
        case 1:
            InitQueue(&L);
            break;
        case 2:
            DestroyQueue(&L);
            break;
        case 3:
            ClearQueue(&L);
            break;
        case 4:
            QueueEmpty(L);
            break;
        case 5:
            GetHead(L);
            break;
            break;
        case 6:
            printf("请输入需要入队的元素:");
            scanf("%d",&value);
            EnQueue(&L,value);
            break;
        case 7:
            DeQueue(&L);
            break;
        case 8:
            QueueLength(L);
            break;
        case 9:
            PrintfQueue(L);
            break;
        default:
            printf("输入的序号有误,请重新输入.\n");
            break;
        }
    }
    return 0;
}

🚀先看后赞,养成习惯!🚀

🚀 先看后赞,养成习惯!🚀

🎈觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!🎈


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值