IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 串的基本操作————数据结构 |复习复习复习 -> 正文阅读

[数据结构与算法]串的基本操作————数据结构 |复习复习复习

#include <stdio.h>
#include <stdlib.h>
 
typedef struct
{
	char *ch;
	int length;
}HString;

bool StrAssign(HString &T, char *chars)
{
	T.length = 0;//对应79
	if (T.ch)
		delete T.ch;	//清空 T
 
	char *ctemp = chars;//指向 chars指向的 内存地址
	while(*ctemp)
	{	//取chars的长度
		++T.length;
		++ctemp;//ctemp指针后移
	}
 
	T.ch = new char[T.length + 1];// 分配空间 长度为所需长度+1 (+1原因看29)
 
	char *tmp = T.ch;//指向 新开空间的 内存地址
	while(*chars)
		*tmp++ = *chars++;//赋值后 指针后移

	*tmp = '\0';//补 呼应 23

	return true;
}

bool StrCopy(HString &T, HString Str)
{
	if (!Str.ch)
		return false;//被复制串不存在直接退

	T.length = Str.length;
	if (T.ch)
		delete T.ch;//清空T
 
	T.ch = new char[T.length + 1];// 分配空间 长度为所需长度+1 (+1原因看49)
	
	char *tmp = T.ch;//指向 新开空间的 内存地址
	while(*Str.ch)
		*tmp++ = *Str.ch++;//赋值后 指针后移

	*tmp = '\0';//补 呼应 43
 
	return true;
}

bool StrEmpty(HString Str)
{
	if (!Str.ch)
		return false;//判定的串不存在直接退
	else
	{
		if (!Str.length)
			return true;//空 长度为0
		else
			return false;//非空 长度为N
	}
}

int StrCompare(HString Str, HString T)
{
	if ((!T.ch)||(!Str.ch))
		return 0;//比较的两个串有一个不存在就退
	int flag = 0;
	int len1=Str.length,len2=T.length;
	for (int i = 0; (i < len1)&&(i < len2); i++)
	{
		if (*(T.ch + i) != *(Str.ch + i))
		{//如果出现不相等的字符就记录两个字符的ASCII码差值 直接跳出就行了
			flag = *(Str.ch + i) - *(T.ch + i);
			break;
		}
	}
	if (0 == flag)//如果73行的循环没有改变flag的值 证明一个包含另一个
		flag = len1 - len2;
	
	return flag;
}

int Strlength(HString Str)
{
	if (!Str.ch)
		return false;//判定的串不存在直接退
	return Str.length;
}

bool SubString(HString &Sub, HString Str, int pos, int len)
{
	if (!Str.ch)
		return false;//判定的串不存在直接退
	if (Sub.ch)
		delete Sub.ch;//清空Sub

	if ((pos < 1)||(pos > Str.length)||(len < 0)||(len > Str.length - pos +1))
	{//相当于撤销清空操作
		Sub.ch = new char[1];
		*Sub.ch = '\0';
		Sub.length = 0;
		return false;
	}

	Sub.ch = new char[len + 1];// 分配空间 长度为所需长度+1 (+1原因看122)

	char *tmp = Sub.ch;//指向 Sub的ch指针所指的 内存地址

	for(int i = 1; i != pos; i++)
	{
		Str.ch++;//找到要复制字串的头(移动的是指针)
	}
	for(int i = 0; i != len; i++)
	{//从pos开始的len长的字串
		*tmp++ = *Str.ch++;
	}

	*tmp = '\0';//补 呼应 109

	return true;
}

bool Concat(HString &T, HString S1, HString S2)
{
	if (T.ch)
		delete T.ch;//清空T

	T.length = S1.length + S2.length;
	T.ch = new char[T.length + 1];// 分配空间 长度为所需长度+1 (+1原因看145)
	 
	char *tmp = T.ch;//指向 新开空间的 内存地址
	while(*S1.ch)
	{//先复制S1
		*tmp++ = *S1.ch++;
	}
	while(*S2.ch)
	{//此时的*tmp指针已经指向S2的 预复制内存地址
		*tmp++ = *S2.ch++;
	}

	*tmp = '\0';//补 呼应 145

	return true;
}

int Index(HString Str, HString T)
{
	if (!Str.ch||!T.ch||(0 == T.length))
		return 0;//若两个串不存在或操作不合逻辑直接退
	
	for (int i = 1; i <= Str.length - T.length + 1; i++)
	{
		if (*Str.ch == *T.ch)
		{//判断字串第一个字符来确定是否进入判断循环
			bool flag = true;
			char *Stmp = Str.ch,*Ttmp = T.ch;//准备好两个比较指针
			while(*Ttmp)
			{
				if (*Ttmp++ != *Stmp++)
				{
					flag = false;
					break;
				}
			}
			if (flag)//如果标记不变 返回数值
				return i;
		} 
		Str.ch++;//不同字符Str的指针要移动 
				//如果相同但匹配失败 Str的指针要移动 但T的指针不需要移动
	}
	
	return 0;
}

bool ClearString(HString &Str)
{
	if (Str.ch)
		delete Str.ch;//清空Str
	Str.ch = new char[1];//分配空间
	*Str.ch = '\0';//空串
	Str.length = 0;
	return true;
}

bool DestoryString(HString &Str)
{
	if (Str.ch)
		delete Str.ch;//清空Str
	Str.ch = NULL;//死串
	Str.length = 0;
	return true;
}

bool InitString(HString &T)
{//字符串初始化
	T.ch = NULL;
	T.length = 0;
	return true;
}

bool PrintString(HString T)
{//字符串打印
	if (!T.ch)
		return false;
	else
	{
		printf("串打印:");
		while(*T.ch)
			printf("%c", *T.ch++);
		printf("\n");
		return true;
	}
	return true;
}
int main()
{
	HString T, T1, T2 ,T3;
	InitString(T);
	InitString(T1);
	InitString(T2);
	InitString(T3);
 
	char *test = (char*)"abcdefg";
	char *test1 = (char*)"h i j k l m n ";
	char *test2 = (char*)"/o/p/q/r/s/t";
	char *test3 = (char*)"uvwxyz";
 
	StrAssign(T, test);
	PrintString(T);
 
	StrAssign(T1, test1);
	PrintString(T1);
 
	StrAssign(T2, test2);
	PrintString(T2);

	StrAssign(T3, test3);
	PrintString(T3);
 
	DestoryString(T);
	DestoryString(T1);
	DestoryString(T2);
	DestoryString(T3);
 
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:44:52  更:2021-10-23 12:46:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:58:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码