链队列
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);
}