【正确答案】(1)数据结构
采用带有头结点的单链表定义。
(2)思路
采用带有头结点的单链表定义。遍历有头结点的单链表,寻找元素值为x的结点的前驱和后继的地址。同样需要注意:第一个结点没有前驱,最后一个结点没有后继。
(3)算法
int SearchxPN_link(LinkList llist,DataType x,PNode*pPrev,PNode*
pNext){
/*算法结束后,*pPrev和*pNext中分别存放带头结点的单链表中第一个值为x的元素的前驱和后继结点的地址(当不存在时用NULL表示。当x在顺序表中出现时返回TRUE,否则返回FALSE*/
*pPrev=llist;
if((*pPrev)->link->info==x){ /*如果第一个元素值为x*/
*pNext=(*pPrev)->link->link;
*pPrev=NULL; /*第一个元素无前驱*/
return TRUE;
}
while((*pPrev)->link!=NULL){ /*寻找值为x的元素*/
if((*pPrev)->link->info==x){ /*找到值为x的元素*/
*pNext=(*pPrev)->link->link;
return TRUE:
}
*pPrev=(*pPrev)->link;
}
*pPrev=NULL; /*执行到此,说明单链表中不存在值为x的元素*/
*pNext=NULL;
return FALSE;
}
(4)代价分析
算法访问单链表中每个结点最多一次,时间代价为O(n)。
【答案解析】①函数SearchxPN_link的参数llist为什么可以是LinkList类型而不需要LinkList*类型?
②返回值有什么作用?不提供返回值可能出现什么问题?
答案:当pPrev和pNext返回Null时,调用本函数的程序无法判断是因为单链表中没有值为x的结点,还是因为有值为x的结点但是没有前驱或者后继。
常见错误
初学者最常犯的一类错误就是:他们通常以为自己编的程序已经完成了题目本身的要求,但不知道每个程序(或者函数)都是要被其他程序调用的,只有接口清楚、功能完备的函数才能被调用者正确使用,从而才是正确而有意义的。