问答题 请设计算法求单链表中第一个值为x的元素的前驱和后继的存储位置。
【正确答案】(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的结点但是没有前驱或者后继。
   常见错误
   初学者最常犯的一类错误就是:他们通常以为自己编的程序已经完成了题目本身的要求,但不知道每个程序(或者函数)都是要被其他程序调用的,只有接口清楚、功能完备的函数才能被调用者正确使用,从而才是正确而有意义的。