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

news/2024/12/5 0:20:45/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码如下:

#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;
}

http://www.ppmy.cn/news/639760.html

相关文章

c语言中width获取窗体宽度,程序清单4.7_width.c程序_《C Primer Plus》P71

// width.cpp : 定义控制台应用程序的入口点。 // /* width.c -- 字段宽度 */ /* 时间:2018年06月15日 23:43:01 代码:程序清单4.7_width.c程序_《C Primer Plus》P71 目的:了解 printf() %d d前加参数的输出结果 */ #include "stdafx.h" #define PAGES 931 int _tma…

p71 异或运算

//71 program test; var i,j,k:byte; begini:%01001101;j:%11010100;k:i xor j; //异或运算writeln( binstr(i,8) );writeln( binstr(j,8) );writeln( binstr(k,8) ); end. 转载于:https://www.cnblogs.com/xin-le/p/3981091.html

练习 ~黑马程序员匠心之作-第一阶段C++基础入门-P64~P71-结构体

黑马程序员匠心之作|C教程从0到1入门编程 关于P64~P71-练习-结构体 1、结构体的定义和使用2、结构体数组3、结构体指针4、结构体嵌套结构体5、结构体做函数参数6、结构体中const使用场景7、结构体案例1-毕业设计8、结构体案例2-英雄排名 1、结构体的定义和使用 结构体属于用户…

钟长者P71解题报告

T1 【题目描述】 给你N个字符串&#xff0c;你每次可以选择其中一个字符串的一段前缀进行翻转&#xff0c;但是你必须保证这个前缀的长度是偶数。你可以进行无限次这样的操作&#xff0c;并且如果两个字符串变得相同的时候&#xff0c;你就可以把这两个字符串都删除掉&#xff…

Java习题--P71第四题

public class Vehicle {int wheels;float weight;public Vehicle(int wheels, double d) {super();this.wheels wheels;this.weight (float) d;}void show() {System.out.print("车轮:"this.wheels);System.out.print(",车重:"this.weight);} }public cl…

JAVA系列05:30天Java核心技术P56~P71

P57 变量运算规则的两个特殊情况 1、整形变量默认int,赋值long型变量不加l,默认成int 浮点型变量默认成double&#xff0c;定义float不加f&#xff0c;默认成double&#xff0c;而要小&#xff08;float&#xff09;转大(double)&#xff0c;会出错 2、整形常量默认为int&am…

p71 内网安全-域横向网络传输应用层隧道技术

数据来源 必备知识点&#xff1a; 1、代理和隧道技术区别? 代理&#xff1a;只是解决网络的访问问题&#xff08;如&#xff1a;有些内网访问不到&#xff0c;可以用代理实现&#xff09; 隧道&#xff1a;隧道不仅是解决网络的通信问题&#xff0c;更大的作用是绕过过滤&…

C++基础入门---8.结构体【P64~P71】

C基础入门---8.结构体【P64~P71】 8. 结构体8.1 结构体的定义和使用8.2 结构体数组8.3 结构体指针8.4 结构体嵌套结构体8.5 结构体作函数参数8.6 结构体中const使用场景8.7 结构体案例18.8 结构体案例2 8. 结构体 结构体属于用户自定义的数据类型&#xff0c;允许用户存储不同…