串的堆分配实现

今天,线性结构基本就这样了,以后(至少是最近)就很少写线性基础结构的实现了。

串的类型定义

typedef struct
{char *str;int length;
}HeapString;


初始化串

InitString(HeapString *S)
{S->length=0;S->str='\0';
}

长度

int StrEmpty(HeapString S)
/*判断串是否为空,串为空返回1,否则返回0*/
{if(S.length==0)         /*判断串的长度是否等于0*/return 1;           /*当串为空时,返回1;否则返回0*/elsereturn 0;
}
int StrLength(HeapString S)
/*求串的长度操作*/
{return S.length;
}


串的赋值

void StrAssign(HeapString *S,char cstr[])
/*串的赋值操作*/
{int i=0,len;if(S->str)free(S->str);for(i=0;cstr[i]!='\0';i++); /*求cstr字符串的长度*/len=i;if(!i){S->str=NULL;S->length=0;}else{S->str=(char*)malloc((len+1)*sizeof(char));if(!S->str)exit(-1);for(i=0;i<len;i++)S->str[i]=cstr[i];S->length=len;}
}


串的复制

void StrAssign(HeapString *S,char cstr[])
/*串的赋值操作*/
{int i=0,len;if(S->str)free(S->str);for(i=0;cstr[i]!='\0';i++); /*求cstr字符串的长度*/len=i;if(!i){S->str=NULL;S->length=0;}else{S->str=(char*)malloc((len+1)*sizeof(char));if(!S->str)exit(-1);for(i=0;i<len;i++)S->str[i]=cstr[i];S->length=len;}
}


串的插入

int StrInsert(HeapString *S,int pos,HeapString T)
/*串的插入操作。在S中第pos个位置插入T分为三种情况*/
{int i;if(pos<0||pos-1>S->length)      /*插入位置不正确,返回0*/{printf("插入位置不正确");return 0;}S->str=(char*)realloc(S->str,(S->length+T.length)*sizeof(char));if(!S->str){printf("内存分配失败");exit(-1);}for(i=S->length-1;i>=pos-1;i--)S->str[i+T.length]=S->str[i];for(i=0;i<T.length;i++)S->str[pos+i-1]=T.str[i];S->length=S->length+T.length;return 1;
}


串的删除

int StrDelete(HeapString *S,int pos,int len)
/*在串S中删除pos开始的len个字符*/
{int i;char *p;if(pos<0||len<0||pos+len-1>S->length){printf("删除位置不正确,参数len不合法");return 0;}p=(char*)malloc(S->length-len);             /*p指向动态分配的内存单元*/if(!p)exit(-1);for(i=0;i<pos-1;i++)                        /*将串第pos位置之前的字符复制到p中*/p[i]=S->str[i];for(i=pos-1;i<S->length-len;i++)                /*将串第pos+len位置以后的字符复制到p中*/p[i]=S->str[i+len];S->length=S->length-len;                    /*修改串的长度*/free(S->str);                           /*释放原来的串S的内存空间*/S->str=p;                               /*将串的str指向p字符串*/return 1;
}



串的比较

int StrCompare(HeapString S,HeapString T)
/*串的比较操作*/
{
int i;
for(i=0;i<S.length&&i<T.length;i++) /*比较两个串中的字符*/if(S.str[i]!=T.str[i])          /*如果出现字符不同,则返回两个字符的差值*/return (S.str[i]-T.str[i]);
return (S.length-T.length);             /*如果比较完毕,返回两个串的长度的差值*/
}


串的连接

int StrCat(HeapString *T,HeapString S)
/*将串S连接在串T的后面*/
{int i;T->str=(char*)realloc(T->str,(T->length+S.length)*sizeof(char));if(!T->str){printf("分配空间失败");exit(-1);}else{for(i=T->length;i<T->length+S.length;i++)   /*串S直接连接在T的末尾*/T->str[i]=S.str[i-T->length];T->length=T->length+S.length;           /*修改串T的长度*/}return 1;
}


清空串

void StrClear(HeapString *S)
/*清空串,只需要将串的长度置为0即可*/
{S->str='\0';S->length=0;
}


销毁串

void StrDestroy(HeapString *S)
{if(S->str)free(S->str);
}

打印

