链表队列

  接下来把链表队列的代码分享给大家。因为还是链表操作,不做其他介绍。

lqueue.h

#ifndef _QUEUE_H
#define _QUEUE_H

#define MAXSIZE 10

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

typedef struct queue
{
    Node * front;
    Node * rear;
    int size;
} Queue;

void q_init(Queue * queue);//初始化
void q_push(Queue * queue, const int data);//入队
void q_pop(Queue * queue);//出队
bool q_empty(Queue * queue);//为空
bool q_full(Queue * queue);//为满
int q_size(Queue * queue);//队大小
int q_front(Queue * queue);//对头元素
int q_back(Queue * queue);//队尾元素
void q_destroy(Queue * queue);//销毁

#endif //_QUEUE_h

lqueue.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <limits.h>

#include "lqueue.h"

static Node* make_node(const int data);//创建节点
static void destroy_node(Node * current);//销毁链表

void q_init(Queue * queue)
{
    queue->front = queue->rear = make_node(INT_MIN);//创建一个带头节点的队列,front队头指针,rear队尾指针
    queue->size = 0;
}

void q_push(Queue * queue, const int data)
{
    Node * node;
    if ( q_full(queue) )
        return;
    node = make_node(data);

    queue->rear->next = node;//将队尾节点的next指针指向新节点
    queue->rear = node;//队尾指针后移

    queue->size++;
}

void q_pop(Queue * queue)
{
    Node * current;
    if ( q_empty(queue) )
        return;

    current = queue->front->next;//保存出队节点,以便释放内存
    queue->front->next = current->next;//将队头指针后移

    queue->size--;
    destroy_node(current);
}

bool q_empty(Queue * queue)
{
    return queue->size == 0;//队中元素个数为0,队列为空,但右一个节点
}

bool q_full(Queue * queue)
{
    return queue->size == MAXSIZE;
}

int q_size(Queue * queue)
{
    return queue->size;
}

int q_front(Queue * queue)
{
    assert( !q_empty(queue) );
    return queue->front->next->data;
}

int q_back(Queue * queue)
{
    assert( !q_empty(queue) );
    return queue->rear->data;
}

void q_destroy(Queue * queue)
{
    Node * current = queue->front;//遍历队列,释放内存
    while (current != NULL)
    {
        destroy_node(current);
        current = current->next;
    }
}

static Node* make_node(const int data)
{
    Node * node = (Node *)malloc( sizeof(Node) );
    assert( node != NULL );
    node->data = data;
    node->next = NULL;
}

static void destroy_node(Node * current)
{
    assert(current != NULL);
    free(current);
}
时间: 2024-10-21 23:19:29

链表队列的相关文章

【C/C++学院】0802-链式栈/链表队列以及优先队列/封装链表库

链式栈 // stacklinknode.h #define datatype int struct stacknode { int num;//编号 datatype data;//数据 struct stacknode *pNext;//指针域 }; typedef struct stacknode StackNode;//简化 StackNode * init(StackNode * phead);//初始化 StackNode * push(StackNode * phead, int

数组队列 与 链表队列

做了些实验,感觉 用链表实现队列 比 用数组实现队列 性能好 进出队的每秒操作数比较 数组队列 enqueue 37,037 dequeue 4,166,666 链表队列 enqueue 277,778 dequeue 666,667 先入队n次,再出队n次的运行时间比较,单位是秒 出入队次数 | 数组队列运行时间 | 链表队列运行时间 1,000 0.01 0.01 10,000 0.04 0.04 100,000 2.7 0.4 1,000,000 4 最后一组,数组队列的半天没运行出来 下

C语言实现链表队列(基本操作及图示)

-------------------------------------------- 基本概念: 和栈相反,队列是一种先进先出(FIFO)的线性表.只允许在一端插入,在另一端删除. 允许插入的叫"队尾"(rear),允许删除的叫"队头"(front). 使用场景:操作系统的作业排队.在允许多道程序运行的计算机系统中,同时有几个作业运行.如果运行结果都需要通道输出,则按照请求输出的先后次序排队.每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中退出作输出

链表队列的实现

队列也是数据结构中比较重要的一种,和栈相反的是,队列是先进先出的,先进队列的可以先出队,跟平时我们排队是一样的.在允许多通道程序运行的计算机系统中,同时几个作业运行.凡是申请输出的作业都从队尾进入队列. 现在用链表实现队列,先定义一个链表结点: typedef struct QNode { int data; QNode *next; }QNode,*QueuePtr; 给队列定义一个头结点结构体,结构体中包含着两个链表结点指针,第一个指针指向对象的头结点,第二个指针指向对象的尾结点: type

5、链表队列(java实现)

1.图例 2.链表节点 public class Node<T> { public T data; public Node next; } 3.具体实现 public class LinkQueue<T> { private static Node head; private static Node tail; private static int size; /** * 初始化 */ public void initQueue() { Node node = new Node()

Java算法入门-数组&amp;链表&amp;队列

算法就是解决问题的步骤,在一般的项目中可能用不上,但是一旦涉及到高并发,高性能时,就不得不考虑算法的优劣. 设计原则和特性 设计原则:正确性,可读性,健壮性,高效率和低存储 特性:有穷性,确定性,可行性,有输入,有输出. 算法题入门体验 如何判断是一个数是2的整数次幂?常规方法使用循环,但是在学习了二进制的基础知识后,发现可以使用模运算来实现. 1 import java.util.Scanner; 2 3 public class base { 4 5 public static void m

数据结构 链表队列

1 #include"stdio.h" 2 #include"stdlib.h" 3 typedef int DataType; 4 typedef struct Seq 5 { 6 DataType data;//数据存储 7 struct Seq *next;//指向下一个节点的指针 8 }SeqList; 9 typedef struct 10 { 11 SeqList *front,*rear;//定义头尾指针 12 }Link; 13 void initQ

不定长链表队列C语言实现

#ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { False = 0, True,}Bool; typedef int ElemType; #define QUEUE_MAX_SIZE 10 #define STACK_INIT_SIZE 10#define STACK_INCREMENT_SIZE 2 #define Null ((void *)0) ty

图的遍历(邻居(链表+队列)实例

1.#include <stdio.h>#include <stdlib.h>#include "LGraph.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void print_data(LVertex* v){    printf("%s", (char*)v