试题四(共15分)阅读以下说明和C函数,填补函数中的空缺,将解答填入答题纸的对应栏内。【说明】简单队列是符合先进先出规则的数据结构,下面用不含有头结点的单向循环链表表示简单队列。函数enqueue(queue*q,KeyTypenew_elem)的功能是将元素new_elem加入队尾。函数Dnqueue(queue*q,KeyType*elem)的功能使将非空队列的队头元素出队(从队列中删除),并通过参数带回刚出队的元素。用单向循环链表表示的队列如图4-1所示。
图4-1单向循环链表表示的队列示意图队列及链表结点等相关类型定义如下:enum{errOr,OK};typedefintKeyType;typedefstructqNode﹛KeyTypedata;StructqNode*next;﹜qNode,*Linkqueue;Typedefstruct﹛intsize;Link:queuerear;}queue;【C函数】intenqueue(queue*q,KeyTypenew_elem)﹛//元素new_elem入队列qNode*p;P=(qNode*)malloc(sizeof(qNode));if(!p)returnerrOr;P->data=new_elem;if(q->rear)﹛P->next=q->rear->next;();﹜elseP->next=p;﹙﹚;q->size++;returnOK;﹜intDequeue(queue*q,KeyType*elem)﹛//出队列qNode*p;if(0==q->size)//是空队列returnerrOr;P=();//令p指向队头元素结点*elem=p->data;q->rear->next=();//将队列元素结点从链表中去除if(())//被删除的队头结点是队列中唯一结点q->rear=NULL//变成空队列free(p);q->size--;returnOK;﹜
(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 等表示方法。