队列的链式储存结构
文章目录
队列的链式储存结构链队列的基本定义链队列的基本操作初始化队列求队列长度入队列操作出队列函数打印该队列
项目整体源代码:
链队列的基本定义
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。
队列的链式储存结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点。
空队列时,front和rear都指向头节点。
链队列的基本操作
初始化队列
int Init_LinkQueue(LinkQueue
*L
)
{
QNode
*S
;
S
= (QNode
*)malloc(sizeof(Node
));
if (!S
)
{
printf("初始化失败!\n");
return 0;
}
S
->next
= NULL;
L
->front
= S
;
L
->rear
= S
;
return 0;
}
求队列长度
int Length_LinkQueue(LinkQueue
*L
)
{
int count
= 0;
QNode
*S
;
S
= L
->front
;
while (L
->front
!= L
->rear
)
{
count
++;
L
->front
= L
->front
->next
;
}
L
->front
= S
;
return count
;
}
入队列操作
int EnQueue(LinkQueue
*L
, elemtype e
)
{
QNode
*S
;
S
= (QNode
*)malloc(sizeof(Node
));
if (!S
)
{
printf("插入元素失败!\n");
return 0;
}
S
->data
= e
;
S
->next
= NULL;
L
->rear
->next
= S
;
L
->rear
= S
;
return 0;
}
出队列函数
int DeQueue(LinkQueue
*L
, elemtype
*e
)
{
QNode
*S
;
if (L
->front
== L
->rear
)
{
printf("当前队为空,无法删除元素!\n");
return 0;
}
S
= L
->front
->next
;
*e
= S
->data
;
L
->front
->next
= S
->next
;
if (L
->rear
== S
)
L
->rear
= L
->front
;
free(S
);
return 0;
}
打印该队列
void Show_LinkQueue(LinkQueue
*L
)
{
if (L
->front
== L
->rear
)
{
printf("队列为空!\n");
return;
}
QNode
*S
;
S
= L
->front
;
L
->front
= L
->front
->next
;
printf("当前队列元素为:");
while (L
->front
)
{
printf("%d ", L
->front
->data
);
L
->front
= L
->front
->next
;
}
printf("\n");
L
->front
= S
;
}
到此,队列链式储存的基本操作就已经完成了,下面附上源码
项目整体源代码:
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype
;
typedef struct Node
{
elemtype data
;
struct Node
*next
;
}QNode
,*QueuePtr
;
typedef struct
{
QueuePtr front
, rear
;
}LinkQueue
;
int Init_LinkQueue(LinkQueue
*L
)
{
QNode
*S
;
S
= (QNode
*)malloc(sizeof(Node
));
if (!S
)
{
printf("初始化失败!\n");
return 0;
}
S
->next
= NULL;
L
->front
= S
;
L
->rear
= S
;
return 0;
}
int EnQueue(LinkQueue
*L
, elemtype e
)
{
QNode
*S
;
S
= (QNode
*)malloc(sizeof(Node
));
if (!S
)
{
printf("插入元素失败!\n");
return 0;
}
S
->data
= e
;
S
->next
= NULL;
L
->rear
->next
= S
;
L
->rear
= S
;
return 0;
}
int DeQueue(LinkQueue
*L
, elemtype
*e
)
{
QNode
*S
;
if (L
->front
== L
->rear
)
{
printf("当前队为空,无法删除元素!\n");
return 0;
}
S
= L
->front
->next
;
*e
= S
->data
;
L
->front
->next
= S
->next
;
if (L
->rear
== S
)
L
->rear
= L
->front
;
free(S
);
return 0;
}
int Length_LinkQueue(LinkQueue
*L
)
{
int count
= 0;
QNode
*S
;
S
= L
->front
;
while (L
->front
!= L
->rear
)
{
count
++;
L
->front
= L
->front
->next
;
}
L
->front
= S
;
return count
;
}
void Show_LinkQueue(LinkQueue
*L
)
{
if (L
->front
== L
->rear
)
{
printf("队列为空!\n");
return;
}
QNode
*S
;
S
= L
->front
;
L
->front
= L
->front
->next
;
printf("当前队列元素为:");
while (L
->front
)
{
printf("%d ", L
->front
->data
);
L
->front
= L
->front
->next
;
}
printf("\n");
L
->front
= S
;
}
int main()
{
LinkQueue L
;
elemtype m
;
Init_LinkQueue(&L
);
Show_LinkQueue(&L
);
printf("队列的长度为%d\n", Length_LinkQueue(&L
));
EnQueue(&L
, 5);
EnQueue(&L
, 3);
EnQueue(&L
, 32);
EnQueue(&L
, 65);
Show_LinkQueue(&L
);
printf("队列的长度为%d\n", Length_LinkQueue(&L
));
DeQueue(&L
,&m
);
printf("被删除元素为:%d\n", m
);
DeQueue(&L
, &m
);
printf("被删除元素为:%d\n", m
);
Show_LinkQueue(&L
);
printf("队列的长度为%d\n", Length_LinkQueue(&L
));
system("pause");
return 0;
}