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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四章 串的基本操作数据结构相关的知识,希望对你有一定的参考价值。

运行截图。

技术分享

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

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

 

#include<stdio.h>
#include<string.h> 
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define MAXSIZE 1000
typedef 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 ;
}
//用T返回由s1和s2连接而成的新串
Status Contact(HString &T,HString s1,HString s2)
{
    if(T.ch)
        free(T.ch);//释放旧空间
     
    
} 
//清空串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;
 } 

 

以上是关于第四章 串的基本操作数据结构的主要内容,如果未能解决你的问题,请参考以下文章

第四章心得体会

第四章内容小结

第四章:1.串 -- 串类型定义及串的表示和实现

数据结构第四章学习心得

第四章:2.串 -- 串的模式匹配算法(KMP)

第四章心得体会