队列的链式存储的定义结点、初始化、判断空、入队、出队、读取队头元素、求队列长度操作
方法一:
这种链队列有头指针,上图分别为链队列为空、非空、只有一个元素的时候的情况,
代码如下:
//队列的链式存储和操作的实现
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node{ //定义链队结点的类型
DataType data;
struct Node *next;
}LinkNode;
typedef struct{ //将头尾指针封装在一起的链队列
LinkNode *front,*rear;
}LinkQueue;
void Init_Queue(LinkQueue *&q) //队列初始化,使front和rear都指向头队列的头结点
{
q=(LinkQueue*)malloc(sizeof(LinkQueue));
LinkNode *p;
p=(LinkNode*)malloc(sizeof(LinkNode));
p->next=NULL;
q->front=q->rear=p;
}
int Queue_Empty(LinkQueue *q) //判断空操作
{
if(q->front==q->rear)
return 1;
else
return 0;
}
void Push_Queue(LinkQueue *q,DataType x) //入队列操作
{
LinkNode *p;
p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
void GetHead_Queue(LinkQueue *q) //读取队头元素
{
LinkNode *p;
if(Queue_Empty(q))
printf("Queue is Empty\n");
else
{
p=q->front->next;
DataType x=p->data;
printf("%d\n",x);
}
}
void Pop_Queue(LinkQueue *q) //出队操作
{
LinkNode *p;
if(Queue_Empty(q))
printf("Queue is Empty\n");
else
{
p=q->front->next;
q->front->next=p->next;
if(p->next==NULL)
q->rear=q->front;
free(p);
}
}
void Queue_Length(LinkQueue *q) //求队列的长度
{
int t=0;
LinkNode *p;
p=q->front->next;
while(p!=NULL)
{
t++;
p=p->next;
}
printf("Queue Length is %d\n",t);
}
int main()
{
LinkQueue *q;
Init_Queue(q);
Push_Queue(q,1);
Push_Queue(q,2);
Push_Queue(q,3);
Queue_Length(q);
GetHead_Queue(q);
Pop_Queue(q);
Queue_Length(q);
GetHead_Queue(q);
}
方法二:
这种链队列无头结点,上图分别为链队列为空,元素进队的情况
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType;
typedef struct Node{ //定义链队结点的类型
DataType data;
struct Node *next;
}LinkNode;
typedef struct{ //将头尾指针封装在一起的链队列
LinkNode *front,*rear;
}LinkQueue;
void Init_Queue(LinkQueue *&q) //队列初始化
{
q=(LinkQueue*)malloc(sizeof(LinkQueue));
q->front=NULL;
q->rear=NULL;
}
void Push_Queue(LinkQueue *q,DataType x) //入队操作
{
LinkNode *p;
p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=x;
p->next=NULL;
if(q->front==NULL)
{
q->front=p;
q->rear=p;
}
else
{
q->rear->next=p;
q->rear=p;
}
}
int Queue_Empty(LinkQueue *q) //判断空操作
{
if(q->front==NULL)
return 1;
else
return 0;
}
void Pop_Queue(LinkQueue *q) //出队操作
{
LinkNode *p;
if(Queue_Empty(q))
printf("Queue is Empty");
else
{
p=q->front;
q->front=p->next;
if(q->front==NULL)
q->rear=NULL;
free(p);
}
}
void GetHead_Queue(LinkQueue *q) //读取队头元素
{
if(Queue_Empty(q))
printf("Queue is Empty!\n");
else
printf("%d\n",q->front->data);
}
void Queue_Length(LinkQueue *q) //求队列的长度
{
LinkNode *p;
p=q->front;
int t=0;
while(p!=NULL)
{
t++;
p=p->next;
}
printf("Queue Length is %d\n",t);
}
int main()
{
LinkQueue *q;
Init_Queue(q);
Push_Queue(q,1);
Push_Queue(q,2);
Push_Queue(q,3);
Queue_Length(q);
GetHead_Queue(q);
Pop_Queue(q);
Queue_Length(q);
GetHead_Queue(q);
}