头文件 linkQueue.h
#ifndef _LINKQUEUE_H_
#define _LINKQUEUE_H_
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int datatype; //定义数据类型为int
//定义链式队列的结点类型
typedef struct linkQueueNode{
datatype data; //数据域
struct linkQueueNode *next; //链接指针域
}linkQueue_node,*linkQueue_pnode;
//将front和rear 指针封装
typedef struct linkqueue{
linkQueue_pnode front,rear; //链队列指针
}link_queue,*link_pqueue;
void init_linkqueue(link_pqueue *Q); //初始化链队列
bool is_empty_linkqueue(link_pqueue q); //判断链队列是否为空,因为是链式队列故无需考虑是否已满
bool in_linkqueue(datatype data,link_pqueue q); //元素入链队列
bool out_linkqueue(link_pqueue q,datatype *D); //元素出链队列
void show_linkqueue(link_pqueue q); //输出链队列中的元素
void init_linkqueue(link_pqueue *Q) //初始化链队列
{
//申请fornt和rear的空间
*Q=(link_pqueue)malloc(sizeof(linkQueue_node));
if(NULL == (*Q)->front)
{
printf("malloc failed!\n");
return ;
}
//申请头结点空间
(*Q)->front =(linkQueue_pnode)malloc(sizeof(linkQueue_node));
if(NULL == (*Q)->front)
{
printf("malloc failed\n");
return ;
}
(*Q)->front->next=NULL;
(*Q)->rear=(*Q)->front;
}
bool is_empty_linkqueue(link_pqueue q) //判断链队列是否为空
{
if(q->rear==q->front)
return true;
else
return false;
}
bool in_linkqueue(datatype data,link_pqueue q) //元素入链队列
{
linkQueue_pnode d;
//申请数据结点空间
d=(linkQueue_pnode)malloc(sizeof(linkQueue_node));
if(NULL == d)
{
printf("入队失败!\n");
return false;
}
//将数据存储在申请的空间中
d->data=data;
//将d指向的结点插入到链式队列中
d->next=q->rear->next;
q->rear->next=d;
//让rear指针指向新的队尾结点
q->rear=q->rear->next;
return true;
}
bool out_linkqueue(link_pqueue q,datatype *D) //元素出链队列
{
linkQueue_pnode t;
if(is_empty_linkqueue(q))
{
printf("队列为空!\n");
return false;
}
//队列非空出队
t=q->front;
q->front=q->front->next;
*D=q->front->data;
free(t);
return true;
}
void show_linkqueue(link_pqueue q) //输出链队列中的元素
{
linkQueue_pnode p;
for(p=q->front->next;p!=NULL;p=p->next)
{
printf("%d\t",p->data);
}
printf("\n");
}
#endif
测试文件 testLinkQueue.c
/*
用链式队列实现如下功能:
1. 用户从键盘输入整数,程序将其入队
2. 用户输入字母,程序将队头元素出队
在每一次出队和入队之后打印队列元素
*/
#include "linkQueue.h"
int main()
{
link_pqueue q; //定义指向顺序队列的指针
datatype x,data;
int ret;
//初始化
init_linkqueue(&q); //把Q的地址传进去
//入队
while(1)
{
printf("请输入一个整数(输入为字母时输出队头元素并打印队列元素):\n");
ret=scanf("%d",&data);
//清空输入缓冲区,
//不然输入字母进行出队时会因为缓冲区中的内容陷入死循环
while(getchar()!='\n');
//输入的是整数时,入队
if(ret==1)
{
if(in_linkqueue(data,q)) //入队成功,返回true,打印队列中的元素
show_linkqueue(q);
}
else //否则的话输入为字母出队
{
if(out_linkqueue(q,&x)) //出队成功
{
printf("队头元素为:%d\n",x);
show_linkqueue(q);
}
}
}
return 0;
}