0.目录

1.创建异常对象时的空指针问题

2.LinkList 中的数据元素删除

3.LinkList 中遍历操作与删除操作的混合使用

4.StaticLinkList 中数据元素删除时的效率问题

5.StaticLinkList 是否需要提供析构函数?

6.StLib 是否有必要增加多维数组类?

1.创建异常对象时的空指针问题

ISSUE 1——创建异常对象时的空指针问题:

改进Exception.cpp:
在init函数中改进strdup的赋值方法

void Exception::init(const char* message, const char* file, int line)
{/* message指向的字符串有可能在栈上,有可能在堆空间,还有可能在全局数据区* strdup()将字符串复制一份到堆空间中* file:发生异常的文件名* line:发生异常的行号* m_location的长度加2,一个给":",一个给"\0"*/m_message = (message ? strdup(message) : NULL);if( file != NULL ){char sl[16] = {0};itoa(line, sl, 10);m_location = static_cast<char*>(malloc(strlen(file) + strlen(sl) + 2));if( m_location != NULL ){m_location = strcpy(m_location, file);m_location = strcat(m_location, ":");m_location = strcat(m_location, sl);}}else{m_location = NULL;}
}

2.LinkList 中的数据元素删除

ISSUE 2——LinkList 中的数据元素删除:

单链表的实现没有考虑异常安全性!
改进LinkList.h中的remove函数和clear函数:

    bool remove(int i){bool ret = ((0 <= i) && (i < m_length));if( ret ){Node* current = position(i);Node* toDel = current->next;current->next = toDel->next;m_length--;destroy(toDel);}return ret;}void clear(){while ( m_header.next ){Node* toDel = m_header.next;m_header.next = toDel->next;m_length--;destroy(toDel);}}

3.LinkList 中遍历操作与删除操作的混合使用

ISSUE 3——LinkList 中遍历操作与删除操作的混合使用:

混合使用导致了m_current指向了已经被删除的结点,于是程序出错。
改进LinkList.h中的remove函数:

    bool remove(int i){bool ret = ((0 <= i) && (i < m_length));if( ret ){Node* current = position(i);Node* toDel = current->next;if( m_current == toDel ){m_current = toDel->next;}current->next = toDel->next;m_length--;destroy(toDel);}return ret;}

main.cpp测试

#include <iostream>
#include "LinkList.h"using namespace std;
using namespace StLib;int main()
{LinkList<int> list;for(int i=0; i<5; i++){list.insert(i);}for(list.move(0); !list.end(); list.next()){if( list.current() == 3 ){list.remove(list.find(list.current()));cout << list.current() << endl;}}for(int i=0; i<list.length(); i++){cout << list.get(i) << endl;}return 0;
}

运行结果为:

4
0
1
2
4

4.StaticLinkList 中数据元素删除时的效率问题

ISSUE 4——StaticLinkList 中数据元素删除时的效率问题:

改进LinkList.h中的destroy函数:

    void destroy(Node* pn){SNode* space = reinterpret_cast<SNode*>(m_space);SNode* psn = dynamic_cast<SNode*>(pn);for(int i=0; i<N; i++){if( psn == (space + i) ){m_used[i] = 0;psn->~SNode();break;}}}

main.cpp测试

#include <iostream>
#include "StaticLinkList.h"using namespace std;
using namespace StLib;int main()
{StaticLinkList<int, 10> list;for(int i=0; i<5; i++){list.insert(i);}list.remove(3);for(int i=0; i<list.length(); i++){cout << list.get(i) << endl;}return 0;
}

运行结果为:

0
1
2
4

5.StaticLinkList 是否需要提供析构函数?

ISSUE 5——StaticLinkList 是否需要提供析构函数?:

构造函数与析构函数不会发生多态,于是调用的是父类的析构函数!
改进StaticLinkList.h:
在子类StaticLinkList中实现析构函数:

    ~StaticLinkList(){this->clear();}

6.StLib 是否有必要增加多维数组类?

ISSUE 6——StLib 是否有必要增加多维数组类?:
多维数组的本质:数组的数组!

不需要定义多维数组!

使用DynamicArray创建多维数组:

#include <iostream>
#include "DynamicArray.h"using namespace std;
using namespace StLib;int main()
{DynamicArray< DynamicArray<int> > d;d.resize(3);for(int i=0; i<d.length(); i++){d[i].resize(i + 1);}for(int i=0; i<d.length(); i++){for(int j=0; j<d[i].length(); j++){d[i][j] = i * j;}}for(int i=0; i<d.length(); i++){for(int j=0; j<d[i].length(); j++){cout << d[i][j] << " ";}cout << endl;}return 0;
}

运行结果为:

0
0 1
0 2 4 

实践经验:

  • 是软件就有bug,因此需要不停的迭代升级,解决问题。库是一种特殊的软件产品,也会存在各种bug,也需要迭代升级,解决问题。

转载于:https://www.cnblogs.com/PyLearn/p/10123468.html

