数据结构–队列的链表实现

队列的链表实现代码定义

typedef struct LinkNode
{
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct
{
LinkNode *front, *rear;
}LinkQueue;
带头结点
初始化

void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
return Q.front == Q.rear;
}
入队

void EnQueue(LinkQueue &Q, ElemType x)
{
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s; //新结点插入到rear之后
Q.rear = s; //修改表尾指针
}
出队




bool DeQueue(LinkQueue &Q, ElemType &x)
{
if (Q.front == Q.rear) return false;
LinkNode* p = Q.front->next;
x = p->data; //用变量x返回队头元素
Q.front->next = p->next; //修改头结点的next指针
if (Q.rear == p) //此次是最后一个结点出队
Q.rear = Q.front; //修改rear指针
free(p);
return true;
}
不带头结点
初始化
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = NULL;
}
判断队列是否为空
bool IsEmpty(LinkQueue Q)
{
return Q.front == NULL;
}
入队

void EnQueue(LinkQueue &Q, ElemType x)
{
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
//不带头结点的队列,第一个元素入队时需要特别处理
if (Q.front == NULL)
Q.front = s, Q.rear = s;
else
Q.rear->next = s, Q.rear = s;
}
出队


bool DeQueue(LinkQueue &Q, ElemType &x)
{
if (Q.front == NULL) return false;
LinkNode* p = Q.front;
x = p->data; //用变量x返回队头元素
Q.front = p->next; //修改front指针
if (Q.rear == p) //此次是最后一个结点出队
Q.front = Q.rear = NULL; //front & rear 指向NULL
free(p);
return true;
}
队满
链式存储――一般不会队满,除非内存不足
知识点回顾与重要考点
