博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
链式队列
阅读量:7014 次
发布时间:2019-06-28

本文共 5194 字,大约阅读时间需要 17 分钟。

hot3.png

#include 
#include 
#include 
#include 
#include 
using namespace std;typedef unsigned char uint8;typedef unsigned short uint16;typedef unsigned int uint32;typedef int DataType; //类型定义typedef struct _QueueNode{    DataType dt;    _QueueNode *next;}QueueNode;typedef struct _LinkedQueue{    QueueNode *first;    QueueNode *rear;}LinkedQueue;/******************************************************************************** 函数名称:CreateLinkedQueue* 函数功能:创建一个队列* 输入参数:无* 输出参数:无* 返 回 值: LinkedQueue指针*******************************************************************************/LinkedQueue *CreateLinkedQueue(void){    LinkedQueue *lq = (LinkedQueue*)malloc(sizeof(LinkedQueue));    lq->first = NULL;    lq->rear = NULL;    return lq;}/******************************************************************************** 函数名称:AddNodeLinkedQueue* 函数功能:(入队)在队列尾添加一个节点* 输入参数:LinkedQueue **lq,            DataType dt* 输出参数:无* 返 回 值: >0 入队成功            <0 入队失败*******************************************************************************/int AddNodeLinkedQueue(LinkedQueue **lq, DataType dt){    if(NULL == *lq)        return -1;    if(NULL == (*lq)->first)    {        QueueNode *qn = (QueueNode*)malloc(sizeof(QueueNode));        qn->next = NULL;        memcpy((uint8 *)&(qn->dt),(uint8 *)&dt, sizeof(DataType));        (*lq)->first = qn;        (*lq)->rear = qn;        return 1;    }    QueueNode *qn = (QueueNode*)malloc(sizeof(QueueNode));    qn->next = NULL;    memcpy((uint8 *)&(qn->dt),(uint8 *)&dt, sizeof(DataType));    qn->next = (*lq)->rear;    (*lq)->rear = qn;    return 2;}/******************************************************************************** 函数名称:VisitAllNodeLinkedQueue* 函数功能:遍历整个队列* 输入参数:LinkedQueue *lq* 输出参数:无* 返 回 值: 无*******************************************************************************/void VisitAllNodeLinkedQueue(LinkedQueue *lq){    if(NULL == lq)        return;    QueueNode *qn = lq->rear;    printf("[");    while(NULL != qn)    {        printf("%d",qn->dt);        qn = qn->next;        if(NULL != qn)            printf(",");    }    printf("]\n");}/******************************************************************************** 函数名称:GetRearLinkedQueue* 函数功能:取得队尾,但不删除节点* 输入参数:LinkedQueue *lq* 输出参数:QueueNode **node* 返 回 值: >0成功,<0失败*******************************************************************************/int GetRearLinkedQueue(LinkedQueue *lq, QueueNode **node){    if(NULL == lq || NULL == lq->rear)        return -1;    *node = lq->rear;    return 1;}/******************************************************************************** 函数名称:GetFirstLinkedQueue* 函数功能:取得队头,但不删除节点* 输入参数:LinkedQueue *lq* 输出参数:QueueNode **node* 返 回 值: >0成功,<0失败*******************************************************************************/int GetFirstLinkedQueue(LinkedQueue *lq, QueueNode **node){    if(NULL == lq || NULL == lq->rear)        return -1;    *node = lq->first;    return 1;}/******************************************************************************** 函数名称:RemoveFirstLinkedQueue* 函数功能:出队,删除节点* 输入参数:LinkedQueue **lq* 输出参数:LinkedQueue **lq* 返 回 值: >0 出队成功            <0 出队失败*******************************************************************************/int RemoveFirstLinkedQueue(LinkedQueue **lq){    if(NULL == (*lq) || NULL == (*lq)->rear)        return -1;    QueueNode *pre_node = (*lq)->rear;    QueueNode *curr_node = (*lq)->rear;    QueueNode *head_node = (*lq)->rear;    while(NULL != curr_node->next)    {        pre_node = curr_node;        curr_node = curr_node->next;    }    if(pre_node == curr_node)    {        memset((uint8 *)&(curr_node->dt), 0x00, sizeof(DataType));        free(curr_node);        curr_node = NULL;        (*lq)->rear = NULL;        (*lq)->first = NULL;        return 1;    }    memset((uint8 *)&(curr_node), 0x00, sizeof(DataType));    free(curr_node);    curr_node = NULL;    (*lq)->first = pre_node;    (*lq)->first->next = NULL;    return 2;}/******************************************************************************** 函数名称:GetLenLinkedQueue* 函数功能:取得队列长度* 输入参数:LinkedQueue **lq* 输出参数:无* 返 回 值: 长度*******************************************************************************/int GetLenLinkedQueue(LinkedQueue *lq){    if(NULL == lq || NULL == lq->rear)        return 0;    QueueNode *qn = lq->rear;    int len = 0;    while(NULL != qn)    {        qn = qn->next;        len++;    }    return len;}int main(){    LinkedQueue *lq = CreateLinkedQueue();    QueueNode *qn = NULL;    AddNodeLinkedQueue(&lq, 1);    AddNodeLinkedQueue(&lq, 2);    //AddNodeLinkedQueue(&lq, 3);    //AddNodeLinkedQueue(&lq, 4);    VisitAllNodeLinkedQueue(lq);    printf("queue first: %d\n",GetFirstLinkedQueue(lq,&qn)>0?qn->dt:-1);    printf("queue rear: %d\n",GetRearLinkedQueue(lq,&qn)>0?qn->dt:-1);    RemoveFirstLinkedQueue(&lq);    VisitAllNodeLinkedQueue(lq);    printf("queue first: %d\n",GetFirstLinkedQueue(lq,&qn)>0?qn->dt:-1);    printf("queue rear: %d\n",GetRearLinkedQueue(lq,&qn)>0?qn->dt:-1);    printf("queue len : %d\n",GetLenLinkedQueue(lq));    return 1;}

转载于:https://my.oschina.net/crooner/blog/221935

你可能感兴趣的文章
双机热备份的切换时间是这么确定的
查看>>
ADSL拨号上网,拨完了获得的地址IP跟网关一样!
查看>>
Socket.IO连接异常时的内置事件流程图
查看>>
算法学习笔记(四)---第k个二进制数字问题
查看>>
忘记sa密码,又删除了windows身份验证账号的解决方法
查看>>
Open-Falcon 监控系统监控 MySQL/Redis/MongoDB 状态监控
查看>>
1-4 Zabbix 用户管理
查看>>
Visual Studio 2017强制更新方法
查看>>
蓝牙设备探测工具blueranger
查看>>
我的友情链接
查看>>
KaliLinux常用服务配置教程DHCP服务工作流程
查看>>
js基础--javascript基础概念之数组
查看>>
date 输出格式
查看>>
Android控件TextView的实现原理分析
查看>>
java中异常的处理
查看>>
我的友情链接
查看>>
最小生成树算法——Prim和Kruskal算法的实现
查看>>
java循环中如何删除集合中的元素
查看>>
JFinal 2.2 国际化功能的应用
查看>>
Kafka性能调优
查看>>