代码如下:

#include <iostream>
#include <string>
using namespace std;typedef struct
{char *ch;int length;
}String;bool initString(String &s)
{s.ch = nullptr;s.length = 0;return true;
}bool strAssign(String &s, const char *ch)
{int len = strlen(ch);s.ch = new char[len + 1];if (!s.ch) return false;for (int i = 0; i < len; i++){s.ch[i] = ch[i];}s.ch[len] = '\0';s.length = len;return true;
}bool strCopy(String &s, String t)
{if (!t.ch) return false;if (s.ch) delete[] s.ch;int len = strlen(t.ch);s.ch = new char[len + 1];for (int i = 0; i < len; i++){s.ch[i] = t.ch[i];}s.ch[len] = '\0';s.length = len;return true;
}bool strEmpty(String s)
{if (s.ch && s.length == 0) return true;return false;
}bool strCompare(String s, String ss)
{if (!s.ch) return false;if (!ss.ch) return false;for (int i = 0; i < s.length && i < ss.length; i++){if (s.ch[i] != ss.ch[i]){return s.ch[i] - ss.ch[i];}}return s.length - ss.length;
}int strLength(String s)
{return s.length;
}bool clearString(String &s)
{s.length = 0;return true;
}bool concatString(String &s, String s1, String s2)
{if (s.ch) delete[] s.ch;int len1 = s1.length;int len2 = s2.length;int len3 = len1 + len2;s.ch = new char[len3 + 1];for (int i = 0; i < len1; i++){s.ch[i] = s1.ch[i];}for (int i = len1; i < len3; i++){s.ch[i] = s2.ch[i];}s.ch[len3] = '\0';s.length = len3;return true;
}bool subString(String &sub, String s, int pos, int len)
{if (!s.ch) return false;if (pos <1 || pos > s.length || len < 0 || len > s.length - pos + 1) return false;if (sub.ch) delete[] sub.ch;if (!len){sub.ch = nullptr;sub.length = 0;}else{sub.ch = new char[len + 1];for (int i = 0; i < len; i++){sub.ch[i] = s.ch[pos - 1 + i];}sub.ch[len] = '\0';sub.length = len;}return true;
}int indexString(String s, String ss, int pos)
{if (pos > 0){int n = s.length;int m = ss.length;int i = pos;String sub;initString(sub);while (i <= n - m + 1){subString(sub, s, i, m);if (strCompare(sub, ss) != 0) ++i;else return i;}}return false;
}bool strInsert(String &s, int pos, String t)
{if (t.ch && s.ch){int len1 = t.length;int len2 = s.length;int len3 = len1 + len2;char *p = new char[len3 + 1];if (!p) return false;for (int i = 0; i < pos - 1 && i < len3; i++){p[i] = s.ch[i];}for (int i = 0; i < len1 && pos - 1 + i; i++){p[pos - 1 + i] = t.ch[i];}for (int i = 0; i < len3 - pos + 1 && pos + len1 - 1 + i < len3; i++)//pos + len1 - 1 + i < len3,防止数组越界,导致无法成功释放内存(数组越界以后,delete无法成功释放内存){p[pos + len1 - 1 + i] = s.ch[pos - 1 + i];}p[len3] = '\0';delete[] s.ch;s.ch = nullptr;s.ch = p;s.length = len3;return true;}return false;
}bool strDelete(String &s, int pos, int len)
{if (pos >= s.length) return false;if (pos + len >= s.length){s.length = len;s.ch[len] = '\0';}else{int start = pos + len - 1;while (start <= s.length){s.ch[pos - 1] = s.ch[start];++start;++pos;}s.length -= len;}return  true;
}bool replaceString(String &s, String t, String v)
{int len_s = s.length;int len_t = t.length;int len_v = v.length;int j = 1;String sub;initString(sub);while (len_s - j + 1 >= len_t){subString(sub, s, j, len_t);if (strCompare(sub, t) == 0){strDelete(s, j, len_t);strInsert(s, j, v);j += len_v;s.length = s.length + len_v - len_t;len_s = s.length;}else{j++;}}return true;
}bool destroyString(String &s)
{if (s.ch){delete[]s.ch;s.length = 0;}return true;
}int main()
{const char *ch = "dasfas";String s1;const char *ch1 = "dadas";String s2;const char *ch2 = "as";String s3;strAssign(s3, ch2);strAssign(s2, ch1);strAssign(s1, ch);strInsert(s1, 4, s2);strDelete(s1, 4, 5);cout << s1.ch << endl;cout << s2.ch << endl;replaceString(s1, s3, s2);cout << s1.ch << endl;String s4;initString(s4);strCopy(s4, s1);cout << s4.ch << endl;return 0;
}

[数据结构-严蔚敏版]P71串的抽象数据类型的定义相关推荐

  1. 有关数据结构基础知识(数据结构 严蔚敏版)

    1. 数据结构是一门研究非数值计算程序设计中的操作对象 以及这些对象之间的关系和操作的学科 2. 研究包括逻辑结构和存储结构 1) 逻辑结构(从具体问题抽象出来的数学模型)分为 集合结构 线性结构 树 ...

  2. C/C++实现数据结构严蔚敏版的一些注意事项(指南)

    建议实现的时候用C++语言进行实现,因为书中的有些参考伪代码都是通过C++实现的当用C语言替换的时候作为新手的我,找起bug来有点费劲. C语言实现顺序表的过程中的注意事项: 1, 书中绪论1.3,抽 ...

  3. 字符串静态顺序结构C/C++实现(数据结构严蔚敏版)

    1.头文件String.h #include<stdio.h> #include<stdlib.h> #include<string.h> #include< ...

  4. 队列链式结构C/C++实现(数据结构严蔚敏版)

    1.头文件Queue.h; #include<iostream> #include<iomanip>//格式控制头文件 #include<stdlib.h> usi ...

  5. 队列顺序结构C/C++实现(数据结构严蔚敏版)

    1.头文件Queue.h #include<iostream> using namespace std;//定义4个空间,留出一个作为标志位,当Q.rear+1 / MAXQSIZE = ...

  6. 栈C/C++实现(数据结构严蔚敏版)

    1.头文件:stack.h #include<iostream> #include<malloc.h> using namespace std; typedef int Sta ...

  7. 循环链表C/C++实现(数据结构严蔚敏版)

    1头文件LinkList.h: #include<iostream> using namespace std; #include<malloc.h>#define error ...

  8. 线性表的C/C++实现(数据结构 严蔚敏版)

    下面的代码是项目文件:一个头文件.一个源文件.一个测试文件 1.头文件List.h: #include<iostream> using namespace std; #include< ...

  9. [数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)

    对称矩阵的存储: 代码如下: #include <iostream> using namespace std;int main() {int n;cin >> n;int *a ...

