填空题
函数insertdl1和insertdl2分别是用类程序设计语言和C++语言描述的算法。其功能是在d1指向的带表头结点双向循环链表中,将数据域值为x的新结点插在数据域值为ai的结点之前,并返回插入位置i值,如果表中数据域值为ai的结点不存在,则返回值i为0。链表结占加图2所示,结点类型为dnode,数据域data为整型,前、后链域分别为prior和next。
请选择一种算法描述形式,在算法中的空格处填入正确内容并回答问题(1、2任选一题,只能选做一题),
1.类程序设计语言描述形式符号&开头的参数为输入输出参数。d1指向链表结点的数据域用d1^.data表示,前、后链域分别用d1^.prior、d1^.next表示。算法中,nil为空指针。
Algorithm insertd11(&d1,ai,x)
//insertd11函数的类型为整型//
//d1为指向双向循环链表的头指针//
//ai,x为双向循环链表结点数据域类型//
//i为整型//
//p,s为辅助指针//
{
p?d1;
i?0;
while((13))and(p^.next.data<>ai)
{ p?p^.next;
1(14) 2
}
if p^.next^.data=ai then
{new(s);
3(15) 4;
s^.next?p^.next;
5(16) 6;
s^.prior?p;
p^.next?s;
i?i+1
}
else i?0;
return (i)
}
回答以下问题:
设dl指向的双向循环链表为非空表,链表第一个结点数据域在算法描述时应表示为 7(17) 8
设d1=(18,45,36,27),ai=36,x=90,上述算法执行后,d1=( (18) )。
上述算法中若数据域值为ai的结点存在,则指针s指向的结点位于指针P指向的结点
9(19) 10(之前/之后)。
②C++语言描述形式
符号&开头的参数为引用参数。dl指向链表结点数据域用dl->data表示,前、后链域分别用d1->prior、d1->next表示。算法中,NULL为空指针。
Algorithm insertdl2(&dl,ai,x)
//insertdl2函数的类型为整型
//dl为指向双向循环链表的头指针
//ai,x为双向循环链表结点数据域类型
//i为整型
//p,s为辅助指针
{
p=dl
i=0; 、
while((20) &&p->next->data!=ai){
p=p->next;
11(21) 12;
}
if(p->next->data==ai){
s=new dnode;
13(22) 14;
s->next=p->next:
15(23) 16;
s->prior=p;
p->next=s;
++i;
}
else i=0;
return i;
}
回答以下问题:
设d1指向的双向循环链表为非空表,链表第一个结点数据域在算法描述时应表示为 17(24) 18。
设d1=(18,45,36,27),ai=36,x=90,上述算法执行后,d1=( 19(25) 20)。
上述算法中若数据域值为ai的结点存在,则指针s指向的结点位于指针P指向的结点
21(26) 22(之前/之后)。
【正确答案】
1、①(13)P^.next<>dl
(14)i?i+1
(15)S^.data?x
(16)P^.next^.prior?s
(17)dl^.next^.data
(18)dl=(18,45,90,36,27)
(19)之后
②(20)Pànext!=dl
(21)++i
(22)sàdata=X
(23)Pànextàprior=S
(24)dlànextàdata
(25)dl=(18,45,90,36,27)
(26)之后
【答案解析】