队列(链表实现)概念及相关函数

原创 2018年04月16日 22:18:01

一. 链表队列

特殊的单链表,只在单链表上进行头删尾插的操作

二. 相关函数

对于队列具体概念不太清楚的同学可以参考

顺序表实现的数据结构队列
由顺序表实现的队列程序结构相对来说比较简单,可以巩固一下基础

链表定义的队列结构

#define Datatype char   // 队列存储数据的类型

// 队列的节点
typedef struct LinkNode {
    Datatype data;
    struct LinkNode* next;
}LinkNode;

// 队首队尾指针
typedef struct LinkQueue {
    LinkNode* head;
    LinkNode* tail;
}LinkQueue;

LinkQueue.h

#pragma once
// 链表实现的队列,后进先出
#include <stdlib.h>
#include <errno.h>
#include <stddef.h>

#define Datatype char


typedef struct LinkNode {
    Datatype data;
    struct LinkNode* next;
}LinkNode;

typedef struct LinkQueue {
    LinkNode* head;
    LinkNode* tail;
}LinkQueue;

// 初始化队列
void LinkQueueInit(LinkQueue* queue);

// 销毁队列
void LinkQueueDestroy(LinkQueue* queue);

// 入队列,尾插
int LinkQueuePush(LinkQueue* queue, Datatype value);

// 出队列,头删
int LinkQueuePop(LinkQueue* queue);

// 取队首元素
int LinkQueueTop(LinkQueue* queue, Datatype* value);

LinkQueue.c

#include "LinkQueue.h"

// 创建节点
LinkNode* Creat(Datatype value) {
    LinkNode* node = malloc(sizeof(LinkNode));
    node->data = value;
    node->next = NULL;
    return node;
}
// 销毁节点
void Destroy(LinkNode* node) {
    // 非法输入
    if(node == NULL) {
        perror("Creat");
        return;
    }
    free(node);
}

// 初始化队列
void LinkQueueInit(LinkQueue* queue) {
    // 非法输入
    if(queue == NULL) {
        perror("Init");
        return;
    }
    queue->head = NULL;
    queue->tail = NULL;
}

// 销毁队列
void LinkQueueDestroy(LinkQueue* queue) {
    // 非法输入
    if(queue == NULL) {
        perror("Destroy");
        return;
    }
    // 销毁创建的链表节点
    LinkNode* cur = queue->head;
    while(cur != NULL) {
        LinkNode* tmp = cur;
        cur = cur->next;
        Destroy(tmp);
    }

    // 销毁链表
    queue->head = NULL;
    queue->tail = NULL;
}

// 入队列,尾插
int LinkQueuePush(LinkQueue* queue, Datatype value) {
    // 非法输入
    if(queue == NULL) {
        perror("Push");
        return;
    }
    // 空链表
    if(queue->head == NULL) {
        queue->head = queue->tail = Creat(value);
        return 1;
    }
    // 创建新节点
    LinkNode* new_node = Creat(value);
    queue->tail->next = new_node;
    queue->tail = new_node;
    return 1;
}

// 出队列,头删
// LinkQueue->node == NULL 代表空链表
int LinkQueuePop(LinkQueue* queue) {
    // 非法输入
    if(queue == NULL) {
        perror("Pop");
        return 0;
    }
    // 空链表
    if(queue->head == NULL) {
        return 0;
    }
    // 一个节点
    if(queue->head == queue->tail) {
        // 销毁节点
        Destroy(queue->head);
        queue->head = queue->tail = NULL;
        return 1;
    }
    LinkNode* tmp = queue->head;
    queue->head = queue->head->next;
    Destroy(tmp);
}

// 取队首元素
int LinkQueueTop(LinkQueue* queue, Datatype* value) {
    // 非法输入
    if(queue == NULL) {
        perror("Top");
        return 0;
    }
    // 空队列
    if(queue->head == NULL) {
        return 0;
    }
    *value = queue->tail->data;
    return 1;

}



/* ***************************************************
   *********************  test  **********************
 * ***************************************************/
#if 1
#include <stdio.h>

#define FUNCTION() printf("\n================ %s ===============\n", __FUNCTION__)


// 队列打印
void print(LinkQueue queue, const char* msg) {
    printf("%s\n", msg);

    // 非法输入
    if(queue.head == NULL) {
        perror("printf");
        return;
    }

    LinkNode* cur = queue.head;
    while(cur != queue.tail) {
        printf("%c\n", cur->data);
        cur = cur->next;
    }
    printf("%c\n", cur->data);
}


