用只有尾节点指针的循环单链表作为队列存储结构
采用一个不带头节点只有一个尾节点指针 rear 的循环单链表存储队列,设计队列的初始化、进队和出队算法。
(其中每个结点的类型为LinkNode单链表结点类型,对应链队的4要素如下:
- 队空的条件:rear==NULL
- 队满的条件:不考虑
- 元素e的进队操作:新建一个结点存放元素e (由p指向它),将结点p插入作为尾结点,让rear指向这个新的尾结点
- 出队操作:取出队头结点(rear所指结点的后继结点)的data值并将其删除 )

void initQueue(LinkNode * & rear) //初始化算法 { rear=NULL; } void enQueue(LInkNode * & rear, ElemType e) //进队算法 { LinkNode * p; p=(LinkNode * )malloc(sizeof(LinkNode) ); //创建新节点 p->data = e; if ( rear==NULL){ //原链队为空 p->next=p; //改为循环链表 rear=p; //rear 指向新节点 } else{ p->next=rear->next; //原链队不空,将p结点插到rear之后 rear->next=p; //改为循环链表 rear=p; //rear指向新节点 } } bool deQueue(LinkNode * &rear, ElemType &e) { //出队 LinkNode * t; if(rear==NULL) //队空 return false; else if (rear -> next==rear) //原队中只有一个节点 { e=rear->data; free(rear); rear=NULL; //让rear为空链表 } else{ //原队中有两个及以上结点 t=rear->next; //t指向头结点 e=t->data; rear->next=t->next; //删除t结点 free(t); //释放空间 } return true; } bool queueEmpty(LinkNode * rear) //判断队空 { return(rear==NULL); }
浙公网安备 33010602011771号