今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了。
(2018-02-14 代码更新)
Head file:
#ifndef __LINKQUEUE_H_
#define __LINKQUEUE_H_
#define bool int
#define true 1
#define false 0
typedef int KeyType;
typedef struct node
{
struct node * next;
KeyType key;
}Node;
typedef struct queue
{
Node * front;
Node * rear;
int nums;
}Queue;
Queue * CreateLinkQueue();
bool QueueIsEmpty();
int QueueItemCount();
bool QueueAdd();
bool QueueRemove();
Node* GetQueueFrontNode();
Node* GetQueueRearNode();
KeyType GetQueueFront();
KeyType GetQueueRear();
void TraverseQueue();
void Clear();
void Destroy();
#endif
LinkQueue.c:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include "lqueue.h"
//建立链队
Queue * CreateLinkQueue(void)
{
Queue * p;
p = (Queue*)malloc(sizeof(Queue));
p->front = p->rear = NULL;
p->nums = 0;
return p;
}
//判断队列是否为空
bool QueueIsEmpty(Queue * p)
{
return p->nums == 0;
}
//返回当前队列个数
int QueueItemCount(Queue * p)
{
return p->nums;
}
//入队
bool QueueAdd(Queue * p, KeyType DATA)
{
Node * s;
s = (Node*)malloc(sizeof(Node));
s->key = DATA;
s->next = NULL;
if(QueueIsEmpty(p))
p->front = s;
else
p->rear->next = s;
p->rear = s;
p->nums++;
return true;
}
//出队
bool QueueRemove(Queue * p)
{
Node * s;
if(QueueIsEmpty(p))
return false;
s = p->front;
p->front = p->front->next;
free(s);
p->nums--;
return true;
}
//返回队首节点
Node* GetQueueFrontNode(Queue * p)
{
if(QueueIsEmpty(p))
return false;
return p->front;
}
//返回队尾节点
Node* GetQueueRearNode(Queue * p)
{
if(QueueIsEmpty(p))
return false;
return p->rear;
}
//返回队首
KeyType GetQueueFront(Queue * p)
{
return GetQueueFrontNode(p)->key;
}
//返回队尾
KeyType GetQueueRear(Queue * p)
{
return GetQueueRearNode(p)->key;
}
//遍历队列
void TraverseQueue(Queue * p)
{
Node*s = GetQueueFrontNode(p);
while(s != NULL)
{
printf("%d ", s->key);
s = s->next;
}
printf("\n");
}
//清空队列
void Clear(Queue * p)
{
while(!QueueIsEmpty(p))
QueueRemove(p);
}
//销毁队列
void Destroy(Queue * p)
{
if(p != NULL)
{
Clear(p);
free(p);
p = NULL;
}
}