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

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

# include 

# include 

# include 

# include 

//设置结构体变量

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;

}

/*

串的赋值操作

@paramPSTRINGstr将目标串赋值到该串

@paramchar *s   被复制的串

returnvoid

*/

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 

{

str -> ch[j] = s[j];

}

//给长度赋值

str -> length = i;

return; //结束

}

//返回串的长度

int StrLength( PSTRING str )

{

return str -> length;

}

/*

比较两个串的大小

@paramPSTRINGstr1 其中一个串

@paramPSTRINGstr2 其中一个串

returnint

思路:

1,逐个比较元素的ascii码,返回正数或者负数

2,如果比较完毕,在比较两个串的长度,返回0 或者 非0

*/

int StrCompare( PSTRING str1, PSTRING str2 )

{

int i;

for( i = 0; i length && i 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;

}

//如果要拼接的两个串是空串,返回false

if( 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  length; ++i )

{

str3 -> ch[i] = str1 -> ch[i];

}

//将str2的内容复制到str3

for( i = 0; i  length; ++i )

{

str3 -> ch[str1->length + i] = str2 -> ch[i];

}

//把总长度赋值给str3

str3 -> length = total;

return true;

}

/*

截取字符串

@paramPSTRINGstr截取之后的新子串

@paramPSTRING str1 将要截取的串

@paramintpos 要截取的位置

@paramintlen 要截取的长度

return boolean

*/

bool SubString( PSTRING str, PSTRING str1, int pos, int len )

{

int i;

/*

首先对传入参数进行验证

pos 的取值范围 1 <= pos <= str1->length

len 的取值范围 0 length - pos + 1

*/

if( 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 

{

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 

{

printf( "%c ", str3.ch[i] );

}

printf( "\n" );

printf( "从str3的第5个元素截取5个值,赋予str4:\n" );

SubString( &str4, &str3, 5, 5 );

for( i = 0; 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已经被清空

===========================

*/

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值