美文网首页
C 链表实现队列

C 链表实现队列

作者: Void_Caller | 来源:发表于2019-07-28 00:29 被阅读0次

前言

第一次学数据结构,代码写的可能不是很好,大神勿喷,指出来就行。

读本文之前建议先学下链表

本文会和《C 链表实现队列》很相似,因为本身队列就是栈的链节点反一下而已。

队列

队列(queue)和栈是兄弟,也是很基本的数据结构。
队列,顾名思义,就是一条队伍,从尾巴进,头出,就好像水管一端进一端出。

下表便是一个简单的队列:

队尾元素 n
元素 n-1
元素 n-2
……
元素 2
元素 1
队首元素 0

操作

函数 操作
push() 向队尾添加元素
pop() 移除队首的元素
front() 读取队首的元素(是最早加进去的元素)
back() 读取队尾的元素(也就是刚加进去的元素)
size() 队列元素的数量
empty() 看队列是否为空
pop和push操作图解

实现

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

// 每个节点
struct Node
{
    int data; // 数据
    struct Node *pNext; // 下一个数据的指针
};

// 队列结构体
struct Queue
{
    struct Node *pNode; // 当前元素的指针
    struct Node *pRoot; // 队列底部的元素指针
    int size; // 数量
};

// Operations

// 读取队列首部的元素
int front(struct Queue q)
{
    return (q.pRoot) -> data;
}

// 读取队列尾部的元素
int back(struct Queue q)
{
    return (q.pNode) -> data;
}

// 向队列尾部加入新的元素
int push(int data,struct Queue *q)
{
    struct Node *n = (struct Node*) malloc(sizeof(struct Node)); // 创建新的内存空间以便存放链表的元素
    n -> data = data; // 塞入数据
    n -> pNext = NULL; // 由于是从队尾元素的,所以队尾是没有元素的,指针为空
    if (q -> pNode != NULL) (q -> pNode) -> pNext = n; // 如果队列不为空,那就把前一个元素链上新的元素
    q -> pNode = n; // 把当前元素改为新的元素
    if (q -> pRoot == NULL) q -> pRoot = q -> pNode; // 如果队列是空的,那么首部元素和尾部元素是相同的
    (q -> size) ++; // 元素数量+1
    return data;
}

// 删除队列首部的元素
void pop(struct Queue *q)
{
    struct Node *root = q -> pRoot; // 获得首部节点
    if (root -> pNext != NULL) q -> pRoot = root -> pNext; // 如果首部元素的后面不为空,就是是说首部元素没有成为尾部元素时,那就把首部元素改为上一个
    free(root); // 释放移除元素的内存空间
    (q -> size) --; // 元素数量-1
}

// 看队列是否为空
int empty(struct Queue q)
{
    return q.size == 0;
}

// 测试
int main()
{
    struct Queue mQueue = {NULL, NULL, 0}; // 初始化一个队列
    printf("pushed + %d! size = %d\n", push(10, &mQueue), mQueue.size); // 给队列尾部压入新的元素10
    printf("pushed + %d! size = %d\n", push(3,&mQueue), mQueue.size); // 给队列尾部压入新的元素3
    printf("pushed + %d! size = %d\n\n", push(8,&mQueue), mQueue.size); // 给队列尾部压入新的元素8
    printf("front = %d back = %d\n", front(mQueue), back(mQueue)); // 输出此时队列首和尾部的元素
    pop(&mQueue); // 移除队列首部的元素
    printf("poped! size = %d\n", mQueue.size); // 输出元素个数
    printf("front = %d back = %d\n", front(mQueue), back(mQueue)); // 输出此时队列首和尾部的元素
    printf("pushed + %d! size = %d\n", push(9,&mQueue), mQueue.size); // 给队列尾部压入新的元素9
    printf("front = %d back = %d\n", front(mQueue), back(mQueue)); // 输出此时队列首和尾部的元素
    pop(&mQueue); // 移除队列首部的元素
    printf("poped! size = %d\n", mQueue.size); // 输出元素个数
    pop(&mQueue); // 移除队列首部的元素
    printf("poped! size = %d\n", mQueue.size); // 输出元素个数
    pop(&mQueue); // 移除队列首部的元素
    printf("poped! size = %d\n", mQueue.size); // 输出元素个数
    printf("isEmpty = %d\n", empty(mQueue));
    return 0;
}

相关文章

  • c++ 实现队列

    相关资料: 用C++实现一个队列 数据结构代码实现之队列的链表实现(C/C++)

  • C 链表实现队列

    前言 第一次学数据结构,代码写的可能不是很好,大神勿喷,指出来就行。 读本文之前建议先学下链表 C 实现链表 (如...

  • 0225. Implement Stack using Queu

    *LeetCode 225. Implement Stack using Queues用队列来实现链表,对于C语...

  • 数据结构java描述

    接口 栈 队列 集合 并查集 映射 数组 链表 栈 数组实现 链表实现 队列 数组实现 链表实现 二分搜索树 集合...

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • (二) python实现数据结构之队列(queue)篇

    一.队列类型介绍 python代码实现 (1).数组的方式实现队列 (2).链表的方式实现队列

  • 有关“队列”的总结

    队列 定义 分类 链式队列 (用链表实现) 静态队列 (用数组实现)图静态队列通常都必须是循环队列循环队列的讲解:...

  • 基础算法学习与实践

    数组&链表 1. 快慢指针的方式实现判断链表是否有环 栈和队列 1. 栈实现队列(负负得正) ...

  • 用数组实现栈、队列

    用数组实现一个栈 用数组实现一个队列 用单链表实现给队列

网友评论

      本文标题:C 链表实现队列

      本文链接:https://www.haomeiwen.com/subject/bhnyrctx.html