题目:删除单向链表的头元素的函数。请找出其中的程序漏洞并加以纠正
分析:在C语言里,输入参数都是以值传递的方式进入子函数的,换句话说,子函数所使用的
是输入参数的一个局部副本,对这个局部副本的修改不可能在该函数以外的地方被“看到”。
但在C语言里,变量不能以引用传递方式进入子函数,当可以采用把一个指向变量的指针作为
子函数输入参数的办法来绕开这个限制,就这道面试题来说,需要把一个指向head 指针的指针传递给
RemoveHead函数做输入参数。
//正确:
void RemoveHead(node *head)
{
node *temp=head->next;
free(head);
head=temp;
}
分析:在C语言里,输入参数都是以值传递的方式进入子函数的,换句话说,子函数所使用的
是输入参数的一个局部副本,对这个局部副本的修改不可能在该函数以外的地方被“看到”。
但在C语言里,变量不能以引用传递方式进入子函数,当可以采用把一个指向变量的指针作为
子函数输入参数的办法来绕开这个限制,就这道面试题来说,需要把一个指向head 指针的指针传递给
RemoveHead函数做输入参数。
//正确:
void RemoveHead(node **head)
{
node *temp;
if(!(*head))
{
temp=(*head)->next;
free(*head);
*head=temp;
}
}
另附一常考类型
题目:给定一个单向链表,请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素。实现这个算法,
//并为可能出现的特例情况安排好处理措施。“倒数第m个元素”是这样规定的:当m = 0时,链表的最后一个元素将被返回。
算法:
element *FindMToLastElement(element *head,int m)
{
element *current,*mBehind;
int i;
current=head;
for(i=0;i<m;i++)
{
if(current->next)
current=current->next;
else
return NULL;
}
mBehind=head;
while(current->next)
{
current=current->next;
mBehind=mBehind->next;
}
return mBehind;
}