数据结构--串的堆存储

来源:互联网 发布:微软程序员工资级别 编辑:程序博客网 时间:2024/05/19 03:29

以一组地址连续的存储单元存放串值字符序列,这些存储空间是在程序执行过程中动态分配的。在C语言中,存在一个称之为“堆”的自由存储区,并利用malloc()和realloc()来管理。

优点:堆分配存储结构的串既有顺序存储结构的特点,处理方便,操作中对串长又没有任何限制,更加的灵活。

存储结构为:

typedef struct{  char *ch;  int length;}HString;
堆存储串的基本操作
//串的堆分配存储#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;typedef struct{  char *ch;  int length;}HString;Status StrAssign(HString &S,char *chars){  if(S.ch) free(S.ch);  int len=strlen(chars);  if(!len)  {    S.ch=NULL;    S.length=0;  }  else  {    S.ch=(char *)malloc(len*sizeof(char));    if(!S.ch) exit(OVERFLOW);    for(int i=0;i<len;i++)      S.ch[i]=chars[i];    S.length=len;  }  return OK;}Status InitStr(HString &S){  S.ch=NULL;  S.length=0;  return OK;}Status ClearStr(HString &S){  if (S.ch)  {    free(S.ch);    S.ch=NULL;  }  S.length=0;  return OK;}Status StrCopy(HString &T,HString S){  if(T.ch) free(T.ch);  T.ch=(char *)malloc(S.length*sizeof(char));  if(!T.ch) exit(OVERFLOW);  for(int i=0;i<S.length;i++)  {    T.ch[i]=S.ch[i];  }  T.length=S.length;  return OK;}int StrLength(HString S){  return S.length;}Status StrEmpty(HString S){    return S.length==0?true:false;}int StrCompare(HString S,HString T){  for(int i=0;i<S.length&&i<T.length;i++)    if(S.ch[i]!=T.ch[i]) return S.ch[i]-T.ch[i];  return S.length-T.length;}Status SubString(HString &Sub,HString S,int pos,int len){  if(pos<1||pos>S.length||len<0||len>S.length-pos+1)    return ERROR;  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(OVERFLOW);    for(int i=0;i<len;i++)      Sub.ch[i]=S.ch[pos+i-1];    Sub.length=len;  }  return OK;}Status Concat(HString &T,HString S1,HString S2){  int i;  if(T.ch) free(T.ch);  T.length=S1.length+S2.length;  T.ch=(char *)malloc(sizeof(char));  if(!T.ch) exit(OVERFLOW);  for(i=0;i<S1.length;i++)    T.ch[i]=S1.ch[i];  for(i=0;i<S2.length;i++)    T.ch[S1.length+i]=S2.ch[i];  return OK;}int Index(HString S,HString T,int pos){  if(pos<1||pos>S.length) return ERROR;  int i=pos-1,j=0;  while (i<S.length&&j<T.length)  {    if(S.ch[i]==T.ch[j])    {      ++i;      ++j;    }    else    {      i=i-j+1;      j=0;    }  }  if(j>=T.length) return i-T.length+1;  else return 0;}Status StrInsert(HString &S,int pos,HString T){  if(pos<1||pos>S.length+1) return ERROR;  if (T.length)  {    S.ch=(char *)realloc(S.ch,(S.length+T.length)*sizeof(char));    if(!S.ch) exit(OVERFLOW);    for(int i=S.length-1;i>=pos-1;i--)      S.ch[i+T.length]=S.ch[i];    for(int i=0;i<T.length;i++)      S.ch[pos-1+i]=T.ch[i];    S.length=S.length+T.length;  }  return OK;}Status StrDelete(HString &S,int pos,int len){  if(pos<1||pos>S.length||len<0||len>S.length-pos+1)    return ERROR;  for(int i=pos-1+len;i<S.length;i++)    S.ch[i-len]=S.ch[i];  S.length=S.length-len;  S.ch=(char *)realloc(S.ch,S.length*sizeof(char));  return OK;}Status Replace(HString &S,HString T,HString V){  int i=1;  do  {    i=Index(S,T,i);    if (i)    {      StrDelete(S,i,StrLength(T));      StrInsert(S,i,V);      i+=StrLength(V);    }  }while(i);  return OK;}Status StrPrint(HString S){  for (int i=0;i<S.length;i++)  {    printf("%c",S.ch[i]);  }  printf("\n");}