【正确答案】(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)。
【答案解析】如果需要,读者可以把算法改写,使函数返回前驱结点和后继结点的值。