问题 填空题

【说明】
本题给出四个函数,它们的功能分别是:
1.int push(PNODE*top,int e)是进栈函数,形参top是栈顶指针的指针,形参e是入栈元素。
2.int pop(PNODE*top,int*e)是出栈函数,形参top是栈顶指针的指针,形参e作为返回出栈元素使用。
3.int enQueue(PNODE*tail,int e)是入队函数,形参tail是队尾指针的指针,形参e是入队元素。
4.int deQueue(PNODE*tail,int*e)是出队函数,形参tail是队尾指针的指针,形参e作为返回出队元素使用。
以上四个函数中,返回值为。表示操作成功,返回值为-1表示操作失败。
栈是用链表实现的;队是用带有辅助结点(头结点)的单向循环链表实现的。两种链表的结点类型均为:
typedef struct node
int value;
struct node * next;
NODE, * PNODE;
【函数1】
int push(PNOOE * top,int e)

PNODE p = (PNODE) malloc (sizeof (NODE));
if (! p) return-1;
p->value=e;
(1) ;.
*top=p;
return 0;

【函数2】
int pop (PNODE * top,int * e)

PNODE p = * top;
if(p == NULL) return-1;
* e = p->value;
  (2) ;
free(p);
return 0;

【函数3】
int enQueue (PNODE * tail,int e)
PNODE p,t;
t= *tail;
p = (PNODE) malloc(sizeof(NODE));
if(!p) return-1;
p->value=e;
p->next=t->next;
(3) ;
* tail = p;
return 0;

【函数4】
int deQueue(PNODE * tail,int * e)
PNODE p,q;
if(( * tail)->next == * tail) return-1;
p= (* tail)->next;
q = p ->next;
  * e =q ->value;
(4) =q->next;
if(,tail==q) (5) ;
free(q);
return 0;

答案

参考答案:p->next=*top  (2)*top=p->next或* top=(*top)->next
(3)t->next=p或(*tail)->next=p
(4)p->next或(*tail)->next->next
(5)*tail=p或*tail=(*tail)->next

解析: (1)插入结点p后,p应当指向插入前头结点,所以填入p ->next=*top。(2)出栈后,头指针应指向它的下一结点,所以填入 *top=p->next或*top=(*top)->next。(3)入队时,需要将结点插入队尾,所以应当填入(*tail)->next=p或t->next=p(t也指向尾结点)。(4)出队时,需要删除队头结点,通过(*tail)->next可以得到对队头结点的引用。(4)处是正常删除队头结点的情况,空格处应填入头结点指向下一结点的指针,即p->next或(*tail)->next->next。(5)处是需要考虑的特殊情况,即队列中最后一个元素出队后,要更新队尾指针,即填入*tail=p或*tail=(*tail)->next。

单项选择题
问答题