// 入队列测试
void TestPush() {
    FUNCTION();
    LinkQueue queue;
    LinkQueueInit(&queue);

    LinkQueuePush(&queue, 'a');
    LinkQueuePush(&queue, 'b');
    LinkQueuePush(&queue, 'c');
    LinkQueuePush(&queue, 'd');
    print(queue, "入队列");
}

// 出队列测试
void TestPop() {
    FUNCTION();
    LinkQueue queue;
    LinkQueueInit(&queue);

    LinkQueuePush(&queue, 'a');
    LinkQueuePush(&queue, 'b');
    LinkQueuePush(&queue, 'c');
    LinkQueuePush(&queue, 'd');
    print(queue, "入队列");

    LinkQueuePop(&queue);
    print(queue, "出队列一个");
    LinkQueuePop(&queue);
    print(queue, "出队列两个");
    LinkQueuePop(&queue);
    print(queue, "出队列三个");
    LinkQueuePop(&queue);
    print(queue, "出队列四个");
    LinkQueuePop(&queue);
    print(queue, "空队列队列");
}

// 获取队首元素测试
void TestTop() {
    FUNCTION();
    LinkQueue queue;
    LinkQueueInit(&queue);

    LinkQueuePush(&queue, 'a');
    LinkQueuePush(&queue, 'b');
    LinkQueuePush(&queue, 'c');
    print(queue, "入队列");

    Datatype value;
    int ret = LinkQueueTop(&queue, &value);
    printf("ret is %d, top is %c\n", ret, value);
    ret = 0;

    // 获取已销毁队列队首元素
    LinkQueueDestroy(&queue);
    ret = LinkQueueTop(&queue, &value);
    printf("ret is %d, top is %c\n", ret, value);

}


int main() {
    TestPush();
    TestPop();
    TestTop();

    return 0;
}
#endif
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40739833/article/details/79967610

计算机系统:核心概念及软硬件实现 PDF

  • 2016年04月06日 14:35
  • 22.04MB
  • 下载

c++内存模型------计算机系统核心概念及软硬件实现

c++编程语言有3中不同类项的变量:全局变量、局部变量和动态分配变量。变量的值存储在计算机的内存中,但是变量存储的方式取决于变量的类项。3种类型的变量分别对应存储器中3个特定的区域: 全局变量存...
  • li_haoren
  • li_haoren
  • 2017-10-23 23:53:49
  • 78

java多线程(一):多线程的基本概念和使用

转载自:http://blog.csdn.net/lonelyroamer/article/details/7948329 一、进程和线程的基础知识 1、进程和线程的概念 进程:...
  • u012179540
  • u012179540
  • 2014-12-17 20:30:42
  • 234

CMMI的五个级别是什么?域是什么?

CMMI全称是Capability Maturity Model Integration,即软件能力成熟度模型集成模型。分为5个级别,25个过程域(Process Area,PA)。 1、初始级(I...
  • ibmfahsion
  • ibmfahsion
  • 2012-09-04 17:40:49
  • 446

【简记】Java Web 内幕——Servlet介绍,编程

本章内容:1. servlet概念及相关接口简介 2. servet 执行过程 3. servlet路径映射 4. 缺省servlet --应用 5. servlet生命周期(重点)...
  • qqqqq1993qqqqq
  • qqqqq1993qqqqq
  • 2017-07-15 15:49:44
  • 173

队列(顺序表实现)概念及相关函数

一. 队列概念 只允许在一端进行数据插入,在另一端进行数据删除操作的特殊线性表 队首:进行数据删除操作的一端 队尾:进行数据插入操作的一端 特性:先入先出(FOFI) 二. 顺序队列两种...
  • weixin_40739833
  • weixin_40739833
  • 2018-04-16 22:07:13
  • 29

CMMI四级过程域的相关概念及理解

  • 2008年09月13日 10:35
  • 62KB
  • 下载

关于“重定位”及其相关的几个概念

      重定位是多道程序设计中一个非常重要的概念,它是多道程序在内存中同时运行的基础。所谓重定位就是将逻辑地址空间变换(或称映射)为实际的物理地址空间,或者把某个相对地址变换(或映射)主存的绝对地...
  • collier
  • collier
  • 2010-08-26 21:13:00
  • 1228

白盒测试概念

白盒测试概述白盒测试:. 又称透明盒测试、逻辑驱动测试, . 是测试被测单元内部如何工作的一种测试方法, . 根据程序内部逻辑结构及有关信息来设计和选 择- 测试用例,对程序的逻辑结构进行测试...
  • wanglin_lin
  • wanglin_lin
  • 2015-09-16 09:23:19
  • 1214
收藏助手
不良信息举报
您举报文章:队列(链表实现)概念及相关函数
举报原因:
原因补充:

(最多只允许输入30个字)