2019独角兽企业重金招聘Python工程师标准>>>

根据对书上伪代码的理解,编写了这么一段堆分配储存的程序,反正运行着没有什么问题,看看网上其他人的代码,具体细节上有所不同外,思路上都差不多。保存一下,万一有高手过来,还能给指点一下。

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
# include <string.h>//设置结构体变量
typedef struct string
{char * ch;int length;
}STRING,* PSTRING;//函数前置声明
//初始化结构体
void InitString( PSTRING );
//串的赋值操作
void StrAssign( PSTRING, char * );
//串的长度
int StrLength( PSTRING );
//比较两个串的大小
int StrCompare( PSTRING, PSTRING );
//清空一个串
bool ClearString( PSTRING );
//拼接两个串,组成一个新串
bool Concat( PSTRING, PSTRING, PSTRING );
//在某个位置上截取某个长度
bool SubString( PSTRING, PSTRING, int, int );/*初始化
*/
void InitString(PSTRING str)
{str -> ch       = NULL;str -> length    = 0;
}/*串的赋值操作@param    PSTRING str 将目标串赋值到该串@param    char *  s   被复制的串return void
*/
void StrAssign(PSTRING str,char * s)
{int i, j;//判断指针是否为空,如果不为空,将内存再用释放if( str -> ch ){free( str -> ch );str -> ch = NULL;}//判断传入字符串的长度for( i = 0; s[i] != '\0'; i++ );//在内存中动态分配出空间str -> ch = ( char * )malloc( i * sizeof( char ) );if( NULL == str -> ch ){printf("动态内存分配失败\n");return;}//逐个将值复制过来for( j = 0; j < i; ++j ){str -> ch[j] = s[j];}//给长度赋值str -> length = i;return; //结束}//返回串的长度
int StrLength( PSTRING str )
{return str -> length;
}/*比较两个串的大小@param  PSTRING str1 其中一个串@param   PSTRING str2 其中一个串return    int思路:1,逐个比较元素的ascii码,返回正数或者负数2,如果比较完毕,在比较两个串的长度,返回0 或者 非0
*/
int StrCompare( PSTRING str1, PSTRING str2 )
{int i;for( i = 0; i < str1->length && i < str2->length; ++i ){if( str1->ch[i] != str2->ch[i] ){return str1->ch[i] - str2->ch[i];}}return str1->length - str2->length;
}//清空一个串
bool ClearString( PSTRING str )
{free( str -> ch );str -> ch = NULL;str -> length = 0;return true;
}//拼接两个串,组成一个新串
bool Concat( PSTRING str3, PSTRING str1, PSTRING str2 )
{int i, total;//释放上一次使用的空间if( str3 -> ch ){/*free( str3 -> ch );这里需要注意一下,之前这里老报错,检查之后才知道,忘了为str3初始化。不初始化的结果就是:str3 -> ch中保存的是一个垃圾值,然后到了下行要释放空间的时候,因为保存的是一个垃圾值,或者是一个野指针,所以,程序出错,初始化一下str3,就好了。PS:对初始化的认知更深刻了。*/free( str3 -> ch );str3 -> ch = NULL;str3 -> length = 0;}//如果要拼接的两个串是空串,返回falseif( str1 -> length == 0  && str2 -> length == 0 ){return false;}//计算出两个串的总长度total = str1->length + str2->length;//为str3动态分配内存空间str3 -> ch = ( char * )malloc( total * sizeof( char ) );if( NULL == str3 -> ch ){printf( "动态内存分配失败\n" );return false;}//将str1的内容复制到str3 for( i = 0; i < str1 -> length; ++i ){str3 -> ch[i] = str1 -> ch[i];}//将str2的内容复制到str3for( i = 0; i < str2 -> length; ++i ){str3 -> ch[str1->length + i] = str2 -> ch[i];}//把总长度赋值给str3str3 -> length = total;return true;
}/*截取字符串@param PSTRING str 截取之后的新子串@param PSTRING str1 将要截取的串@param  int     pos  要截取的位置@param  int     len  要截取的长度return boolean
*/
bool SubString( PSTRING str, PSTRING str1, int pos, int len )
{int i;/*首先对传入参数进行验证pos 的取值范围 1 <= pos <= str1->lengthlen 的取值范围 0 <  len <= str1->length - pos + 1*/if( pos < 1 && pos > str1->length && len <= 0 && len > str1->length - pos + 1 ){return false;}//释放上一次使用的空间if( str -> ch ){free( str -> ch );str -> ch = NULL;str -> length = 0;}//分配空间str -> ch = ( char * )malloc( len * sizeof(char) );if( NULL == str -> ch ){printf("动态内存分配失败\n");return false;}//赋值操作for( i = 0; i < len; ++i ){str -> ch[i] = str1 -> ch[pos - 1 + i];}str -> length = len;return true;
}//主函数
int main( void )
{int i;STRING str1, str2, str3, str4;InitString( &str1 );InitString( &str2 );InitString( &str3 );InitString( &str4 );printf( "将“abcde”赋值给str1\n" );printf( "将“fghijklmn”赋值给str2\n" );StrAssign( &str1, "abcde" );StrAssign( &str2, "fghijklmn" );i = StrCompare( &str1, &str2 );printf( "比较str1和str2的结果:%d\n", i );printf( "拼接str1和str2,并且赋值给str3:\n" );Concat( &str3, &str1, &str2 );for( i = 0; i < str3.length; ++i ){printf( "%c ", str3.ch[i] );}printf( "\n" );printf( "从str3的第5个元素截取5个值,赋予str4:\n" );SubString( &str4, &str3, 5, 5 );for( i = 0; i < str4.length; ++i ){printf( "%c ", str4.ch[i] );}printf( "\n" );printf( "清空str3串:\n" );if( ClearString( &str3 ) ){printf( "str3已经被清空\n" );}return 0;
}
/*在VC++6.0中输出的结果是:===========================将“abcde”复制给str1将“fghijklmn”复制给str2比较str1和str2的结果:-5拼接str1和str2,并且赋值给str3:a b c d e f g h i j k l m n从str3的第5个元素截取5个值,赋予str4:e f g h i清空str3串:str3已经被清空===========================
*/

就这么着吧,有时间再把块链的代码实现一下,书上也真够简单的,伪代码也给省略了……

学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog

转载于:https://my.oschina.net/woshixiaomayi/blog/603662

小蚂蚁学习数据结构(16)——串的堆分配储存代码演示相关推荐

  1. 串的堆分配存储c语言,数据结构c语言串的堆分配存储源程序

    <数据结构c语言串的堆分配存储源程序>由会员分享,可在线阅读,更多相关<数据结构c语言串的堆分配存储源程序(7页珍藏版)>请在人人文库网上搜索. 1.include#inclu ...

  2. 数据结构笔记(十三)-- 串的堆分配存储表示

    串的堆分配存储表示 一.堆分配存储概述 堆分配内存仍是一组地址连续的存储单元来存放串值字符序列,但是存储空间实在程序执行过程中动态分配而得.在C语言中,存在一个称为"堆"的自由存储 ...

  3. 串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现

    感觉上块链的代码实现比数组的代码实现要难一些,估计因为数组的实现书上有伪代码,而块链连伪代码都木有,不过归根到底还是水平不行--哭瞎--╥﹏╥... /* 数据结构C语言版 串的块链存储表示和实现 * ...

  4. 小蚂蚁学习数据结构(26)——题目——输出二叉树上值大于x的算法

    2019独角兽企业重金招聘Python工程师标准>>> 题目要求: 设二叉树以二叉链表的形式存储,有关类型定义如下: typedef struct BiTNode{ int data ...

  5. 小蚂蚁学习数据结构(4)——线性结构——线性表的链式表示和实现(下)

    2019独角兽企业重金招聘Python工程师标准>>> 用代码实现对链表的操作. /*创建一个链表,实现对链表的创建,插入/追加,删除等操作 */ # include <std ...

  6. 小蚂蚁学习数据结构(32)——二叉排序树的概念

    2019独角兽企业重金招聘Python工程师标准>>> 二叉排序树,定义: 1,若左子树非空,则左子树上所有节点的关键字均小于根节点关键字. 2,若右子树非空,则右子树上所有节点的关 ...

  7. 有向图php,小蚂蚁学习数据结构(29)——图的存储表示

    图的数组(邻接矩阵)存储表示 方法:将图的顶点信息存储在一个一维数组中,并将它的邻接矩阵存储在一个二位数组中即构成图的数组(邻接矩阵)表示. 无向图的邻接矩阵具有如下特点: 1,它是对称阵,(i,j) ...

  8. 堆分配存储结构串的实现|C++

    堆分配存储结构串的实现方法是,提供一个足够大的存储空间.作为串的可利用空间,用来存储各串的串值. 每当建立一个新的串时,系统就从这个空间划分出一个大小和新串相同的空间给新串 若分配成功则返回一个指向起 ...

  9. c# 插入数据到 uniqueidentifier_每天5分钟用C#学习数据结构(16)二叉树 Part 2

    [基础知识]| 作者 / Edison Zhou这是恰童鞋骚年的第209篇原创文章 上一篇开始了树与二叉树之旅,本篇会介绍二叉树的基本实现.1二叉树的代码实现 二叉树节点的定义实现 /// /// 二 ...

最新文章

  1. php的闭包函数use的使用
  2. SpringBoot获取请求的参数
  3. 2018年4月份,阿里最新的java程序员面试题目
  4. 算法------对称二叉树
  5. UNIX再学习 -- 守护进程(转)
  6. 关于提高代码复用性的几个知识点的回顾
  7. linux服务器查看mysql服务名称_Linux服务器查看MySQL信息
  8. javaweb实训第五天下午——xml配置文件约束报错问题
  9. 打印CSDN网页内容
  10. 中国脑计划颠覆性创新之路六,用互联网与脑科学构建新AI系统模型
  11. Ubuntu 16G内存在android系统 10/11/12/13编译 framework时候经常oom内存不足,电脑卡死解决办法stubs-docs-non-updatable metalava
  12. Word、PPT、Visio里面怎么插入latex mathcal的数学字符?
  13. 前端Js获取本网IP和外网IP方法总汇
  14. 3.DesignForVias\AlignVia
  15. Android设置背景色
  16. char matlab中,matlab中char什么意思
  17. Raspberry Pi简介
  18. ECB(Electronic Code Book)电子密码本模式(分组密码)
  19. C语言之scanf超详细解析
  20. 如何使用帮助文档echarts

热门文章

  1. Nginx启动/重启脚本详解
  2. route debugger
  3. BLOG 可能的 BUG
  4. 3.2 Tensorflow基础运算
  5. jupyter notebook + 服务器中docker 使用配置
  6. (一)Linux下C++ OpenCV开发环境搭建
  7. 接口怎么获取数组底下的数组_3分钟短文 | PHP数组获取最后一个元素,10个方式中哪个有错?...
  8. 坚果云android功能,坚果云发布Android新版本 离线收藏大增强
  9. linux删除静态arp,Linux如何清理ARP缓存?
  10. 什么是SQL Server GETDATE()函数?