队列:
是一种先进先出的线性表,只允许在表的一端进行插入,而在另一端删除元素。和日常的排队一致。允许插入的一端叫做队尾,允许删除的一端叫做队头。(尾进头出)
存储结构
typedef struct QNode{
ElemType data;//数据域
struct QNode *next;//指针域
} QNode, *QPtrl;
typedef struct {
QPtrl front;//头指针
QPtrl rear;//尾指针
}*LinkQueue;
各个函数
初始化队列
//初始化队列
LinkQueue InitQueue(LinkQueue Q)
{
Q->front = Q->rear = (QPtrl)malloc(sizeof(QNode));//生成新的结点作为头节点且让头尾指针指向它
if (!Q->front) exit(OVERFLOW);
Q->front->next = NULL;//头节点
return Q;
}
入队函数
//入队函数
LinkQueue EnQueue(LinkQueue Q, ElemType *e)
{
QPtrl p = (QPtrl)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = *e; p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return Q;
}
定义一个新的指向结构体的指针p,储存存入的值,并指向空处,并且原来队尾指向它,使p作为新的队尾。
记得最后队尾指针需要改变(指向p)。
出队函数
//出队函数
LinkQueue DeQueue(LinkQueue Q, ElemType *e)
{
if (Q->front == Q->rear ) exit(OVERFLOW);
*e = Q->front->next->data;
QPtrl p = (QPtrl)malloc(sizeof(QNode));
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p) Q->rear = Q->front;
free(p);
return Q;
}
删除队列头元素算法中的特殊情况,一般情况下,删除队列头元素时仅需修改结点中的指针,但当队列中最后一个元素被删后,队列尾指针也丢失了,因此需要对队尾指针重新赋值(指向头节点)。
取队头元素
//取队头元素
LinkQueue GetHead(LinkQueue Q, ElemType *e)
{
if (Q->front == Q->rear ) exit(OVERFLOW);
*e = Q->front->next->data;
}
调用入队功能函数
//调用入队功能函数
LinkQueue Use_EnQueue(LinkQueue Q)
{
ElemType e, num;
printf("请输入入队元素个数:\n");
scanf("%d", &num);
printf("请输入入队元素:\n");
for (int i=0; i<num; i++)
{
scanf("%d", &e);
EnQueue(Q,&e);
}
return Q;
}
调用出队功能函数
//调用出队功能函数
LinkQueue Use_DeQueue(LinkQueue Q)
{
ElemType e, num;
printf("请输入出队元素个数:\n");
scanf("%d", &num);
for (int i=0; i<num; i++)
{
DeQueue(Q,&e);
}
return Q;
}
调用取队头元素功能函数
//调用取队头元素功能函数
void Use_GetHead(LinkQueue Q)
{
ElemType e;
GetHead(Q,&e);
printf("队头元素是%d\n", e);
}
遍历队列
//遍历队列
void TravelQueue(LinkQueue Q)
{
QPtrl p = (QPtrl)malloc(sizeof(QNode));
p = Q->front->next;
while (p != NULL)
{
printf("%d", p->data);
p=p->next;
}
printf("\n");
}
全部代码
#include <Stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
#define OVERFLOW -1
#define Status int
#define bool int
#define true 1
#define flase 0
#define ElemType int
typedef struct QNode{
ElemType data;//数据域
struct QNode *next;//指针域
} QNode, *QPtrl;
typedef struct {
QPtrl front;//头指针
QPtrl rear;//尾指针
}*LinkQueue;
//初始化队列
LinkQueue InitQueue(LinkQueue Q)
{
Q->front = Q->rear = (QPtrl)malloc(sizeof(QNode));//生成新的结点作为头节点且让头尾指针指向它
if (!Q->front) exit(OVERFLOW);
Q->front->next = NULL;//头节点
return Q;
}
//入队函数
LinkQueue EnQueue(LinkQueue Q, ElemType *e)
{
QPtrl p = (QPtrl)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data = *e; p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return Q;
}
//出队函数
LinkQueue DeQueue(LinkQueue Q, ElemType *e)
{
if (Q->front == Q->rear ) exit(OVERFLOW);
*e = Q->front->next->data;
QPtrl p = (QPtrl)malloc(sizeof(QNode));
p = Q->front->next;
Q->front->next = p->next;
if (Q->rear == p) Q->rear = Q->front;
free(p);
return Q;
}
//取队头元素
LinkQueue GetHead(LinkQueue Q, ElemType *e)
{
if (Q->front == Q->rear ) exit(OVERFLOW);
*e = Q->front->next->data;
}
//菜单
void menu()
{
printf("********1.入队 2.出队*********\n");
printf("********3.取队顶元素 4.遍历*********\n");
printf("********5.退出 6.*********\n");
}
//调用入队功能函数
LinkQueue Use_EnQueue(LinkQueue Q)
{
ElemType e, num;
printf("请输入入队元素个数:\n");
scanf("%d", &num);
printf("请输入入队元素:\n");
for (int i=0; i<num; i++)
{
scanf("%d", &e);
EnQueue(Q,&e);
}
return Q;
}
//调用出队功能函数
LinkQueue Use_DeQueue(LinkQueue Q)
{
ElemType e, num;
printf("请输入出队元素个数:\n");
scanf("%d", &num);
for (int i=0; i<num; i++)
{
DeQueue(Q,&e);
}
return Q;
}
//调用取队头元素功能函数
void Use_GetHead(LinkQueue Q)
{
ElemType e;
GetHead(Q,&e);
printf("队头元素是%d\n", e);
}
//遍历队列
void TravelQueue(LinkQueue Q)
{
QPtrl p = (QPtrl)malloc(sizeof(QNode));
p = Q->front->next;
while (p != NULL)
{
printf("%d", p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkQueue Q;
int num;
Q = InitQueue(Q);
// printf("123");
while(1)
{
menu();
scanf("%d", &num);
switch(num)
{
case 1: Q=Use_EnQueue(Q); break;
case 2: Q=Use_DeQueue(Q); break;
case 3: Use_GetHead(Q); break;
case 4: TravelQueue(Q); break;
case 5: exit(OVERFLOW);
default:printf("replace!\n");
}
}
return 0;
}