最新文章

  1. 基于C语言STC89C52单片机电子密码锁的设计与仿真
  2. [深入理解Android卷一全文-第十章]深入理解MediaScanner
  3. mysql多启动与日志调优
  4. MySQL高级 - SQL优化 - or优化
  5. 简单的网络图片加载工具类
  6. cholesky分解java代码_Cholesky 分解(转)
  7. 单词翻转(信息学奥赛一本通-T1144)
  8. 点击率预测的贝叶斯平滑
  9. java 预览图片_jquery实现图片预览的方法
  10. shell脚本中$* 和 $@ 区别
  11. 启发式搜索 (Heuristically Search)-【贪婪最佳优先搜索】和【A*搜索】
  12. 给大家分享10个值得关注的C语言开源项目
  13. 用Eclipse的TaskList功能进行任务管理(提高工作效率)
  14. 液压控制系统的simulink搭建
  15. 数字电路28(设计步骤及十进制加计数器设计)
  16. 闰秒及其对计算机系统影响,闰秒原理及其对计算机系统影响
  17. JAVA设计模式笔记(简单工厂模式)
  18. 【vue-清除默认样式-完结】
  19. docker容器内pip install 显示 warning
  20. DDD 领域驱动设计 - 架构(分层/六边形/RESTful)

热门文章

  1. Android开发之运行客户的Demo拿不到数据
  2. Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)
  3. 两个简单多边形面积相等,那么其中一个能分割成有限多块多边形,经过平移和旋转,拼合成第二个多边形...
  4. 中国最为著名的古塔,你认识几座?
  5. 我的电脑不联网,很安全!黑客:你还有风扇呢
  6. 老师“鬼话”全曝光!哈哈哈哈哈哈全国的老师都这样吗?
  7. 每日一笑 | 史上最贴心的骗子
  8. 菜鸟学习数据科学家 5 大误区
  9. 原来这些行业的“潜规则”是这样的...
  10. github怎么隐藏自己的pr记录_记便签的软件哪个好?怎么及时记录自己的想法