队列的实现上我们更愿意使用链式存储,这点与栈有所不同。
链队列的结构为:
//链队列的存储结构为:
typedef struct Node //节点的结构
{
int data;
struct Node *next;
}QNode;
typedef struct//链队列的结构
{
QNOde *front,*rear; //队头,队尾指针
}Linkqueue;
链队列的初始化:
void initlinkqueue(Linkqueue *q)
{
q->front=q->rear=(QNode *)malloc(sizeof(QNode));
if(!q->front)
exit(0);
q->front->next=NULL;
}
入队列操作
//入队列操作
void insertqueue(Linkqueue *q,int e)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
if(!p)
{
exit(0);
}
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
出队列操作:
void dequeue(Linkqueue *q,int *e)
{
QNode *p;
if(q->front==q->rear)
{
exit(0);
}
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p) //如果队列中只有一个元素,此时p就是玮指针,删掉这个元素之后需要将尾指针指向头节点;
q->rear=q->front;
free(p);
}
销毁一个队列//销毁一个队列
void destoryqueue(Linkqueue *q)
{
while(q->front)
{
q->rear=q->front->next;
free(q->front);
q->front=q->rear;
}
}
实现输入输出功能:
//链队列的存储结构为:
typedef struct Node //节点的结构
{
int data;
struct Node *next;
}QNode;
typedef struct//链队列的结构
{
QNode *front,*rear; //队头,队尾指针
}Linkqueue;
//链队列的初始化
void initlinkqueue(Linkqueue *q)
{
q->front=q->rear=(QNode *)malloc(sizeof(QNode));
if(!q->front)
exit(0);
q->front->next=NULL;
}
//入队列操作
void insertqueue(Linkqueue *q,int e)
{
QNode *p;
p=(QNode *)malloc(sizeof(QNode));
if(!p)
{
exit(0);
}
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}
//出队列操作:将队列中的第一个元素移出,队头指针不发生改变,改变头节点的next指针即可
void dequeue(Linkqueue *q,int *e)
{
QNode *p;
if(q->front==q->rear)
{
exit(0);
}
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p) //如果队列中只有一个元素,删删掉这个元素之后需要将尾指针指向头节点;
q->rear=q->front;
free(p);
}
//销毁一个队列
void destoryqueue(Linkqueue *q)
{
while(q->front)
{
q->rear=q->front->next;
free(q->front);
q->front=q->rear;
}
}
int main()
{
Linkqueue q;
initlinkqueue(&q);
int x,e;
scanf("%d",&x);
while(x!=10)
{
insertqueue(&q,x);
scanf("%d",&x);
dequeue(&q,&e);
printf("%d\n",e);
}
destoryqueue(&q);
return 0;
}