数据结构---字符串

来源:互联网 发布:直通车卡首屏软件 编辑:程序博客网 时间:2024/04/26 23:06

字符串的实现及操作:

#include <malloc.h>

#define  OK     1
#define  ERROR  0
#define  OVERFLOW -2

typedef 
struct
{
    
char *ch;
    
int length;
}
HString;

//清空
void ClearString(HString *s)
{
    
if(s->ch)
    
{
        free(s
->ch);
        s
->ch=NULL;
    }

    s
->length=0;
}

//赋值
int StrAssign(HString *s,char *chars)
{
    
char *c=chars;
    
int i;
    
if(s->ch)
        free(s
->ch);
    
for(i=0;*c;i++,c++);
    
if(!i)
    
{
        s
->ch=NULL;
        s
->length=0;
    }

    
else
    
{
        s
->ch=(char *)malloc(i*sizeof(char));
        
if(!s->ch)
        
{
            
return OVERFLOW;
        }

        s
->length=i;
        
for(;i>0;i--)
            s
->ch[i-1]=chars[i-1];
    }

    
return OK;
}

//计算长度
int StrLength(HString s)
{
    
return s.length;
}

//字符串的比较
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;
}


void get_next(HString s,int *next)
{
    
int i=0,j=-1;
    next[
0]=-1;
    
while(i<s.length-1)
    
{
        
if(j==-1||s.ch[i]==s.ch[j])
        
{
            
++i;
            
++j;
            next[i]
=j;
        }

        
else
            j
=next[j];
    }

}


void get_nextval(HString s,int *nextval)
{
    
int i=0,j=-1;
    nextval[
0]=-1;
    
while(i<s.length-1)
    
{
        
if(j==-1||s.ch[i]==s.ch[j])
        
{
            
++i;
            
++j;
            
if(s.ch[i]!=s.ch[j])
                nextval[i]
=j;
            
else
                nextval[i]
=nextval[j];
        }

        
else
            j
=nextval[j];
    }

}

//KMP算法
int Index_kmp(HString s,HString t,int pos,int *next)
{
    
int i=pos-1;
    
int j=0;
    
while(i<s.length&&j<t.length)
    
{
        
if(j==-1||s.ch[i]==t.ch[j])
        
{
            
++i;
            
++j;
        }

        
else
            j
=next[j];
    }

    
if(j>=t.length) 
        
return i-t.length+1;
    
else
        
return 0;
}

//简单模式匹配算法
int Index(HString s,HString t,int pos)
{
    
int i=pos-1;
    
int 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;
}


//字符串连接
int Concat(HString *T,HString S1,HString S2)
{
    
int i;
    
if(T->ch)
        free(T
->ch);
    T
->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
    
if(!T->ch)
        
return 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];
    T
->length=S1.length+S2.length;
    
return OK;
}

//插入字符串
int Insert(HString *s,HString *t,int pos)
{
    
int j=0;char *newbase;
    
int index=StrLength(*s);
    
int intval=StrLength(*t);

    newbase
=(char *)realloc(s->ch,(index+intval)*sizeof(char));
    
if(!newbase)
        
return OVERFLOW;

//    for(int i=0;i<index;i++)
//    {
//        newbase[i]=s->ch[i];
//    }
    s->ch=newbase;
    s
->length=index+intval;
    
while(index>=pos)
    
{
        s
->ch[index-1+intval]=s->ch[index-1];
        index
--;
    }

    
while(j<intval)
    
{
        s
->ch[index]=t->ch[j];
        index
++;
        j
++;
    }

    
return OK;
}

/*显示串T*/
void StrPrint(HString T)
{
    
for(int i=0;i<T.length;i++)
        putchar(T.ch[i]);
        
    
// printf("%s",T.ch);
}

/*取回文子串*/
void IndexSubString(HString s,int &index,int &interval)
{
    
int r=0;
    index
=0;
    interval
=0;
    
for(int i=0;i<s.length;i++)
    
{
        r
=0;
        
while(i-r>=0&&i+r<s.length)
        
{
            
if(s.ch[i-r]==s.ch[i+r])
                r
++;
            
else
                
break;
        }

        
if(interval<r-1)
        
{
            interval
=r-1;
            index
=i;
        }

    }

}

/*打印回文子串*/
void PrintSubString(HString s,int index,int interval)
{
    
for(int i=index-interval;i<=index+interval;i++)
        printf(
"%c",s.ch[i]);
}



int main(int argc,char* argv[])
{
    HString str1
={NULL,0},str2={NULL,0},str3={NULL,0};

    
int next[11];

    ClearString(
&str1);
    printf(
"the string is: ");
    StrAssign(
&str1,"helloworld");
    StrAssign(
&str1,"acabaabcaabaabcac");

    printf(
" the length is%d  ",str1.length);

    StrAssign(
&str2,"abaabcac");
    StrAssign(
&str2,"abc");

    get_next(str2,
&next[0]);
    get_next(str2,next);
    get_nextval(str2,
&next[0]);
    printf(
"the index is: %d  ",Index_kmp(str1,str2,1,next));

    printf(
"the index is: %d  ",Index(str1,str2,1));
    printf(
"the result is: %d  ",StrCompare(str1,str2));
    
    Concat(
&str3,str1,str2);
    StrPrint(str3);
    printf(
" the length is%d  ",str3.length);
    Insert(
&str1,&str2,2);
    StrPrint(str1);
    printf(
" ");

    
int index=0;
    
int interval=0;
    StrAssign(
&str1,"abcdddadddcmnd");
    IndexSubString(str1,index,interval);
    PrintSubString(str1,index,interval);
    printf(
" ");
    
return 0;
}

 原文:http://blog.csdn.net/arrowcat/archive/2008/04/02/2244371.aspx
原创粉丝点击