问答题 请对单链表写出求线性表中下标为i的(第i+1个)元素的前驱和后继的算法。
【正确答案】(1)数据结构
   采用带有头结点的单链表定义。
   (2)思路
   采用带有头结点的单链表。遍历单链表,同时计数。为方便操作,令指针指向下标为i的结点的前驱结点。同样需要注意:第一个结点没有前驱,最后一个结点没有后继。
   (3)算法
   int SearchPN_link(LinkList llist,int i,PNode*pPrev,PNode*pNext){
   /*算法结束后,*pPrev和*pNext中分别存放带头结点的单链表中下标为i的元素的前驱和后继结点的地址(当不存在时用NULL表示。当下标值合法时返回TRUE,否
   则返回FALSE*/
       int count=0;
       if(i<0){    /*下标越界*/
           *pPrev=NULL;
           *pNext=NULL;
           return FALSE;
       }
       *pPrev=llist;
       while(count<i){
         if(*pPrev==NULL){    /*下标越界*/
           *pNext=NULL;
           return FALSE;
         }
         count++;
         *pPrev=(*pPrev)->link;
       }    /*寻找下标为i的元素的前驱结点的地址*/
       if((*pPrev)->link==NULL){  /*下标越界*/
         *pPrev=NULL;
         *pNext=NULL;
         return FALSE;
       }
       *pNext=(*pPrev)->link->link;  /*找到后继的位置*/
       if(i==0)*pPrev=NULL;    /*第一个结点没有前驱*/
       return TRUE;
   }
   (4)代价分析
   算法访问单链表中每个结点最多一次,时间代价不超过O(n)。
【答案解析】如果需要,读者可以把算法改写,使函数返回前驱结点和后继结点的值。