#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct Node
{
DataType data; // 数据域
struct Node * next; // 指针域
}Node;
typedef struct
{
Node * front; // 队头指针(指向头结点)
Node * rear; // 队尾指针(指向最后一个有效结点)
}LinkQueue;
bool Init_Queue(LinkQueue * Q); // 初始化队列
bool Clear_Queue(LinkQueue * Q); // 请空队列
bool Destroy_Queue(LinkQueue * Q); // 销毁队列
bool En_Queue(LinkQueue * Q, DataType x); // 入队
bool De_Queue(LinkQueue * Q, DataType * x); // 出队
int getHead_Queue(LinkQueue * Q); // 取队头元素
bool Empty_Queue(LinkQueue * Q); // 判空
void Traverse_Queue(LinkQueue * Q); // 遍历队列
int main()
{
char ch;
int i,n,val;
DataType x;
LinkQueue Q;
if(Init_Queue(&Q))
printf("队列初始化成功!\n");
else
printf("队列初始化失败!\n");
printf("请输入要入队的元素个数:");
scanf("%d",&n);
for(i = 0; i<n; ++i)
{
printf("第%d个元素:",i+1);
scanf("%d",&val);
En_Queue(&Q, val);
}
printf("遍历队列:");
Traverse_Queue(&Q);
printf("队头元素:%d\n\n",getHead_Queue(&Q));
do
{
fflush(stdin); // 清空输入缓冲区
if(De_Queue(&Q, &x))
{
printf("出队成功!\n");
printf("出队的元素:%d\n",x);
}
else
printf("出队失败!\n");
printf("您是否还需要将元素出队?(输入F结束):");
}while((ch=getchar())!='F');
printf("遍历队列:");
Traverse_Queue(&Q);
if(Clear_Queue(&Q))
printf("队列清空成功!\n");
else
printf("队列清空失败!\n");
printf("遍历队列:");
Traverse_Queue(&Q);
if(Destroy_Queue(&Q))
printf("队列销毁成功!\n");
else
printf("队列销毁失败!\n");
return 0;
}
bool Init_Queue(LinkQueue * Q)
{
Q->front = Q->rear = (Node*)malloc(sizeof(Node));// 创建头结点,同时队头指针和队尾指针都指向头结点
if(!Q)
{
printf("申请空间失败!\n");
exit(-1);
}
Q->front->next = NULL; // 使队头指针所指向的头结点的指针域为空
return true;
}
bool Clear_Queue(LinkQueue * Q)
{
Node * p = Q->front->next;
Q->rear = Q->front;
Q->front->next = NULL; // 空队列:(头结点指针域为空)
while(p)
{
Node * q = p->next;
free(p);
p = q;
}
return true;
}
bool Destroy_Queue(LinkQueue * Q)
{
while(Q->front)
{
Node * p = Q->front->next;
free(Q->front);
Q->front = p;
}
Q->front = Q->rear = NULL;
return true;
}
bool En_Queue(LinkQueue * Q, DataType x)
{
Node * p = (Node*)malloc(sizeof(Node));
if(!p)
{
printf("申请空间失败!\n");
exit(-1);
}
p->data = x;
Q->rear->next = p;
p->next = NULL;
Q->rear = p; // 保证队尾指针永远指向最后一个有效元素
return true;
}
bool De_Queue(LinkQueue * Q, DataType * x)
{
if(Empty_Queue(Q))
return false;
Node * p = Q->front->next; // 队头指针永远指向头结点
*x = p->data;
Q->front->next = p->next;
free(p);
return true;
}
int getHead_Queue(LinkQueue * Q)
{
return Q->front->next->data; // 取队头元素
}
bool Empty_Queue(LinkQueue * Q)
{
if(Q->front==Q->rear)
return true;
else
return false;
}
void Traverse_Queue(LinkQueue * Q)
{
Node * p = Q->front->next;
while(p)
{
printf("%3d", p->data);
p = p->next;
}
printf("\n\n");
}
链队(C语言实现)
猜你喜欢
转载自blog.csdn.net/Mr_Morgans/article/details/120997082
今日推荐
周排行