找回密码
 FreeOZ用户注册
查看: 1427|回复: 1
打印 上一主题 下一主题

[论坛技术] 程序员面试题查错分析的步骤(c/c++)

[复制链接]
跳转到指定楼层
1#
发表于 16-5-2009 16:21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

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

函数removeHead打算从一个单向链表中删除头元素:
  1. void removeHead(Node * head) {
  2.   delete head;          //...1
  3.   head = head->next;    //...2
  4. }
复制代码
分析的步骤有四步:
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()之类的手段来处理

评分

参与人数 1威望 +20 收起 理由
decisiontree + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

2#
发表于 16-5-2009 16:43:29 | 只看该作者

void removeHead(Node*& head)

传索引进来就行了。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 7-4-2025 16:21 , Processed in 0.021651 second(s), 21 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表