void StrPrint(HeapString S)
{int i;for(i=0;i<S.length;i++){printf("%c",S.str[i]);}printf("\n");
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Numpy 入门

Numpy 入门 Numpy简介 官网链接&#xff1a;http://www.numpy.org/NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库 Numpy的基本功能 快速高效的多维数组对象ndarray用于对数组执行元素级计算以…

数据结构课上笔记10

树 树的定义&#xff1a;树(Tree)是 n(n≥0)个结点的有限集。若 n0&#xff0c;称为空树&#xff1b;若 n > 0&#xff0c;则它满足如下两个条件&#xff1a; (1) 有且仅有一个特定的称为根 (Root) 的结点&#xff1b; (2) 其余结点可分为 m (m≥0) 个互不相交的有限…

pandasStudyNoteBook

pandas 入门培训 pandas简介 - 官网链接&#xff1a;http://pandas.pydata.org/ - pandas pannel data data analysis - Pandas是python的一个数据分析包 , Pandas最初被作为金融数据分析工具而开发出来&#xff0c;因此&#xff0c;pandas为时间序列分析提供了很好的支持 …

最大搜索子树

给定一个二叉树的头结点&#xff0c;返回最大搜索子树的大小。 我们先定义结点&#xff1a; public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value data;}} 分析&#xff1a; 直接判断每个节点左边小右边大是…

二叉树最长路径

分析&#xff1a; 暴力求每一段距离也可。 对于以本节点为根的二叉树&#xff0c;最远距离有三种可能&#xff1a; 1&#xff09;最远路径来自左子树 2 &#xff09;最远路径来自右子树&#xff08;图示与左子树同理&#xff09; 3&#xff09;最远路径为左右子树距离根最远…

判断完全二叉树

完全二叉树的定义: 一棵二叉树&#xff0c;除了最后一层之外都是完全填充的&#xff0c;并且最后一层的叶子结点都在左边。 https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91/7773232?fraladdin 百度定义 思路&#xff1a;层序遍历二叉树 如果…

判断二叉搜索树

二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索树&#xff0c;二叉排序树&#xff09;它或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于…

剑指offer_01

文章目录[toc]第一章 面试流程1.1 面试官谈面试1.2 面试3种形式1.3 面试的3个环节第一章 面试流程 1.1 面试官谈面试 初级的程序员谈算法和数据结构&#xff0c;高级的程序员谈项目经验要对公司近况和项目情况了解不要紧张&#xff0c;不要马上上手写代码 1.2 面试3种形式 …

判断平衡二叉树

平衡二叉树&#xff08;Balanced Binary Tree&#xff09;具有以下性质&#xff1a;它是一棵空树或它的左右两个子树的高度差的绝对值不超过1。并且左右两个子树都是一棵平衡二叉树 &#xff08;不是我们平时意义上的必须为搜索树&#xff09; 判断一棵树是否为平衡二叉树&am…

剑指offer_02

文章目录第二章 面试需要的基础知识1.1 面试官谈基础知识1.2 编程语言1.3 数据结构1.4 算法和数据操作第二章 面试需要的基础知识 1.1 面试官谈基础知识 数据结构和算法&#xff0c;编程能力&#xff0c;部分数学能力&#xff0c;问题分析和推理能力编程基础&#xff0c;计算…

求完全二叉树的结点个数

第一次见这个题&#xff0c;看时间小于O(N)。。。。。 只能是二分啊。 但是怎么二分&#xff0c;条件是什么&#xff0c;真的想不到。 后来知道了&#xff0c;我们要找最深一层最右边那个结点。借此确定结点个数。 我们知道&#xff0c;满二叉树的结点个数和深度是有公式的&a…

剑指offer_03

文章目录第三章 高质量代码1.1 面试官谈高质量代码1.2 代码的规范性1.3 代码的完整性1.4 代码的鲁棒性第三章 高质量代码 1.1 面试官谈高质量代码 代码应该考虑异常状况和垃圾回收问题&#xff0c;不能忽视边界情况变量&#xff0c;函数命名应该要统一&#xff0c;备注要恰到…

剑指offer_04

文章目录第四章 解决面试题的思路1.1 面试官谈面试思路1.2 画图让问题抽象化1.3 举例让抽象问题具体化1.4 分解让复杂问题具体化第四章 解决面试题的思路 1.1 面试官谈面试思路 编程前讲自己的思路是一项考核指标&#xff0c;不能一开始就变成&#xff0c;面试的时候应该和面…

先序中序后序两两结合重建二叉树

遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有结点&#xff0c;使每一个结点都被访问一次&#xff0c;而且只被访问一次。由于二叉树是非线性结构&#xff0c;因此&#xff0c;树的遍历实质上是将二叉树的各个结…

剑指offer_05

文章目录第五章 优化时间和空间效率1.1 面试官谈效率1.2 时间效率1.3 时间效率和空间效率的平衡第五章 优化时间和空间效率 1.1 面试官谈效率 1.时间和空间复杂度是写程序的时候&#xff0c;我们需要分析的&#xff0c;最好每次写完代码后自己都可以将程序的时间和空间复杂度…

先序中序数组推后序数组

二叉树遍历 所谓遍历(Traversal)是指沿着某条搜索路线&#xff0c;依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一&#xff0c;是二叉树上进行其它运算之基础。 从二叉树的递归定义可知&#xff0c;一…

剑指offer_06

文章目录第六章 面试中的各项能力1.1 面试官谈能力1.2 沟通能力和学习能力1.3 知识迁移能力1.4 抽象建模能力1.5 发散思维能力第六章 面试中的各项能力 1.1 面试官谈能力 1.礼貌平和&#xff0c;不卑不亢的和面试官沟通&#xff1b;逻辑清楚&#xff0c;详略得到的介绍项目经…

数据结构课上笔记11

满二叉树 (Full binary tree) 除最后一层无任何子节点外&#xff0c;每一层上的所有结点都有两个子结点二叉树。 国内教程定义&#xff1a;一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是满二叉树。也就是说&#xff0c;如果一个二叉树…

数据结构和算法(01)--- 算法复杂度

文章目录算法时间复杂度算法时间复杂度 要判断算法的好坏&#xff0c;可以从时间方面进行分析。算法运行的越快&#xff0c;所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢&#xff1f;我们采用时间复杂度进行衡量。 1.算法时…

数据结构课上笔记12

二叉树的存储结构 顺序存储结构 完全二叉树&#xff1a;用一组地址连续的 存储单元依次自上而下、自左至右存 储结点元素&#xff0c;即将编号为 i 的结点元 素存储在一维数组中下标为 i –1 的分量中。 一般二叉树&#xff1a;将其每个结点与完 全二叉树上的结点相对照&…