首页 > 其他分享 >C语言数据结构串的表示与操作的实现

C语言数据结构串的表示与操作的实现

时间:2023-02-24 17:58:42浏览次数:45  
标签:ch Sub int HString len C语言 length 操作 数据结构

串的堆分配储存表示
typedef struct {
	char* ch;//若是非空字符串,则按串长分配存储区,否则ch为NULL
	int length;//串长度
} HString;
生成一个其值等于串常量的串
HString StrAssign(HString Str, char* chars) {
	//生成一个其值等于串常量的chars的串T
	if (Str.ch) {
		//释放T的空间
		free(Str.ch);
	}
	int len = 0;
	printf_s("chars=%s\n", chars);
	while (1) {
		len++;
		if (chars[len] == '\0') {
			//TODO
			break;
		}
	}
	if (!len) {
		//长度为0为ch赋NULL值
		Str.ch = NULL;
		Str.length = 0;
	}
	else {
		if (!(Str.ch = (char*)malloc(len * sizeof(char)))) {
			//空间不足退出
			exit(ERROR);
		}
		for (int i = 0; i <= len - 1; i++) {
			//TODO
			Str.ch[i] = chars[i];
		}
		Str.ch[len] = '\0';
		printf("Str.ch=%s\n", Str.ch);
		Str.length = len;
	}
	return Str;
}
比较字符串
int StrCompares(HString S, HString T) {
	//	若S>T,则返回值>0;若S<T,则返回值=0,若S<T,则返回值<0
	printf_s("123\n");
	for (int i = 0; i <= S.length && i < T.length; ++i) {
		//TODO
		if (S.ch[i] != T.ch[i]) {
			//TODO
			return S.ch[i] - T.ch[i];
		}
	}
	return S.length - T.length;
}
清空串
HString ClearString(HString S) {
	//	将S清为空串
	if (S.ch) {
		//TODO
		free(S.ch);
		S.ch = NULL;
	}
	S.length = 0;
	return S;
}
链接新串
HString Concat(HString T, HString S1, HString S2) {
	//用T返回由S1和S2链接而成的新串
	if (T.ch)
	{
		free(T.ch);//释放旧空间
	}
	if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char))))
	{
		exit(ERROR);
	}
	for (int i = 0; i < S1.length; i++)
	{
		printf("i=%d\n", i);
		T.ch[i] = S1.ch[i];
	}

	T.length = S1.length + S2.length;
	for (int i = S1.length; i < T.length; i++)
	{
		T.ch[i] = S2.ch[i - S1.length];
	}
	T.ch[T.length] = '\0';
	return T;
}
用Sub返回串S的第pos个字符起长度为len的子串
HString SubString(HString Sub, HString S, int pos, int len) {
	//用Sub返回串S的第pos个字符起长度为len的子串
	//其中,1<=pos<=StrLength(S)&&0<=len<=StrLength(S)-pos+1
	if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)
	{
		exit(ERROR);
	}
	if (Sub.ch)
	{
		//释放旧空间
		free(Sub.ch);
	}
	if (!len)
	{
		//空子串
		Sub.ch = NULL;
		Sub.length = 0;
	}
	else
	{
		Sub.ch = (char*)malloc(len * sizeof(char));
		int lengthNum = 0;
		int posNum = 1;
		while (1)
		{
			Sub.ch[lengthNum] = S.ch[posNum];
			lengthNum++;
			posNum++;
			if (posNum == pos + len && posNum <= S.length)
			{
				break;
			}
		}
		Sub.length = len;
		Sub.ch[len] = '\0';
	}
	return Sub;
}

标签:ch,Sub,int,HString,len,C语言,length,操作,数据结构
From: https://www.cnblogs.com/homeskating/p/17152614.html

相关文章

  • C语言中return、break、continue的用法和区别
    C语言中return、break、continue是我们常用的三个“流程控制”关键字。你能熟练使用这三个关键字吗?下面来讲讲这三个关键字,以及相关的内容。 0概述大部分编程语言......
  • C语言运算符优先级
    优先级运算符运算结合关系举例1+单目不变自右向左a*+b1-单目取负自右向左a*-b2*乘自左向右a*b2/除自左向右a/b2%取余自左向右a......
  • C语言可变参数的使用详解
    一、可变参数表介绍c/c++语言具备一个不同于其他编程语言的的特性,即支持可变参数。例如C库中的printf,scanf等函数,都支持输入数量不定的参数。例如:printf("hello world......
  • docker 操作常用命令
    镜像#以tomcat为基础镜像创建一个容器,容器名为my-tomcat#拉取tomcat最新镜像,实际生产中,dockerpull这一步可以省略,dockerrun的时候会自己去拉取。dockerpulltomcat......
  • eclipse快捷键操作指北
    MyEclipse快捷键4(ALT+CTRL)Alt+CTRL+↓复制当前行到下一行(复制增加)Alt+CTRL+↑复制当前行到上一行(复制增加)-------------------------------------------MyEcl......
  • NPOI 操作Excel
    usingNPOI.HSSF.UserModel;usingNPOI.SS.UserModel;usingNPOI.XSSF.UserModel;//导入publicvoidupload(HttpPostedFileBasefile){if(......
  • 操作系统储存管理(页式、段式、段页式)
    某计算机系统的内存大小为128k,采用可变分区分配方式进行内存分配,当前系统的内存分块情况如下图所示,现有作业4申请内存9k,几种不同的存储分配算法在分配中,会产生什么样的结果......
  • 自己从零写操作系统GrapeOS——3.GrapeOS参考资料
    站在巨人的肩膀上才能看的更远。我写GrapeOS主要参考了以下4本书:《30天自制操作系统》作者川合秀实《操作系统真象还原》作者郑刚《一个64位操作系统的设计与实现》作......
  • redis list操作 set&sortedset操作
               ......
  • 自己从零写操作系统GrapeOS——2.学习写GrapeOS的前提条件
    学习写GrapeOS需要的前提条件主要有以下3点:1.会x86汇编2.会C语言3.会用Linux以上要求都不需要多么熟练,其中x86汇编懂基本的指令,C语言懂基本的语法,会在虚拟机中安装Linu......