队列的特点是,先进先出,与栈不同,在前面介绍过顺序栈,链栈的结构与线性表相同,只是限制了元素的操作位置。
队列的一般形式如图所示,队头删除元素,队尾添加元素。这里主要介绍链队列,也就是链式存储结构的队列。
这是链队列的一般形式,队列头部有空节点,而队头元素在空节点之后,队尾节点在链表的最后面。我们以实例作为学习对象。
#includestdio.h#includestdlib.htypedefstructQNode{intage;//dataintheight;//datadoubleweight;//datastructQNode*next;}QNode;typedefstruct{QNode*front;//队头指针QNode*rear;//队尾指针}LinkQueue;//队列初始化intinitQueue(LinkQueue*q){q-front=q-rear=(QNode*)malloc(sizeof(QNode));//构造空队列,头节点if(!q-front)exit(-1);q-front-next=NULL;return1;}//队列销毁intdestroyQueue(LinkQueue*q){while(q-front){//从队列的头部往后逐个释放数据元素q-rear=q-front-next;free(q-front);q-front=q-rear;}return1;}//队列判空intemptyQueue(LinkQueue*q){if(q-front==q-rear)return1;elsereturn0;}//队列长度intlengthQueue(LinkQueue*q){if(emptyQueue(q))return0;intn=0;QNode*p=q-front-next;while(p){n++;p=p-next;}returnn;}//队列头部元素intgetHead(LinkQueue*q,QNode*e){if(emptyQueue(q))return0;e=q-front-next;e-next=NULL;return1;}//生成新节点QNodeQNode*newQNode(){QNode*p=(QNode*)malloc(sizeof(QNode));//为队列生成新节点if(!p)exit(-1);printf("inputvalueforQNode(age,height,weight):");scanf("%d%d%lf",p-age,p-height,p-weight);p-next=NULL;returnp;}//插入元素,尾部入队列intinsertQueue(LinkQueue*q,QNode*e){q-rear-next=e;q-rear=e;return1;}//QNode复制voidcopyQNode(QNode*e,QNode*p){e-age=p-age;e-height=p-height;e-weight=p-weight;e-next=NULL;}//删除元素,头部出队列intdeleteQueue(LinkQueue*q,QNode*e){if(emptyQueue(q))return0;QNode*p=q-front-next;copyQNode(e,p);q-front-next=p-next;if(q-rear==p)q-rear=q-front;//删除除头节点外的最后一个节点free(p);return1;}//读QNode节点voiddisplayQNode(QNode*p){printf("age=%d,height=%d,weight=%lf\n",p-age,p-height,p-weight);}//遍历队列元素intdisplayQueue(LinkQueue*q){if(emptyQueue(q)){printf("ThequeueisNULL!\n");return0;}QNode*p=q-front-next;while(p){displayQNode(p);p=p-next;}return1;}intmain(){LinkQueueq;QNodep;initQueue(q);insertQueue(q,newQNode());insertQueue(q,newQNode());displayQueue(q);printf("\n");deleteQueue(q,p);displayQueue(q);displayQNode(p);printf("\n");destroyQueue(q);return0;}好坏生长