数据结构 06 - 队列

这篇博客介绍了链式队列数据结构在计算机操作系统中的应用,如打印队列和通信软件信息处理。通过C语言实现了一个线性结构、链式存储的队列,包括创建、判空、入队和出队操作。程序演示了从9876543210顺序入队,然后按照先进先出原则出队的过程。
摘要由CSDN通过智能技术生成

  队列数据结构在计算机操作系统中较为常见。在多用户、多任务的环境中,多个用户或任务可能同时请求同一资源,队列的特性可以很好的反应出来。例如,打印由队列控制,一次只能打印一个文档。 队列用来保存待打印的作业,打印机一次处理一个作业。通信软件也会使用队列来保存通过网络和拨号连接方式接收到的信息。 有时,信息传输到系统的速度比它能处理的要快,因此在收到信息时会先将其放入队列中,按先进先出(FIFO)的原则进行处理。
运行结果:
  入队顺序 9 8 7 6 5 4 3 2 1 0,见main.c
在这里插入图片描述
  下面代码linkqueue.c含队列相关操作,main.c测试功能的实现与否。
  该程序采用线性结构,链式存储的方式实现,尾插法入队数据,从头出队数据,满足队列数据结构先进先出的原则。

//主要结点数据结构定义(已包含在linkqueue.h中)
typedef struct node{
    data_t data;
    struct node *next;
}Node;

typedef struct linkqueue{
    struct node *front; //用于指向链式队列的头结点
    struct node *rear;  //用于指向链式队列的尾结点
}Linkqueue;
/*
linkqueue.c
*/
#include "linkqueue.h"
//创建链表
Linkqueue *create_linkqueue()
{
    //头结点开辟空间
    Node *head = (Node *)malloc(sizeof(Node));
    if(NULL == head){//开辟空间失败
        printf("node malloc failed!\n");
        return NULL;
    }

    head->data = -1;
    head->next = NULL;
    
    //给链式队列(头尾)结点开辟空间
    Linkqueue *Q = (Linkqueue *)malloc(sizeof(Linkqueue));
    if(NULL == Q){
        printf("linkqueue malloc failed!\n");
        return NULL;
    }

    Q->front = head;
    Q->rear = head;

    return Q;
}

//判空
int linkqueue_is_empty(Linkqueue *queue)
{
    if(queue->front == queue->rear){//为空
        return 1;
    }
    else{
        return 0;
    }
}

//入队
void enlinkqueue(Linkqueue *queue,data_t data)
{
    Node *new = (Node *)malloc(sizeof(Node));
    new->data = data;

	//尾插
    new->next = queue->rear->next;
    queue->rear->next = new;

	//表尾指针指向表尾,即 新插入的结点
    queue->rear = new;
}

//出队
void delinkqueue(Linkqueue *queue,data_t *data)
{
    if(linkqueue_is_empty(queue)){//判空
        printf("linkqueue is empty!\n");
        return;
    }

    Node *p = queue->front->next;
    queue->front->next  = p->next;
    *data = p->data;

    if(p->next == NULL){
        queue->rear = queue->front;
    }
    free(p);
}
/*
main.c
*/
#include "linkqueue.h"

int main()
{
    Linkqueue *queue = create_linkqueue();
    int n = 10,data;
    while(n--){//入队顺序 9 8 7 6 5 4 3 2 1 0
        enlinkqueue(queue,n);
    }

	printf("出队顺序: ");
    while(queue->rear != queue->front){//非空 进行出队
        delinkqueue(queue,&data);//返回出队的数据保存在data中
        printf("%d ",data);
    }
    puts("");
    return 0;
}
/*
linkqueue.h
*/
#include <stdio.h>
#include <stdlib.h>

#ifndef __LINKQUEUE__
#define __LINKQUEUE__

typedef int data_t;
typedef struct node{
    data_t data;
    struct node *next;
}Node;

typedef struct linkqueue{
    struct node *front; //指向链式队列的头结点
    struct node *rear;  //指向链式队列的尾结点
}Linkqueue;

//创建链表
Linkqueue *create_linkqueue();

//判空
int linkqueue_is_empty(Linkqueue *queue);

//链尾入队
void enlinkqueue(Linkqueue *queue,data_t data);

//出队 从头
void delinkqueue(Linkqueue *queue,data_t *data);
#endif
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值