数据结构中串(字符串)的堆分配存储表示:结构体:
typedef struct {
char *ch;
int length;
}HString;
ch用来存储申请的空间首地址,length用来存储申请到的地址大小即字符串的长度。
字符串的初始化函数:
Status StrAssign(HString *t,char *chars){
char *c=chars;
int i;
for(i=0,c;*c;++i,++c);//*c可以替换为*c!='\0'
if(!i){
t->ch=NULL;
t->length=0;
}else{
if(!(t->ch=(char*)malloc(i*sizeof(char)))){
exit(1);
}
for(int j=0;j<i;j++){
t->ch[j]=chars[j];
}
t->length=i;
}
return OK;
}
字符串的遍历函数:
void StrTraverse(HString *t){
for(int i=0;i<t->length;i++){
printf("%c",t->ch[i]);
}
}
一些常用函数的实现:
#include<stdio.h>
#include<stdlib.h>
#define MAX 255
#define OK 1
typedef int Status;
typedef struct {
char *ch;
int length;
}HString;
int main(){
Status StrAssign(HString *,char *);
int StrLength(HString *);
void StrTraverse(HString *);
Status StrCopy(HString *,HString *);
Status StrEmpty(HString *);
Status StrCompare(HString *,HString *);
Status ClearString(HString *);
Status Concat(HString *,HString *,HString *);
Status SubString(HString *,HString *,int ,int );
char a[20]="hello string world";
HString s,p,m,sub,*sp=&s,*pp=&p,*mp=&m,*subp=⊂
StrAssign(sp,a);
StrCopy(pp,sp);
printf("%d\n",StrLength(pp));
StrTraverse(pp);
if(StrCompare(sp,pp)==0){
printf("\ns与p两个字符串相等\n");
}
Concat(mp,sp,pp);
StrTraverse(mp);
SubString(subp,mp,2,9);
printf("\n");
StrTraverse(subp);
return 0;
}
Status StrAssign(HString *t,char *chars){
char *c=chars;
int i;
for(i=0,c;*c;++i,++c);//*c可以替换为*c!='\0'
if(!i){
t->ch=NULL;
t->length=0;
}else{
if(!(t->ch=(char*)malloc(i*sizeof(char)))){
exit(1);
}
for(int j=0;j<i;j++){
t->ch[j]=chars[j];
}
t->length=i;
}
return OK;
}
int StrLength(HString *t){
return t->length;
}
void StrTraverse(HString *t){
for(int i=0;i<t->length;i++){
printf("%c",t->ch[i]);
}
}
Status StrCopy(HString *t,HString *p){
t->length=p->length;
t->ch=(char*)malloc(t->length*sizeof(char));
if(!t->ch){
exit(1);
}
for(int i=0;i<t->length;i++){
t->ch[i]=p->ch[i];
}
return OK;
}
Status StrEmpty(HString *t){
if(t->length==0){
return 1;
}else{
return 0;
}
}
Status StrCompare(HString *t,HString *p){
for(int i=0;i<t->length&&i<p->length;++i){
if(t->ch[i]!=p->ch[i]){
return t->ch[i]-p->ch[i];
}
}
return t->length-p->length;
}
Status ClearString(HString *t){
if(t->ch){
free(t->ch);
t->ch=NULL;
}
t->length=0;
return OK;
}
Status Concat(HString *t,HString *s1,HString *s2){
t->ch=(char*)malloc((s1->length+s2->length)*sizeof(char));
if(!t->ch){
exit(1);
}
for(int i=0;i<s1->length;i++){
t->ch[i]=s1->ch[i];
}
t->length=s1->length+s2->length;
for(int j=0;j<s2->length;j++){
t->ch[s1->length+j]=s2->ch[j];
}
return OK;
}
Status SubString(HString *sub,HString *t,int pos,int len){
if(pos<1||pos>t->length||len<0||len>t->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));
for(int i=0;i<len;i++){
sub->ch[i]=t->ch[pos-1+i];
}
sub->length=len;
}
return OK;
}
----------------------------------------------------------------
运行结果:
18
hello string world
s与p两个字符串相等
hello string worldhello string world
ello stri
--------------------------------
Process exited after 0.1562 seconds with return value 0
请按任意键继续. . .