数据结构上机实践第七周项目2 - 自建算法库——链队(链式队列)

简介: 数据结构上机实践第七周项目2 - 自建算法库——链队(链式队列)

自建算法库——链队(链式队列)

实现源代码如下:

1.liqueue.h

/*   
copyright (t) 2016,烟台大学计算机学院   
*All rights reserved.   
*文件工程名称:1.cbd   
*作者:田长航  
完成日期:2017年12月22日  
*版本号:v1.0   
*问题描述:定义链队存储结构,实现其基本运算,并完成测试。   
要求:   
    1、头文件liqueue.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:   
    void InitQueue(LiQueue *&q);  //初始化链队   
    void DestroyQueue(LiQueue *&q); //销毁链队   
    bool QueueEmpty(LiQueue *q);  //判断链队是否为空   
    int QueueLength(LiQueue *q);   //返回链队中元素个数,也称队列长度   
    bool enQueue(LiQueue *&q,ElemType e);   //进队   
    bool deQueue(LiQueue *&q,ElemType &e);  //出队   
  2、在liqueue.cpp中实现这些函数   
  3、在main函数中完成测试,包括如下内容:   
    (1)初始化队列q   
    (2)依次进队列元素a,b,c   
    (3)判断队列是否为空   
    (4)出队一个元素   
    (5)输出队列中元素个数   
    (6)依次进队列元素d,e,f   
    (7)输出队列中元素个数   
    (8)将队列中所有元素删除,并输出序列   
    (9)释放队列   
*输入描述:无   
*程序输出:完成测试后的运行结果   
*/    
typedef char ElemType;                      //自定义字符型数据类型    
typedef struct qnode                        //链队中数据节点的类型    
{    
    ElemType data;    
    struct qnode *next;    
} QNode;    
typedef struct                              //链队节点的类型    
{    
    QNode *front;    
    QNode *rear;    
} LiQueue;    
void InitQueue(LiQueue *&q);                //初始化链队    
void DestroyQueue(LiQueue *&q);             //销毁链队    
bool QueueEmpty(LiQueue *q);                //判断链队是否为空    
int QueueLength(LiQueue *q);                //返回链队中元素个数,也称队列长度    
void enQueue(LiQueue *&q,ElemType e);       //进队    
bool deQueue(LiQueue *&q,ElemType &e);      //出队    

2.liqueue.cpp

#include <malloc.h>    
#include "liqueue.h"    
void InitQueue(LiQueue *&q)                 //初始化链队    
{    
    q=(LiQueue *)malloc(sizeof(LiQueue));    
    q->front=q->rear=NULL;    
}    
void DestroyQueue(LiQueue *&q)              //销毁链队    
{    
    QNode *p=q->front,*r;    
    if(p!=NULL)    
    {    
        r=p->next;    
        while(r!=NULL)    
        {    
            free(p);    
            p=r;    
            r=p->next;    
        }    
    }    
    free(p);    
    free(q);    
}    
bool QueueEmpty(LiQueue *q)                 //判断链队是否为空    
{    
    return (q->rear==NULL);    
}    
int QueueLength(LiQueue *q)                 //返回链队中元素个数,也称队列长度    
{    
    QNode *p=q->front;    
    int length=0;                           //设计数变量,记录表长    
    while(p!=NULL)    
    {    
        length++;    
        p=p->next;    
    }    
    return length;    
}    
void enQueue(LiQueue *&q,ElemType e)        //进队    
{    
    QNode *p;    
    p=(QNode *)malloc(sizeof(QNode));    
    p->data=e;    
    p->next=NULL;                           //创建data域为e、指针域为NULL的数据节点*p    
    if(q->rear==NULL)    
        q->front=q->rear=p;    
    else    
    {    
        q->rear->next=p;    
        q->rear=p;    
    }    
}    
bool deQueue(LiQueue *&q,ElemType &e)       //出队 需考虑队列为空的情况,故设置函数类型为bool型    
{    
    QNode *t;    
    if(q->rear==NULL)    
        return false;    
    t=q->front;    
    if(q->front==q->rear)    
        q->front=q->rear=NULL;    
    else    
        q->front=q->front->next;    
    e=t->data;    
    free(t);    
    return true;    
}    

3.main.cpp

#include <stdio.h>    
#include <malloc.h>    
#include "liqueue.h"    
int main()    
{    
    LiQueue *q;    
    ElemType e;    
    InitQueue(q);                           //初始化队列q    
    printf("该队列已被初始化!\n");    
    if(QueueEmpty(q))                       //判断队列是否为空    
        printf("该队列为空\n");    
    else    
        printf("该队列不为空\n");    
    enQueue(q,'a');                         //依次进队列元素a,b,c    
    enQueue(q,'b');    
    enQueue(q,'c');    
    printf("元素a,b,c进队后,");    
    if(QueueEmpty(q))                       //判断队列是否为空    
        printf("该队列为空\n");    
    else    
        printf("该队列不为空\n");    
    if(deQueue(q,e)==0)                     //出队一个元素    
        printf("此队列已为空,出队操作失败!\n");    
    printf("出队成功,出队元素为%c\n",e);    
    printf("此时队列中元素个数为:%d\n",QueueLength(q));   //输出队列中元素个数    
    enQueue(q,'d');                         //依次进队列元素d,e,f    
    enQueue(q,'e');    
    enQueue(q,'f');    
    printf("元素d,e,f进队后,队列中元素个数为:%d\n",QueueLength(q));   //输出队列中元素个数    
    printf("出队序列为:");                 //将队列中所有元素删除,并输出序列    
    while(!QueueEmpty(q))    
    {    
        deQueue(q,e);    
        printf("%c",e);    
    }    
    printf("\n");    
    DestroyQueue(q);                        //释放队列    
    printf("该队列已释放!\n");    
    return 0;    
}    

运行结果截图如下:

image.png

相关文章
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
156 1
|
4月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
150 0
|
8月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
283 10
 算法系列之数据结构-二叉树
|
8月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
232 3
 算法系列之数据结构-Huffman树
|
8月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
337 22
|
9月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
353 30
|
9月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
448 25
|
9月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
567 23
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
290 59
|
5月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
122 0
栈区的非法访问导致的死循环(x64)

热门文章

最新文章