数据结构开发(7):典型问题分析(Bugfix)相关推荐

  1. 软件开发—钱多多—典型用户分析

    (1)姓名:陈晨 (2)年龄:20 (3)开销:每月1500-2000,每月有固定的兼职收入 (4)代表的用户在市场上的比例和重要性:该用户代表了绝大多数的大学生,是我们软件针对的典型用户 (5)使用 ...

  2. 信息系统集成专业技术 典型试题分析

    试题 37 以下关于数据仓库与数据库的叙述中, (38)是正确的. ( 38) A.数据仓库的数据高度结构化.复杂.适合操作计算:而数据库的数据结构比较简单,适合分析 B.数据仓库的数据是历史的.归档 ...

  3. 2022-2028年中国医疗器械行业战略运营模式与典型案例分析报告

    2022-2028年中国医疗器械行业战略运营模式与典型案例分析报告 mmmmmm&mmmmmm鸿**mmm晟&mmm信**mmm合&mmm研**mmmmmmm究&mmm ...

  4. 智慧园区主要功能及典型案例分析

    智慧园区主要功能及典型案例分析 智慧园区是指融合新一代信息与通信技术,具备迅速信息采集.高速信息传输.高度集中技术.智慧实时处理和服务提供能力,实现产业园区内及时.互动.整合的信息感知.传递和处理,以 ...

  5. 转:Android应用开发性能优化完全分析

    转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...

  6. 嵌入式开发的职业前景分析

    嵌入式开发的职业前景分析 http://developer.51cto.com  2010-01-06 09:53  佚名  互联网  我要评论(5) 嵌入式开发由于应用广泛而有着很大的发展潜力,但这 ...

  7. Android应用开发性能优化完全分析,移动应用开发课程报告

    如下是我工作中一个项目的一次经历(我将代码回退特意抓取的),出现这个问题的场景是一次压力测试导致整个系统卡顿,瞬间杀掉应用就OK了,究其原因最终查到是一个API的调运位置写错了方式,导致一直被狂调,当 ...

  8. BC26 OPEN开发之--LWM2M连接分析

    翔神教你学NB BC26 OPEN开发之--LWM2M连接分析 前言: NB-IOT商用已经2年多了,三大运营商都建设了大量的NB网络,尤其以中国电信最为积极,各个模组厂家推出了大量的NB模组,移远的 ...

  9. 何一娜:诺基亚软件开发工程师典型的一天

    英雄会是CSDN旗下针对国内IT技术领域专家展示和交流的平台.通过线下线上的互动形式,为CSDN社区专家提供更多学习.合作.宣传的机会.英雄会后续将在北上广深等国内一二线城市建立分会,各个分会后期将组 ...

  10. 上海汇珏EPON典型应用分析

    上海汇珏EPON典型应用分析 进入21世纪以来,铜作为一种面临枯竭的全球战略性资源,价格不断攀升,其应用于接入网络物理介质的成本已经让运营商难以承受.与之形成明显对比的是光纤的价格不断下降,随着光纤制 ...

最新文章

  1. java部署web service的方式
  2. JavaScript 二进制的 AST
  3. qt 连接mysql
  4. Linux Kernel中的同步机制的介绍
  5. Shadow Brokers扬言兜售新漏洞攻击工具
  6. 物联网商机迸发 LPWAN芯片现身 本文转自d1net(转载)
  7. 深入谷歌开源项目【1】 - Camer2 - 环境搭建和源码编译
  8. 阿里云物联网平台 > 设备接入 > 使用开放协议自主接入 > MQTT协议接入 >
  9. struts2 文件上传下载注解示例
  10. 【Golang】go程序性能测试教程+总结
  11. 反黑小技谋:IP地址的侦察和隐藏(转)
  12. 日常生活记账,如何将所有账目打印
  13. 计算机上网记录怎么清除,电脑浏览器上网记录怎么删除
  14. 英语学习详细笔记(十)形容词
  15. Solr中的日期/时间表示
  16. 互联网思维之简约思维
  17. 《策略投资》第1、2章读书分享
  18. 推荐一个在线ide的网站
  19. Java常用术语解释
  20. 【b302】侦探推理

热门文章

  1. 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
  2. kernel panic 和 kernel Oops
  3. 软件开发过程中的思维方式 -- 如何分析问题
  4. 人造肉真的上市了,这对养殖业会有什么影响?
  5. CRectTracker类的使用方法及其静态库下CRectTracker无法显示鼠标光标解决方案
  6. VS2008,GDIPlus初步
  7. html js坐标图,javascript – HTML5 Canvas沿着带坐标的路径拖动图像
  8. mysql 查询 汇总_Mysql-Sql查询汇总
  9. android确认密码代码,Android自定义View实现验证码or密码输入框
  10. hdfs中8031是什么端口号_在宿主机如何访问docker中hadoop的hdfs:ip:9000啊, 端口映射出来啊...