假设用一个带头结点的循环单链表表示队列(称为循环链队列),该队列只设一个指向队尾结点的指针rear,不设头指针,设计初始化队列、入队和出队:
代码如下:
循环链队列定义:
typedef struc queuenode { DataType data; struct queuenode *next; } QueueNode; QueueNode *rear;
初始化空队列:
QueueNode * InitQueue (QueueNode *rear) { rear=(QueueNode *)malloc(sizeof(QueueNode)); rear->next=NULL; return rear; }
入队列:
1 void EnQueue(QueueNode *rear,DataType x) 2 { 3 QueueNode *s=(QueueNode *)malloc(sizeof(QueueNode)); 4 s->data=x; 5 s->next=rear->next; 6 rear->next=s; 7 rear=s; 8 }
出队列:
1 DataType DelQueue(QueueNode *rear) 2 { 3 QueueNode *s,*t; 4 DataType x; 5 if(rear->next == NULL){ 6 printf("Empty"); 7 exit(0); 8 } 9 else{ 10 s=rear->next; 11 rear->next=s->next; 12 t=s->next; 13 x=t->data; 14 free(s); 15 return x; 16 } 17 }
在定义和初始化很简单,但是入队列和出队列就是糊涂了,首先它是怎么实现循环链队列的;然后在入队列时,入队列代码第5~7行中,想不明白是怎么移动rear节点来实现把新结点插入到循环队列中,插入到循环链队列后,那么当出队列时,怎么可能实现队列的先进先出,rear已经移动了,怎么定位最先进去的结点,实现该结点出队列;
问题虽小,但是很伤脑细胞,求前辈指点。
你这个是错的
12 t=s->next;
13 x=t->data;
t根本没什么用 不过你这个却告诉了我循环队列的结构