数据结构C-8-字符串

1

//定长顺序存储
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 255
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
typedef int Status;
typedef unsigned char SString[MAXSIZE+1];;

void StrAssign(SString s,char *ch);
int StrLength(SString s);
int StrCompare(SString s,SString t);
Status StrClear(SString s);
Status StrConcat(SString s,SString s1,SString s2);
void Display(SString s);

int main(void){
    SString str1,str2 ,str3;
    StrAssign(str1,"abmd");
    printf("第一个字符串为:");
    Display(str1);
    StrAssign(str2,"abcde");
    printf("第二个字符串为:");
    Display(str2);

    printf("比较串的大小:0代表相等,-1代表第一个串比第二个串大,1代表第一个串比第二个串小\n");
	printf("s1:");Display(str1);printf("s2:");Display(str2);
	printf("S串与T串:%d\n", StrCompare(str1, str2));

	StrConcat(str3,str1,str2);
	printf("s1与s2连接后的新字符串为");
	Display(str3);
    return 0;
}
void StrAssign(SString s,char *ch){
    int i=0,j;
    while(ch[i]!='\0')
        i++;
    if(i==0)
        s[0]=0;
    else{
        s[0]=i;
        for(j=0;j<i;j++)
            s[j+1]=ch[j];
    }
}
int StrLength(SString s){
    return s[0];
}
int StrCompare(SString s,SString t){
    int i;
    for(i=1;i<s[0]&&i<t[0];i++){
        if(s[i]<t[i])
            return -1;
        else if(s[i]>t[i])
            return 1;
    }
    if(s[0]-t[0]<0)
        return -1;
    else if(s[0]-t[0]>0)
        return 1;
    else
        return 0;
}
Status StrClear(SString s){
    s[0]=0;
    return OK;
}
Status StrConcat(SString s,SString s1,SString s2){
    int i,j;
    s[0]=s1[0]+s2[0];
    if(s[0]>MAXSIZE)
        s[0]=MAXSIZE;
    for(i=1;i<=s1[0];i++)
        s[i]=s1[i];
    i=s1[0];
    for(j=1;j<=s2[0]&&i+j<=MAXSIZE;j++)
        s[i+j]=s2[j];
    return OK;
}
void Display(SString s){
    for(int i=1;i<=s[0];i++){
        printf("%c",s[i]);
    }
    printf("\n");
}
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct SString{
    char ch[MAXSIZE+1];
    int length;
}SString;
void StrAssign(SString *s,char chs[]);
void StrCopy(SString *s1,SString *s2);
int StrLength(SString *s);
int StrCompare(SString *s1,SString *s2);
void StrClear(SString *s);
void StrConcat(SString *s,SString *s1,SString *s2);
void SubString(SString *sub,SString *s,int pos,int len);
void StrInsert(SString *s1,int pos,SString *s2);
int Replace(SString *s,SString *t,SString *v,int pos);
void Replace_ALL(SString *s,SString *t,SString *v);
int Index(SString *s,SString *t,int pos);
void StrDelete(SString *s,int pos,int len);
void Display(SString s);

int main(void){
    SString s1,s2,s3;SString t;
    StrAssign(&s1,"abcabcabc");StrAssign(&t,"bc");
    Display(s1);Display(t);
    printf("s1串长度为:%d\n",StrLength(&s1));

    StrCopy(&s2,&s1);
    StrConcat(&s3,&s1,&t);
    StrInsert(&s1,2,&t);
    StrDelete(&s1,3,3);
    printf("比较串的大小:0代表相等,-1代表第一个串比第二个串大,1代表第一个串比第二个串小\n");
	printf("s1:");Display(s1);printf("s2:");Display(s2);
	printf("S串与T串:%d\n", StrCompare(&s1, &s2));
    return 0;
}
void StrAssign(SString *s,char chs[]){
    int i=0;
    while(chs[i]!='\0'){
        s->ch[i]=chs[i];
        i++;
    }
    s->length=i;
}
void StrCopy(SString *s1,SString *s2){
    for(int i=0;i<s2->length;i++){
        s1->ch[i]=s2->ch[i];
    }
    s1->length=s2->length;
    printf("复制后新串为:");
    Display(*s1);
}
int StrLength(SString *s){
    return s->length;
}
int StrCompare(SString *s1,SString *s2){
    int i=0;
    while(i<s1->length&&i<s2->length){
        if((int)s1->ch[i]>(int)s2->ch[i])
            return 1;
        else if((int)s1->ch[i]<(int)s2->ch[i])
            return -1;
        else {
            ++i;continue;
        }
        ++i;
    }
    if(i==s1->length&&i!=s2->length)
        return -1;
    else if(i==s2->length&&i!=s1->length)
        return 1;
    else
        return 0;
}
void StrClear(SString *s){
    s->length=0;
}
void StrConcat(SString *s,SString *s1,SString *s2){
    for(int i=0;i<s1->length;i++){
        s->ch[i]=s1->ch[i];
    }
    s->length=s1->length;
    for(int i=0;i<s2->length;i++){
        s->ch[s->length++]=s2->ch[i];
    }
    printf("新串结果为:");
    Display(*s);
}
void SubString(SString *sub,SString *s,int pos,int len){//返回子串
    if(pos<1||pos>s->length||len<0||len>s->length-pos+1)
        printf("子串输入有误\n");
    for(int i=0;i<len;i++){
        sub->ch[i]=s->ch[pos-1];
        i++;pos++;
    }
    sub->length=len;
}
void StrInsert(SString *s1,int pos,SString *s2){//s1的pos位置插入s2
    if(pos<1||pos>s1->length)
            printf("插入有误\n");
    for(int i=s1->length;i>=pos-1;i--){
        s1->ch[i+s2->length]=s1->ch[i];
    }
    for(int i=0,k=pos-1;i<s2->length;i++,k++){
        s1->ch[k]=s2->ch[i];
    }
    s1->length+=s2->length;
    printf("插入后的结果为:");
    Display(*s1);
}
int Replace(SString *s,SString *t,SString *v,int pos){//用v替换从pos开始的第1个t
    int index=Index(&s,&t,pos);
    if(index<0)
        return -1;
    StrDelete(&s,index,t->length);
    StrInsert(&s,index,&v);
    return 1;
}
void Replace_ALL(SString *s,SString *t,SString *v){
    while(Replace(&s,&t,&v,0));
    return 1;
}
int Index(SString *s,SString *t,int pos){//模式匹配:返回t在s中第pos的字符之后的位置
    if(pos<1||pos>s->length){
        printf("匹配有误\n");return 0;
    }
    int i=pos,j=0;
    while(i<=s->length&&j<=t->length){
        if(s->ch[i-1]==t->ch[j]){
            i++;j++;
        }
        else{
            i=i-j+1;j=0;//退回到上次匹配的首地址
        }
    }
    if(j==t->length)
        return i-t->length;
    else
        return 0;
}
void StrDelete(SString *s,int pos,int len){
     if(pos<1||pos>s->length-len+1){
        printf("删除有误\n");
    }
    int i;
    for(i=pos;i<=s->length;i++){
        s->ch[i]=s->ch[i+len];
    }
    s->length-=len;
    printf("删除后的结果为:");
    Display(*s);
}
void Display(SString s){
    for(int i=0;i<s.length;i++){
        printf("%c",s.ch[i]);
    }
    printf("\n");
}
发布了24 篇原创文章 · 获赞 9 · 访问量 2740

猜你喜欢

转载自blog.csdn.net/fancyZT/article/details/104664569