#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
using namespace std;
typedef struct QNode //结点结构
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct {
QueuePtr front,rear; //头尾指针
}LinkQueue; //队列的链式结构
void InitQueue(LinkQueue *Q) //初始化队列链表
{
//指针自身=(指针类型*)malloc(sizeof(指针类型)*数据数量)
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
//if(!Q->front)
// exit(OVERFLOW);
Q->front->next=NULL;
}
void EnQueue(LinkQueue *Q,int e)
{
//在链表尾部新建结点插入
QueuePtr s=(QueuePtr)malloc(sizeof(QNode)); //建立一个结点
s->data=e;
cout<<"元素"<<e<<"进入队列\n";
s->next=NULL; //给新节点分配一下数据
Q->rear->next=s; //尾部的下一个结点就是新插入的 实现了入队
Q->rear=s; //s成为了新的尾部结点
}
void DeQueue(LinkQueue *Q)
{
QueuePtr p; //要被删除的结点p
//先判断空队列的情况
if(Q->front==Q->rear)
{
cout<<"抱歉,队列为空不能够再次进行删除操作!\n";
return ;
}
p=Q->front->next;
cout<<"元素:"<<p->data<<"已经被队列删除"<<endl;
Q->front->next=p->next; //删除p 头结点的下一位是p的下一位 所以p就被删除了
if(Q->rear==p) //如果队头就是队尾 删除后两者归一
Q->rear=Q->front;
free(p); //删除掉后就可以清除内存了
}
void QueueTraverse(LinkQueue Q)
{
QueuePtr p;
p=Q.front->next; //从第一位开始 front的下一位才是第一位
cout<<"从队首开始展示队列中的元素:\n" ;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
printf("\n");
}
int main()
{
LinkQueue Q;
InitQueue(&Q);
EnQueue(&Q,1);
EnQueue(&Q,2);
EnQueue(&Q,3);
DeQueue(&Q);
EnQueue(&Q,4);
QueueTraverse(Q);
}
链队列(入队、出队、展示队列)
最新推荐文章于 2024-10-17 09:56:08 发布