操作实现的文件:非LQNode.h(包含初始化、非空否、入队列、出队列、输出整个队列、取队头元素)
#include<stdio.h>
#include<malloc.h>
//定义节点的结构体
typedef struct qnode{
DataType data;
struct qnode *next;
}LQNode;
//定义队尾指针的结构体
typedef struct{
//队尾指针
LQNode *rear;
}LQueue;
//初始化链式队列Q
void QueueInitiate(LQueue *Q){
//申请头节点
LQNode *head = (LQNode *)malloc(sizeof(LQNode));
//定义初始队尾指针指向头节点
Q->rear = head;
//将队尾指针指向本身
Q->rear->next=Q->rear;
}
//非空否(判断链式队列Q非空否)(当尾指针的指向为本身时,即为链式队列为空或)
int QueueNotEmpty(LQueue *Q){
//判断链式队列Q是否为空
if(Q->rear->next==Q->rear){
//若为空,返回0
return 0;
}
else{
//若不为空返回1
return 1;
}
}
//入队列(将x的值从队尾插入到链式队列Q)
/*先申请一个新节点
再将值赋予给此节点
将新节点指针域指向头节点
将尾指针指向的节点的指针域指向新节点
最后将尾指针指向新节点 */
int QueueAppend(LQueue *Q,DataType x){
LQNode *p;
//申请新节点
p = (LQNode *)malloc(sizeof(LQNode));
//将x的值赋值给p节点的数据域
p->data = x;
//将p指向的指针域指向头节点
p->next = Q->rear->next;
//将头节点指向p
Q->rear->next = p;
//将队尾指针指向p
Q->rear = p;
//入队列成功,返回1
return 1;
}
//出队列(删除队列Q的队头元素并赋值给d)
/*先判断队列是否为空
保存带删除的节点
将要删除的节点的值赋值给d
删除前先判断是否只有一个元素
若只有一个元素:先将尾指针指向头节点 ,再将要删除的头节点删除
若不止一个元素:直接将头节点指向要删除节点的后面一个节点
最后释放节点的动态空间
*/
int QueueDelete(LQueue *Q,DataType *d){
LQNode *p;
//判断链式队列Q是否为空
if(Q->rear->next==Q->rear){
printf("队列已空无数据元素出列!\n");
//若为空,则返回0
return 0;
}
//若不为空
else{
//保存带删除节点
p = Q->rear->next->next;
//将队头的元素值赋值给d
*d = Q->rear->next->next->data;
//判断是否只有一个元素的节点
if(p == Q->rear){
//尾指针指向头节点
Q->rear = Q->rear->next;
//将要删除的头节点删除
Q->rear->next=p->next;
}else{
Q->rear->next->next=p->next;
}
//释放空间
free(p);
return 1;
}
}
//输出全部元素
/*先判断队列是否为空
若为空,输出队列为空
否则,将p指针指向第一个元素,利用while语句循环输出整个链式队列*/
void print(LQueue *Q){
//判断链式队列Q是否为空
if(Q->rear->next==Q->rear){
printf("队列已空!\n");
}
//若不为空
else{
//头个元素地址
LQNode *q=Q->rear->next->next;
printf("队列:[");
//循环整个链表,当为尾指针指向头节点时,循环结束。
while(q!=Q->rear->next){
//打印每个节点的值
printf(" %d ",q->data);
//向后移动
q=q->next;
}
printf("]\n\n");
}
}
//取对头数据元素(将队头的元素赋值给d带回输出)
/*
先判断队列是否为空
再直接将链式队列的第一个元素的值赋值给d带回输出*/
int QueueGet(LQueue *Q,DataType *d){
//判断链式队列Q是否为空
if(Q->rear->next==Q->rear){
printf("队列已空无数据元素出队列!\n");
//若为空,则返回0
return 0;
}
//否则
else{
//将队头元素值赋值给d
*d = Q->rear->next->next->data;
//取得成功返回1
return 1;
}
}
测试文件的主函数
#include<stdio.h>
typedef int DataType;
#include "非LQNode.h"
int main(void){
LQueue Q;
int x,y;
//初始化队列链表
QueueInitiate(&Q);
//for循环语句插入链表
for(int i=0;i<10;i++){
QueueAppend(&Q,i+1);
}
//输出链表队列值
print(&Q);
//取出一个元素
QueueDelete(&Q,&x);
printf("出队列的值为:%d\n",x);
printf("\n");
//输出取出后的链表队列值
print(&Q);
//取出链表队列值的第一个元素
printf("取出队列后队列的第一个元素的值:");
QueueGet(&Q,&y);
printf("队头的值为:%d\n",y);
printf("\n");
print(&Q);
}
运行结果