队列数据结构在计算机操作系统中较为常见。在多用户、多任务的环境中,多个用户或任务可能同时请求同一资源,队列的特性可以很好的反应出来。例如,打印由队列控制,一次只能打印一个文档。 队列用来保存待打印的作业,打印机一次处理一个作业。通信软件也会使用队列来保存通过网络和拨号连接方式接收到的信息。 有时,信息传输到系统的速度比它能处理的要快,因此在收到信息时会先将其放入队列中,按先进先出(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