试题四
阅读以下说明和C函数,填补函数中的空缺,将解答填入答题纸的对应栏内。
【说明】
简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简单队列。
函数enqueue(queue*q,KeyType new_elem)的功能是将元素new_elem加入队尾。
函数Dnqueue(queue*q,KeyType *elem)的功能使将非空队列的队头元素出队(从列队中删除),并通过参数带回刚出队的元素。
用单向循环链表表示的队列如图4-1所示
(1) Q→rear→next=p
(2) Q→rear=p
(3) Q→rear→next
(4) p→next
(5) Q→rear==p 或 Q→rear→next==p→next 或 Q→size==1
本题考察 C 语言指针与链表的知识, 为入队列和删除队列问题。
对于入队列, 那么当队列 Q 不为空时, P 的队尾 t 要指向原 Q 的队尾指向的元素, 即:P->next=Q->rear->next, Q 的队尾要指向 p, 即: Q→rear→next=p。 当队列 Q 为空时, 插入 p 元素, 则 p 的队尾指向 p 自身, 即: p→next=p, 且整个队列 Q 的队尾也是 p, 即: Q→rear=p。
对于队列删除元素 p, 先判断 Q 是否为空, 为空队列则返回 ERROR;
If(0==q->size) //是空队列Return ERROR;
另 p 指向队头元素结点, 队头元素结点可用 Q→rear→next 表示。 此时, p 转化为头结点,p 出列, 则需要 Q 的队尾指向 p 的下一个元素, 因此第 4 空填: p→next。
最后, 判断被删除的队头结点是否是队列中的唯一结点, 可采用: Q→rear==p 或 Q→rear→next==p→next 或 Q→size==1 等表示方法。