【数据结构】学习数据结构的学习笔记之串

来源:互联网 发布:计算点位软件 编辑:程序博客网 时间:2024/05/21 10:16

        计算机中对非数值处理基本上为字符串数据,对于字符串的处理要比数值处理难度大,因而更为重要!

        串的定义、长度、相等等就不提啦。对串的最小操作集是:

        1、串赋值:StrAssgin

        2、串比较:StrCompare

        3、求串长:StrLength

        4、串联接:Concat

        5、求字串:SubString

        其他操作均可以在以上操作集上实现,例如利用判等、求子串和求串长等即可实现定位函数Index(S,T,pos),算法的基本思想就是:在主串中取从第i(i的初值为pos)个字符起、长度和串T相等的子串和T相比较,相等则说明i即为所求,返回;否则增加i,直至串S中不存在和串T相等的子串为止!

       串的表示及实现:

       1、定长顺序存储表示

       #define  MAXSTRLEN  255

       typedef  unsigned char  SString[MAXSTRLEN + 1];  //0号单元存储字符串的长度

Ps: 下标为0的数组分量存储字符串的长度;串值的后面并没有表示结束的‘\0’,因此显然利于某些串的操作

        2、堆分配存储表示

type  struct{

        char  *ch;      //若非空,则按串长分配存储区,否则ch为NULL

        int     length;//串的长度

}HString;

下面是基于堆分配存储表示的基本操作函数的实现:

Status  StrAssign(Hstring  &T,  char  *chars)

{

//生成值等于串常量的串T

if(T.ch)    free(T.ch);

for(i=0,  c  =  chars;  c;  ++i,  ++c) ;

if( ! i )   {  T.ch  =  NULL;  T.length  =  0;}

else

{

if( !( T.ch =  (char  *)malloc(i  *  sizeof(char))))    exit(OVERFLOW);

T.length  =  i;

for(  ;  i  >  0;  i--)    T.ch[i]  =  chars[i];

}

return  OK;

}//StrAssign


itn  Strlength(HString  S)

{

//返回S的元素个数,即串的长度

return  S.length;

}//StrLength


int  StrCompare(HString  S,  HString  T)

{

//若S > T,则返回值大于零;若S = T,则返回值为零;否则小于零

int  i;

for( 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;

}//StrCompare


Status  ClearString(HString  &S)

{

//将S清空

if(S.ch)    { free(S.ch);  S.ch = NULL;}

S.lenght  =   0;

return  OK;

}//ClearString


Status  Concat(HString  &T,  HString  S1,  HString  S2)

{

//用T返回由串S1和S2联接而成的新串

       int  i;

       if( ! T.ch)    free(T.ch);  //将原来的空间释放

if( ! (T.ch  =  (char  *)malloc((S1.length  +  S2.length)*sizeof(char))))    exit(OVERFLOW);

       for(i  = 0;  i < S1.length-1;  i++)    T.ch[i]  =  S1.ch[i];

T.length  =  S1.length  +  S2.length;

       for(  ;  i < T.length-1;  i++)    T.ch[i]  =  S2.ch[i - S1.length + 1];

return  OK;

}//Concat


Status  SubString(HString  &Sub,  HString  S,  int  pos,  int  len)

{

//用Sub返回串S的第pos个字符起,长度为len的子串

//其中1<=pos<=S.length且0<=len<=S.length -pos +1

int  i;

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));

for( i  =  0;  i < len;  i++)    Sub.ch[i]  =  S.ch[pos + i - 1];

Sub.length  =  len;

}

return  OK;

}//SubString


以上即串操作基于堆分配存储的基本操作,串的存储还有另外一种表示方式,即串的块链存储表示!由于其操作比较复杂,我也是刚接触数据结构,在此不再引出。对于串还有比较重要的匹配模式算法:


int  Index(SStinrg  S,  SString  T, int  pos)

{

//返回子串T在主串S中的位置,用pos返回第一个字符的位置

//其中,T非空,且1 <= pos<=Strlength(S)

i  =  pos;

while( i <= S[0]  &&  j <=  T[0])

        {

if(S[i]  ==  T[j])    {++i;  ++j;}  //比较后续字符

else  {i  =  i - j + 2;  j = 1;}  //指针退后重新比较

}

if(j > T[0])   return  i - T[0];

else    return  0;

}//Index


以上就是本文所讲的内容了,希望大家批评指正,这也是第一次发博文,还望各位大侠不吝赐教!

(文基本操作出自我们正在学习的课本,这是第二遍看时的笔记)

0 0
原创粉丝点击