/* 队列的链式存储结构也是通过由节点构成的单链表实现的,此时只能在 表首进行删除操作,在表尾进行插入操作。*/#include <stdio.h>#include <stdlib.h>typedef char ElemType;//链队中数据节点的类型QNode定义typedef struct qnode{ ElemType data; struct qnode *next;}QNode;//链队节点的类型LiQueue定义如下typedef struct{ QNode *front; QNode *rear;}LiQueue;void InitQueue(LiQueue *&q)//初始化{ q = (LiQueue *)malloc(sizeof(LiQueue)); q->front=q->rear=NULL;}void DestroyQueue(LiQueue *&q)//销毁{ QNode *p,*r; p=q->front; if(p!=NULL) { r=p->next; while(r!=NULL) { free(p); p=r; r=p->next; } } free(p); free(q);}bool QueueEmpty(LiQueue *q)//判断是否为空{ return (q->rear==NULL);}void enQueue(LiQueue *&q,ElemType e)//入队{ QNode * p; p = (QNode *)malloc(sizeof(QNode)); p->next=NULL; p->data=e; if(q->rear==NULL)//队为空的情况 q->front=q->rear=p; else { q->rear->next=p; q->rear=p; }}bool deQueue(LiQueue *&q,ElemType &e)//出队{ QNode *p; if(q->rear==NULL) return false; else//元素不为空时 { p=q->front; if(p->next==NULL)//当只有一个元素时 q->front=q->rear=NULL; else//有多个元素时 { q->front=p->next; } e=p->data; free(p); return true ; }}int main(){ ElemType e; LiQueue *q; PRintf("链队的基本运算如下:/n"); printf(" (1)初始化链队q/n"); InitQueue(q); printf(" (2)依次进链队元素a,b,c/n"); enQueue(q,'a'); enQueue(q,'b'); enQueue(q,'c'); printf(" (3)链队为%s/n",(QueueEmpty(q)?"空":"非空")); if (deQueue(q,e)==0) printf("/t提示:队空,不能出队/n"); else printf(" (4)出队一个元素%c/n",e); printf(" (5)依次进链队元素d,e,f/n"); enQueue(q,'d'); enQueue(q,'e'); enQueue(q,'f'); printf(" (6)出链队序列:"); while (!QueueEmpty(q)) { deQueue(q,e); printf("%c ",e); } printf("/n"); printf(" (7)释放链队/n"); DestroyQueue(q); return 0;}运行结果:
新闻热点
疑难解答