第四章 串的基本操作【数据结构】

来源:互联网 发布:淘宝商品名称 编辑:程序博客网 时间:2024/06/07 07:02

运行截图。

自己太久没有这样用过指针了,总是用不好~~

下次自己申请了一个指针,就得初始化,不然在判断是否为空的操作下,会导致程序停止运行。(传说中的敲代码5分钟,debug2小时又被我碰上了,泪目)。


#include<stdio.h>#include<string.h> #include<stdlib.h>#include<malloc.h>#define ERROR 0#define OK 1#define MAXSIZE 1000typedef int Status;//------串的堆存储表示-------- typedef struct{    char *ch;//若是非空串,则按串长分配存储区,否则ch为NULL     int length;//串长度 }HString;//--------------------------------------基本操作的算法描述--------------------- //生成一个其值等于串常量chars的串T Status StrAssign(HString *T,char *chars){    int i,j;    char *c;    if(T->ch)        free(T->ch);//释放T原有的存储空间     for(i = 0,c = chars;*c; c++,i++);//求chars串的长度     if(!i)    {        T->ch = NULL;        T->length = 0;    }    else    {        T->ch = (char*)malloc(i*sizeof(char));        if(!T->ch)            exit(0);        j = 0;        while(j < i)        {            T->ch[j] = chars[j++];        }        T->length = i;    }    return OK;}//返回串S的长度int StrLength(HString S) {    return S.length;}//若S>T,返回值>0;若S==T,返回值=0;若S<T,返回值<0 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 ;}//清空串S Status ClearString(HString &S){    if(S.ch)    {        free(S.ch);        S.ch = NULL;    }    S.length = 0;    return OK;}//连接串s1和串s2,用T返回 Status Concat(HString &T,HString s1,HString s2){    int i = 0,j;    if(T.ch)        free(T.ch);//释放旧空间     T.ch = (char*)malloc((s1.length + s2.length )*sizeof(char));    if(!T.ch)        exit(0);    while(i < s1.length)    {        T.ch[i] = s1.ch[i++];    }    T.length = s1.length + s2.length ;    j = 0;    while(j < s2.length)    {        T.ch [i++] = s2.ch[j++];    }    return OK;}//返回串s的第pos个字符起长度为len的子串Status SubString(HString &sub,HString s,int pos,int len){    int i = 0;    if(pos < 1||pos > s.length || len < 0||len > s.length -1)        return ERROR;    if(sub.ch)        free(sub.ch);    if(!len)//空子串     {        sub.ch = NULL;        sub.ch = 0;    }    else//完整子串     {        sub.ch = (char*)malloc(len*sizeof(char));        while(i < len)        {            sub.ch[i] = s.ch[pos+i-1];            i++;        }        sub.length = len;    }    return OK;} //在S串的第pos个字符前插入串T Status StrInsert(HString &S,int pos,HString T){    if(pos < 0||pos > S.length-1)//pos 不合法         return ERROR;    if(T.length)//T非空,则重新分配存储空间,插入T     {        S.ch = (char*)realloc(S.ch, (S.length + T.length)*sizeof(char));        if(!S.ch)            exit(0);        for(int i = S.length-1; i >= pos-1;i--)//为插入T 腾出位置             S.ch[i+T.length] = S.ch[i];        for(int i = 0; i < T.length ; i ++)//插入T             S.ch[i+pos-1] = T.ch[i];        S.length += T.length ;            S.ch[S.length] = '\0';    }    return OK;}int main(){    char s1[MAXSIZE],s2[MAXSIZE];    HString SS,T,sub,S1,S2;    int flag,pos,len;    printf("请输入串S1和串S2\n");    while(scanf("%s %s",s1,s2),s1[0]!='#'&&s2[0]!='#')    {        T.ch = SS.ch = NULL;        StrAssign(&SS,s1);//创建串T        StrAssign(&T,s2); //创建串S         printf("S串为:\n");        for(int i = 0;SS.ch[i]!='\0';i++)            printf("%c",SS.ch[i]);        printf("\n");        printf("T串为:\n");        for(int i = 0; T.ch[i]!='\0';i ++)            printf("%c",T.ch[i]);        printf("\n\n");                printf("S串的长度为%d\n\n",StrLength(SS));                flag = StrCompare(SS,T);//比较两串        if(flag > 0)            printf("S串>T串\n\n");        else if(flag == 0)            printf("S串=T串\n\n");        else            printf("S串<T串\n\n");        S1.ch = S2.ch = NULL;        StrAssign(&S1,s1);//创建串S1         StrAssign(&S2,s2);//创建串S2         Concat(T,S1,S2);//将串s1和串s2连接        printf("连接后的串T为:\n");        for(int i = 0;T.ch[i]!='\0';i++)            printf("%c",T.ch[i]);        printf("\n\n");                printf("请输入要在S中输出的子串的位置pos和长度\n");         scanf("%d%d",&pos,&len);        SubString(sub,SS,pos,len);//返回串s的第pos个字符起长度为len的子串         printf("子串为:\n");        for(int i = 0; sub.ch[i]!='\0';i ++)            printf("%c",sub.ch[i]);        printf("\n");                StrInsert(SS,pos,T);//在串S的第pos个位置前插入串T        printf("在第%d个位置前入串T后的串S为:\n",pos);        for(int i = 0;SS.ch[i]!='\0';i++)             printf("%c",SS.ch[i]);        printf("\n");                ClearString(SS);//清空串S    }    return 0; } 

原创粉丝点击