算法与数据结构-队列的基本操作C语言实现

序言

队列有顺序队列和链式队列,顺序队列通过数组方式来实现,链式队列通过链表方式来实现。

数组方式实现便于数据访问(大小和空间确定),链表方式实现便于数据操作(插入和删除灵活)。

这里介绍链式队列的基本操作及其C语言实现。


队列的基本操作有哪些

  • 创建并初始化

  • 清空/销毁队列

  • 判断队列是否为空

  • 队列遍历

  • 获取队列大小

  • 元素入队

  • 元素出队


1. 链式队列的定义
//队列节点
typedef struct queue_node
{
    int data;                   //数据域
    struct list_queue *next;    //指针域
}queueNode, *queNode;

//队列
typedef struct queue
{
    queNode front;        //队头指针
    queNode rear;         //队尾指针
    int nodeNum;          //节点计数,若需要
}queue, *Queue;


2. 队列的初始化
void InitQue(queue *que)
{
    que -> front = que -> rear = NULL;
    que -> nodeNum = 0;
}

//或者
bool InitQue(queue *que)
{
    que -> front = que -> rear = (Queue)malloc(sizeof(queue));
    que -> nodeNum = 0;
    if (! que -> front)
        return false;
    que -> front -> next = NULL;
    return true;
}


3. 判断队列是否为空
//判断队列是否为空
int IsEmpty(queue *que)
{
    if (que -> front == NULL && que -> rear == NULL && que -> nodeNum == 0)
        return 1;
    else
        return 0;
}


4. 清空队列
//清空队列
void EmptyQue(queue *que)
{
    queue *temp = que -> front;
    while (temp != NULL)
    {
        que -> front = que -> front -> next;
        free (temp);
        temp = que -> front;
    }
    que -> rear = NULL;
}


5. 队列遍历
bool QueueTraverse(queue *que)
{
    if (que -> front == NULL && que -> rear == NULL)       //而不是que -> front == que -> rear
    {
        printf("队列为空\n");
        return false;
    }
    queue *temp = que -> front;
    while (temp != que -> rear)
    {
        temp = temp -> next;     //指向下一个节点
        printf("%d", temp -> data);
    }
    return true;
}       


6. 获取队列大小
int QueueSize(queue *que)
{
    return que -> nodeNum;
}


7. 元素入队
int AddItem2Queue(queue *que, int x)
{
    //定义操作节点
    queNode temp = (queNode)malloc(sizeof(queueNode)); 
    if (!temp)
        return 1;
    temp -> next = NULL;
    temp -> data = x;

    //元素入队
    if (IsEmpty(que))
    {
        que -> front = que -> rear = temp;
        que -> nodeNum++;
    }
    else
    {
        que -> rear -> next = temp;
        que -> rear = temp;
        que -> nodeNum++;
    }
    return 0;
}


8. 元素出队
//获取元素但不删除节点
int ReadItemFromQueue(queue *que)
{
    if (que -> front == que -> rear)
    {
        printf("队列为空");
        return -1;
    }

    return que -> front -> data;
}


//获取元素且删除节点
int ReadItemFromQueue(queue *que)
{
    if (que -> front == que -> rear)
    {
        printf("队列为空");
        return -1;
    }

    queNode temp = (queNode)malloc(sizeof(queueNode));
    temp = que -> front;
    int x = temp -> data;
    que -> front = temp -> next;
    que -> nodeNum--;

    if (que -> rear == temp)         //只有一个节点
        que -> rear = NULL;

    free(temp);
    return x;
}



Acknowledgements:
http://blog.csdn.net/hehainan_86/article/details/11630857
http://blog.csdn.net/to_dreams/article/details/7708391
http://blog.csdn.net/jiajiayouba/article/details/9128815

2017.08.25

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值