串的堆分配存储表示c语言,数据结构C语言版 串的堆分配存储表示与实现.doc

T,则返回值>0;若S=T,则返回值=0;若SS.length||len<0||len>S.length-pos+1)

return 0;

if((*Sub).ch)

free((*Sub).ch); // 释放旧空间

if(!len) // 空子串

{

(*Sub).ch=NULL;

(*Sub).length=0;

}

else

{ // 完整子串

(*Sub).ch=(char*)malloc(len*sizeof(char));

if(!(*Sub).ch)

exit(0);

for(i=0;i<=len-1;i++)

(*Sub).ch[i]=S.ch[pos-1+i];

(*Sub).length=len;

}

return 1;

}

// 算法4.1

// T为非空串。若主串S中第pos个字符之后存在与T相等的子串,

// 则返回第一个这样的子串在S中的位置,否则返回0

int Index(HString S,HString T,int pos)

{

int n,m,i;

HString sub;

InitString(&sub);

if(pos>0)

{

n=StrLength(S);

m=StrLength(T);

i=pos;

while(i<=n-m+1)//从第i个位置开始求与T等长的子串,循环直到找到

{

SubString(&sub,S,i,m);//从第i个位置开始求得子串

if(StrCompare(sub,T)!=0)//将求得的子串与T对比,若不等则i++

++i;

else

return i;

}

}

return 0;

}

// 算法4.4

// 在串S的第pos个字符之前插入串Ts

int StrInsert(HString *S,int pos,HString T)

{

int i;

if(pos<1||pos>(*S).length+1) // pos不合法

return 0;

if(T.length) // T非空,则重新分配空间,插入T

{

(*S).ch = (char*)realloc((*S).ch,

((*S).length+T.length)*sizeof(char));

if(!(*S).ch)

exit(0);

for(i=(*S).length-1;i>=pos-1;--i) // 为插入T而腾出位置

(*S).ch[i+T.length]=(*S).ch[i];

for(i=0;i;

printf("串s%c串t\n",c);

Concat(&r,t,s);

printf("串t联接串s产生的串r为: ");

StrPrint(r);

StrAssign(&s,"oo");

printf("串s为: ");

StrPrint(s);

StrAssign(&t,"o");

printf("串t为: ");

StrPrint(t);

Replace(&r,t,s);

printf("把串r中和串t相同的子串用串s代替后,串r为:\n");

StrPrint(r);

ClearString(&s);

printf("串s清空后,串长为%d 空否?%d(1:空 0:否)\n",

StrLength(s),StrEmpty(s));

SubString(&s,r,6,4);

printf("串s为从串r的第6个字符起的4个字符,长度为%d 串s为: ",

s.length);

StrPrint(s);

StrCopy(&t,r);

printf("复制串t为串r,串t为: ");

StrPrint(t);

StrInsert(&t,6,s);

printf("在串t的第6个字符前插入串s后,串t为: ");

StrPrint(t);

StrDelete(&t,1,5);

printf("从串t的第1个字符起删除5个字符后,串t为: ");

StrPrint(t);

printf("%d是从串t的第1个字符起,和串s相同的第1个子串的位置\n",

Index(t,s,1));

printf("%d是从串t的第2个字符起,和串s相同的第1个子串的位置\n",

Index(t,s,2));

system("pause");

return 0;

}

/*

输出效果:

串t为: God bye!

串长为8 串空否?0(1:空 0:否)

串s为: God luck!

串s>串t

串t联接串s产生的串r为: God bye!God luck!

串s为: oo

串t为: o

把串r中和串t相同的子串用串s代替后,串r为:

Good bye!Good luck!

串s清空后,串长为0 空否?1(1:空 0:否)

串s为从串r的第6个字符起的4个字符,长度为4 串s为: bye!

复制串t为串r,串t为: Good bye!Good luck!

在串t的第6个字符前插入串s后,串t为: Good bye!bye!Good luck!

从串t的第1个字符起删除5个字符后,串t为: bye!bye!Good luck!

1是从串t的第1个字符起,和串s相同的第1个子串的位置

5是从串t的第2个字符起,和串s相同的第1个子串的位置

请按任意键继续. . .

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为你解答。C语言实现定长顺序存储的方法如下: 首先,我们需要定义一个固定长度的字符数组来存储,如下所示: ``` #define MAXLEN 100 // 定义最大长度 typedef struct { char data[MAXLEN]; // 存储的字符数组 int length; // 的长度 } SqString; // 顺序存储结构体 ``` 接下来,我们需要实现一些基本操作,如的初始化、清空、求长度、比较、连接、子等,具体实现如下: ``` // 初始化 void InitString(SqString *s, char *str) { int len = strlen(str); if (len > MAXLEN) { len = MAXLEN; } for (int i = 0; i < len; i++) { s->data[i] = str[i]; } s->length = len; } // 清空 void ClearString(SqString *s) { s->length = 0; } // 求长度 int Length(SqString s) { return s.length; } // 比较两个 int StrCompare(SqString s1, SqString s2) { int len = s1.length < s2.length ? s1.length : s2.length; for (int i = 0; i < len; i++) { if (s1.data[i] != s2.data[i]) { return s1.data[i] - s2.data[i]; } } return s1.length - s2.length; } // 连接 void Concat(SqString *s, SqString s1, SqString s2) { int len = s1.length + s2.length; if (len > MAXLEN) { len = MAXLEN; } for (int i = 0; i < s1.length; i++) { s->data[i] = s1.data[i]; } for (int i = 0; i < s2.length && i < MAXLEN - s1.length; i++) { s->data[s1.length + i] = s2.data[i]; } s->length = len; } // 取子 void SubString(SqString *sub, SqString s, int pos, int len) { if (pos < 1 || pos > s.length || len < 0 || len > s.length - pos + 1) { return; } for (int i = 0; i < len; i++) { sub->data[i] = s.data[pos + i - 1]; } sub->length = len; } ``` 通过以上代码,我们便可以实现定长顺序存储的基本操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值