数据结构——linkQueue

链队列

typedef struct node
{
    char data;
    struct node *next;
}Node;

typedef struct queue
{
    Node *front;
    Node *rear;
}Queue;

void initQueue(Queue *q);
int  isQueueEmpty(Queue *q);
void enQueue(Queue *q,char ch);
char deQueue(Queue *q);
void clearQueue(Queue *q);
void destoryQueue(Queue *q);

 

#include "linkqueue.h"
#include <stdlib.h>
#include <stdio.h>

#if 0
(1) q->rear 永远指向最后一个node的、
(2) deQueu的时候,分为两种情况。最后一个结点特殊对待
(3) reset 的思想 一分为二 保住狗头
(4) rear &  front 的基友关系 不变


#endif

void initQueue(Queue *q)
{
    q->front = q->rear = (Queue*)malloc(sizeof(Node));
    q->rear->next = NULL;
}
int  isQueueEmpty(Queue *q)
{
    return q->front == q->rear;
}
void enQueue(Queue *q,char ch)
{
    Node *cur = (Node*)malloc(sizeof(Node));
    cur->data = ch;
    cur->next = q->rear->next;
    q->rear->next = cur;
    q->rear = cur; //q->rear永远指向最后一个!!
}
char deQueue(Queue *q)
{
//     Node *t;
//     t = q->front;
//     char ch = q->front->data;
//     q->front = q->front->next;
//     free(t);
//     return ch;
    //分为两种情况(1)只有一个数据了,也就是除头节点之外最后一个node(2)多个数据
    char ch = q->front->next->data;
    Node *t;
    if(q->front->next == q->rear)
    {
        //last node
        q->rear = q->front;
        free(q->front->next);
        q->front->next = NULL;
    }
    else
    {
        t = q->front->next;
        q->front->next = t->next;
        free(t);
    }
    return ch;
}
//q->front->next; 怎么和 rear 的路径一致呢???
void clearQueue(Queue *q)
{
    //一分为二 保住狗头
    Node *head = q->front->next;
    q->rear = q->front;
    q->front->next = NULL;
    //分割。然后操作头为head的链表 delete就OK
    Node *t;
    while(head)
    {
        t= head->next;
        free(head);
        head = t;
    }
}
void destoryQueue(Queue *q)
{
    clearQueue(&q);
    free(q->front);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值