1、数据结构-链式队列的实现-C语言

typedef struct QNode
{
    int data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct
{
    QueuePtr _front;    //头指针
    QueuePtr _rear;     //尾指针
} LinkQueue;

//构造空队列---1
void InitQueue(LinkQueue* Q);
//队列的销毁---2
void DestroyQueue(LinkQueue* Q);
//队列的清空---3
void ClearQueue(LinkQueue* Q);
//判断队列是否为空---4
void QueueEmpty(LinkQueue Q);
//队列的长度---5
int QueueLength(LinkQueue Q);
//取队列头元素---6
void GetHead(LinkQueue Q);
//插入---7
void EnQueue(LinkQueue* Q, int value);
//删除---8
void DeQueue(LinkQueue* Q,int* value);
//依次访问队列元素---9
void QueueTraverse(LinkQueue Q);
void ShowHelp();

//-----------------------------------------------

void ShowHelp()
{
    printf("1---初始化链队列\n");
    printf("2---销毁链队列\n");
    printf("3---清空链队列\n");
    printf("4---判断链队列是否为空\n");
    printf("5---链队列长度\n");
    printf("6---链队列头元素\n");
    printf("7---插入\n");
    printf("8---删除\n");
    printf("9---依次访问链队列元素\n");
}

void InitQueue(LinkQueue* Q)
{
    QueuePtr p = (QueuePtr*) malloc(sizeof(QueuePtr));
    if(!p)
    {
        printf("分配失败.\n");
        return;
    }
    (*Q)._rear = p;
    (*Q)._front = p;

    (*Q)._front->next = NULL;
}

void DestroyQueue(LinkQueue* Q)
{
    QueuePtr p1 = (*Q)._front;
    QueuePtr p2;
    while(p1){
        p2 = p1->next;
        free(p1);
        p1 = p2;
    }

    (*Q)._rear = NULL;
    (*Q)._front = NULL;
}

void ClearQueue(LinkQueue* Q)
{
    QueuePtr p1 = (*Q)._front->next;
    QueuePtr p2;
    while(p1){
        p2 = p1->next;
        free(p1);
        p1 = p2;
    }
    (*Q)._front->next = NULL;
    (*Q)._rear = (*Q)._front;
}

void QueueEmpty(LinkQueue Q)
{
    if(Q._rear == Q._front)
        printf("此队列为空。\n");
    else
        printf("此队列不为空。\n");
}

int QueueLength(LinkQueue Q)
{
    QueuePtr p = Q._front->next;
    int num = 0;
    while(p){
        num++;
        p=p->next;
    }

    return num;
}

void GetHead(LinkQueue Q)
{
    if(Q._rear == Q._front)
    {
        printf("此队列为空。\n");
        return;
    }

    int value = Q._front->next->data;
    printf("此队列头元素为%d。\n",value);
}

void EnQueue(LinkQueue* Q, int value)
{
    QueuePtr p = (QueuePtr*) malloc(sizeof(QueuePtr));
    p->data = value;
    p->next = NULL;
    (*Q)._rear->next = p;
    (*Q)._rear = p;

    printf("插入成功\n");
}

void DeQueue(LinkQueue* Q,int* value)
{
    if((*Q)._rear == (*Q)._front)
    {
        printf("队列中无元素,不能再进行出队列操作.\n");
        return;
    }

    QueuePtr p = (*Q)._front->next;
    *value = p->data;
    (*Q)._front->next = p->next;
    free(p);
    printf("删除成功\n");
}

void QueueTraverse(LinkQueue Q)
{
    if(Q._rear == Q._front){
        printf("此队列为空。\n");
        return;
    }
    printf("从队列头到尾元素依次为:");

    QueuePtr p = Q._front->next;
    while(p){
        printf("%d  ",p->data);
        p = p->next;
    }
    printf("\n");
}

C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作的更多相关文章

  1. C语言实现链式队列

    链式队列,简称"链队列",即使用链表实现的队列存储结构. 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素, ...

  2. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  3. Javascript、C#、php、asp、python 等语言的链式操作的实现

    一.什么是链式操作 把需要的下一步操作的对象通过上一步操作返回回来.使完成某些功能具有持续性. 二.链式操作优点 代码更精简优雅.链式操作能大大精简代码量,多项操作一行代码一气呵成,搞定: 链式操作应 ...

  4. 分层、链式分析、url、联系的长度

    分层.链式分析.url.联系的长度. 分层结构符合软件处理的工具链性和步骤性: 分层的每一次都是一个节点或步骤: 链式结构普遍存在于自然界,比如食物链: 联系是普遍存在的,不只是两个事物间的联系,而且 ...

  5. 数据结构-链式队列-C++

    用链表搭建的栈与队列相对简单,队列的特点是先进先出,不啰嗦了,由于代码比较简单,相信光顾的人不会太多,下面直接贴代码. 头文件 #ifndef QUEUELI_H #define QUEUELI_H ...

  6. C语言 栈 链式结构 实现

    一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...

  7. C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

    /**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋 ...

  8. c数据结构链式存储-静态链表

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  9. C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作

    1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...

随机推荐

  1. swift一次 Attempt to present on whose view is not in the window hierarchy的解决方法

    做的是二维码扫描,扫描后识别为URL的话就跳转到webview 加载网页,用的是代理传值的方式.扫描到了 值传递到主页 扫描窗体退出,检测值是否是http://开头 是网页就跳转. 问题出在传值到主界 ...

  2. hadoop 小知识点

    ------------------------------------------- 配置hadoop的最小blocksize,必须是512的倍数. [hdfs-site.xml] dfs.name ...

  3. AMFObject 数据格式浅析

    amf.h中关于 AMFObject 是这样的定义的: typedef struct AMFObject { int o_num; struct AMFObjectProperty *o_props; ...

  4. 最长上升子序列(LIS)

    最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS.排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个序列d[1..9] = ...

  5. Vulkan Tutorial 03 理解Instance

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Creating an instance 与Vulkan打交道,通常的步骤是创建一个 ...

  6. Python名称空间和闭包

    一.名称空间 1.定义:又名 name space,顾名思义,就是存放名字的地方.比如:若变量x = 1,1存放在内存中, 而名称空间正是存放名字x与1绑定关系的地方. 2.分类: locals : ...

  7. 刷题向》DP》放苹果 (normal)

    这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚: 首先,放苹果是一道DP,之所以难,是因为很难想到,我的确有同学用三维数组做出来,然而三维的的确比二维好理解,但三维复杂度太高,虽然DP一 ...

  8. libevent源码深度剖析九

    libevent源码深度剖析九 ——集成定时器事件 张亮 现在再来详细分析libevent中I/O事件和Timer事件的集成,与Signal相比,Timer事件的集成会直观和简单很多.Libevent ...

  9. Linux awk&sed

    awk AWK是强大的文本处理工具,擅长对日志文件迚行快速分析. 它丌仅用亍 Linux ,也是任何环境中现有的功能最强大的数据处理引擎之一. 名称得自亍它的发明者 Alfred Aho .Pet ...

  10. vector向量容器

    vector向量容器不但可以像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单高效的容器,可以代替数组. vector具有内存自动管理的功能,对于元素的插入和删除,可以动态的调整所占内存. ...