标签:线性结构之链队列实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE,*PNODE;
typedef struct queue
{
PNODE front;
PNODE rear;
}QUEUE;
void initQueue(QUEUE *);
void enQueue(QUEUE *,int);
void deQueue(QUEUE *,int *val);
/*
不同于其他队列,我们这边是头指针指向头结点,尾指针指向的是尾结点。这都是由于操作上的方便,队列其实随意性比较大
要么是头指向第一个元素,尾指向最后一个元素的下一个元素,总之情况有你自己掌握,你觉得方便就好。
*/
void main()
{
//初始化队列
QUEUE queue;
initQueue(&queue);
//入队
enQueue(&queue,2);
enQueue(&queue,3);
enQueue(&queue,4);
enQueue(&queue,5);
//出队
int val;
deQueue(&queue,&val);
deQueue(&queue,&val);
deQueue(&queue,&val);
deQueue(&queue,&val);
}
void initQueue(QUEUE *queue)
{
//这里我们指向头结点。
queue->front=queue->rear=(PNODE)malloc(sizeof(NODE));
if(queue->front==NULL)
{
printf("内存分配失败");
exit(-1);
}
}
void enQueue(QUEUE *queue,int val)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE));
if(pnew==NULL)
{
printf("内存分配失败");
exit(-1);
}
//造出的结点初始化
pnew->next=NULL;
pnew->data=val;
//开始入队,头指针不动,尾指针动
/* pnew->next=queue->rear->next; 这句话不对,这是插入方式,这里应该是追加即可。*/
queue->rear->next=pnew;
queue->rear=pnew;
}
void deQueue(QUEUE *queue,int *val)
{
//出队较为麻烦,需要考虑是不是最后一个结点,如果不是最后一个结点,出队,没有关系。只需要将尾结点指向前一个结点
//如果是最后一个结点出队的话,还需要将尾指针指向头结点。(注意头结点不是首节点)。
//首先要判断当前队列是否为空,当前队列为空,则没有办法出队列。
PNODE pnew;
if(queue->front==queue->rear)
{
printf("当前队列为空,无法出队");
return;
}
pnew=queue->front->next;
*val=pnew->data;
printf("%d ",*val);
if(pnew==queue->rear)
{
queue->front->next=queue->front->next->next;
queue->rear=queue->front;
}else
queue->front->next=queue->front->next->next;//也可以把这句代码和if里面那句代码提到printf后面,为一句代码,但是这样来的话,就是可读性差点
free(pnew);
printf("\n");
}
//也可以把queue->rear=queue->front;和if里面那句代码提到printf后面,为一句代码,但是这样来的话,就是可读性差点
//到底是代码可读性需要高点,还是代码更加简洁,减少冗余,自己去衡量吧!我就喜欢这样,逻辑性很好,只要不影响效率。
本文出自 “简答生活” 博客,转载请与作者联系!
标签:线性结构之链队列实现
原文地址:http://1464490021.blog.51cto.com/4467028/1864909