key 发表于 16-5-2009 17:21:49

程序员面试题查错分析的步骤(c/c++)

请从下面的程序中查错并改正:

函数removeHead打算从一个单向链表中删除头元素:void removeHead(Node * head) {
delete head;          //...1
head = head->next;    //...2
}分析的步骤有四步:
1. 查输入
2. 查运行
3. 查返回
4. 查边界

第一步:
单向链接,只需输入一个表头指针即可获得整个链接的操作,所以第一步没有发现问题。
第二步:
Line 1没有发现问题,delete head没有错
Line 2有问题,因为head已经被delete掉,head->next是无效指针,需要改成:
Node * pTemp = head->next;
delete head;
head = pTemp;
第三步:
查返回。先查显式返回,本函数没有返回;再查隐式返回,本函数要处理链接头,需要返回头指针,显然
head = pTemp
不能返回这个指针,于是改成:
void removeHead(Node ** head)
{
Node * pTemp = (*head)->next;
delete (*head);
*head = pTemp;
}
第四步:
代入一个元素和0个元素的链接,看看是否能正常运行。在代入0个元素时,*head为NULL,执行出错,需要改成:
if(*head == NULL)
return;
Node * pTemp = (*head)->next;
...

习惯上,如果你要对一个指针解引用,需要先查一下指针的有效性,所以最后改成:
if(head==NULL || *head==NULL)
return NULL;
...

不过head==NULL应该是编程错误,理论上应该用assert()之类的手段来处理

justinli79 发表于 16-5-2009 17:43:29


void removeHead(Node*& head)

传索引进来就行了。
页: [1]
查看完整版本: 程序员面试题查错分析的步骤(c/c++)