问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构实验,实现串的插入和删除功能

发布网友 发布时间:2022-04-29 22:54

我来回答

1个回答

热心网友 时间:2022-06-25 03:23

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
typedef struct  
{  
    char *str;  
    int length;  
}HeapString;  
  
void InitString(HeapString *S);//串的初始化操作  
void StrAssign(HeapString *S,char cstr[]);//串的赋值操作  
int StrEmpty(HeapString S);//判断串是否为空  
int StrLength(HeapString S);//求串的长度操作  
void StrCopy(HeapString *T,HeapString S);//串的复制操作  
int StrCompare(HeapString S,HeapString T);//串的比较操作  
int StrInsert(HeapString *S,int pos,HeapString T);//串的插入操作  
int StrDelete(HeapString *S,int pos,int len);//串的删除操作  
int StrConcat(HeapString *T,HeapString S);//串的连接操作  
int SubString(HeapString *Sub,HeapString S,int poos,int len);//截取子串操作  
int StrReplace(HeapString *S,HeapString T,HeapString V);//串的替换操作  
int StrIndex(HeapString S,int pos,HeapString T);//串的定位操作  
void StrClear(HeapString *S);//清空串操作  
void StrDestory(HeapString *S);//摧毁串操作  
void StrPrint(HeapString S);//串的输出声明

#include "串.h"  
  
void InitString(HeapString *S)  
{  
    S->length = 0;  
    S->str = '\0';  
}  
void StrAssign(HeapString *S,char cstr[])//串的赋值操作(将常量cstr中的字符赋值给串S)  
{  
    int i = 0,len;  
    if(S->str)  
    {  
        free(S->str);  
    }  
    for(i = 0;cstr[i]!='\0';i++)  
    {  
        ;  
    }  
    len = i;  
    if(!i)  
    {  
        S->length = 0;  
        S->str = '\0';  
    }  
    else  
    {  
        S->str = (char*)malloc(len*sizeof(char));  
        if(!S->str)  
        {  
            exit(-1);  
        }  
        for(i = 0;i < len;i++)  
        {  
            S->str[i] = cstr[i];  
        }  
        S->length = len;  
    }  
}  
int StrEmpty(HeapString S)//判断串是否为空  
{  
    if(S.length == 0)  
    {  
        return 1;  
    }  
    else  
    {  
        return 0;  
    }  
}  
int StrLength(HeapString S)//求串的长度操作  
{  
    return S.length ;  
}  
void StrCopy(HeapString *T,HeapString S)//串的复制操作(将串S中的每一个字符赋给T)  
{  
    int i;  
    T->str = (char*)malloc(S.length*sizeof(char));  
    if(!T->str)  
    {  
        exit(-1);  
    }  
    for(i = 0;i < S.length ;i++)  
    {  
        T->str[i] = S.str[i];  
    }  
    T->length = S.length ;  
}  
int StrCompare(HeapString S,HeapString T)//串的比较操作  
{  
    int i;  
    for(i = 0;i < S.length&&i < T.length ;i++)//比较两个串中的字符  
    {  
        if(S.str[i] != T.str[i])//如果出现字符不同,则返回两个字符的差值  
        {  
            return (S.str[i]-T.str[i]);  
        }  
    }  
    return (S.length - T.length);//如果比较完毕,返回两个字符串的长度的差值  
}  
int StrInsert(HeapString *S,int pos,HeapString T)//串的插入操作(在串S的pos个位置插入串T)  
{  
    int i;  
    if(pos < 0 || pos-1 > S->length)  
    {  
        printf("插入位置不正确\n");  
        return 0;  
    }  
    S->str = (char*)realloc(S->str,(S->length+T.length)*sizeof(char));  
    if(!S->str)  
    {  
        printf("内存分配失败");  
        exit(-1);  
    }  
    for(i = S->length -1;i >= pos-1;i--)  
    {  
        S->str[i+T.length] = S->str[i];  
    }  
    for(i = 0;i < T.length ;i++)  
    {  
        S->str[i+pos-1] = T.str[i];  
    }  
    S->length = S->length + T.length;  
    return 1;  
}  
int StrDelete(HeapString *S,int pos,int len)//串的删除操作(在串S中删除pos开始的len个字符,然后将后面的字符向前移动)  
{  
    int i;  
    char *p;  
    if(pos < 0 || len < 0 || pos+len-1 > S->length)  
    {  
        printf("删除位置不正确,参数len不合法\n");  
        return 0;  
    }  
    p = (char*)malloc(S->length-len);  
    if(!p)  
    {  
        exit(-1);  
    }  
    for(i = 0;i < pos-1;i++)//将串第pos位置之前的字符复制到p中  
    {  
        p[i] = S->str[i];  
    }  
    for(i = pos-1;i < S->length-len;i++)//将串第pos+len位置以后的字符复制到p中  
    {  
        p[i] = S->str[i+len];  
    }  
    S->length = S->length -len;//修改串的长度  
    free(S->str);//释放原来的串S的内存空间  
    S->str = p;//将串的str指向p字符串  
    return 1;  
}  
int StrConcat(HeapString *T,HeapString S)//串的连接操作(将串S连接在串T的后面)  
{  
    int i;  
    T->str = (char*)realloc(T->str ,(T->length +S.length )*sizeof(char));  
    if(!T->str)  
    {  
        printf("分配空间失败");  
        exit(-1);  
    }  
    else  
    {  
        for(i = T->length ;i < T->length +S.length ;i++)//将串S直接连接到T的末尾  
        {  
            T->str[i] = S.str[i-T->length];  
        }  
        T->length = T->length +S.length ;//修改串T的长度  
    }  
    return 1;  
}  
int SubString(HeapString *Sub,HeapString S,int pos,int len)//截取子串操作(截取串S中从第pos个字符开始,长度为len的连续字符,并赋值给Sub)  
{  
    int i;  
    if(Sub->str)  
    {  
        free(Sub->str);  
    }  
    if(pos < 0 || len < 0 || pos+len-1 > S.length)  
    {  
        printf("参数pos和len不合法\n");  
        return 0;  
    }  
    else  
    {  
        Sub->str = (char*)malloc(len*sizeof(char));  
        if(!Sub->str)  
        {  
            printf("存储分配失败");  
            exit(-1);  
        }  
        for(i = 0;i < len;i++)  
        {  
            Sub->str[i] = S.str[i+pos-1];  
        }  
        Sub->length = len;  
        return 1;  
    }  
}  
int StrIndex(HeapString S,int pos,HeapString T)//串的定位操作(在主串S中的第pos个位置开始查找子串T,如果主串S中存在与串T值相等的子串,返回子串在主串第pos个字符后第一次出现的位置)  
{  
    int i,j;  
    if(StrEmpty(T))  
    {  
        return 0;  
    }  
    i = pos;  
    j = 0;  
    while(i < S.length && j < T.length)  
    {  
        if(S.str[i] == T.str[j])  
        {  
            i++;  
            j++;  
        }  
        else//如果当前对应位置的字符不相等,则从串S的下一个字符开始,从T的第0个字符开始比较  
        {  
            i = i-j+1;  
            j = 0;  
        }  
    }  
    if(j >= T.length)//如果在串S中找到串T,则返回子串T在主串S中的位置  
    {  
        return i-j+1;  
    }  
    else  
    {  
        return -1;  
    }  
}  
int StrReplace(HeapString *S,HeapString T,HeapString V)//串的替换操作(如果串S中存在子串T,则用V替换串S中的所有子串T)  
{  
    int flag;  
    int i = 0;  
    if(StrEmpty(T))  
    {  
        return 0;  
    }  
    do  
    {  
        i = StrIndex(*S,i,T);//利用串的定位操作在串S中查找T的位置  
        if(i)  
        {  
            StrDelete(S,i,StrLength(T));//如果找到子串T,则将S中的串T删除  
            flag = StrInsert(S,i,V);//将V插入  
            if(!flag)  
            {  
                return 0;  
            }  
            i += StrLength(V);  
        }  
    }while(i);  
    return 1;  
}  
void StrClear(HeapString *S)//清空串操作  
{  
    if(S->str)  
    {  
        free(S->str);  
    }  
    S->str = '\0';  
    S->length = 0;  
}  
void StrDestory(HeapString *S)//摧毁串操作  
{  
    if(S->str)  
    {  
        free(S->str);  
    }  
}  
void StrPrint(HeapString S)//串的输出声明  
{  
    int i;  
    for(i = 0;i < S.length ;i++)  
    {  
        printf("%c",S.str[i]);  
    }  
    printf("\n");  
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
修复征信是不是真的? 市面上征信修复公司可靠吗? 征信修复公司是真是假,真的可以修复吗? Emulex FC HBA卡 皮肤毛囊炎怎样治 银行自动扣款什么原因 银行什么情况自动扣款 贷款自动扣款什么意思 粤省事办理准生证需要多久 粤省事办理准生证步骤 为什么于嘉说山猫队和网队的比赛,少了易建联山猫进攻都没那么流畅了... Linux C函数实例速查手册的目录 java kmp算法中的 kmp 是什么意思? 《数据结构》在线作业 数据结构 串中 i为什么小于等于n-m+1 进口的三菱劲炫的车载一体导航dvd,播放视频用的什么格式,为什么有的avi可以播放,有的不能播放 三菱劲炫有没有保留原车CD机车载导航一体机 C语言数据结构串的模式匹配算法问题 三菱劲炫里MP3改名wav有用吗 数据结构串的基本操作的实现 求广汽三菱新劲炫原车CD机头DIY家用CD机教程!!! 数据结构串匹配十大经典算法 三菱劲炫装了导航usb不能充电 三菱劲炫车上怎么放音乐 求解数据结构c语言中串的问题 三菱劲炫U盘下载的歌分了几个文件夹怎么调换 数据结构题,假如s=&#39;abcba&#39;。index(s,&#39;b&#39;,1)=?能具体解释解释吗 编写函数Index(String S,String T,int pos),返回子串T在主串S中第一次出现的位置pos 三菱劲炫1.6标准版可以用u盘放歌吗? 劲炫自带的CD,能播放U盘里的wav格式吗 一道数据结构题 用C语言编个程序,用数据结构体和函数! 拿沐浴露洗衣服可以吗 沐浴露能洗衣服吗 m 香泽秀和祖马龙关系 我问一下之前在网上看到了一个低配骁龙845还有高通骁龙845那小米8是什么处理器? 急求让我们荡起双桨 钢琴伴奏曲 谁知道“小船儿轻轻,飘荡在水中”这句歌词 是哪首歌里的?如题 谢谢了 求大神赐教,为啥nike的dunk和aj的29low都那么硬,而且买的人还不少,尤其是29low, 祖国的花朵二胡音乐和歌词 dunk洗完变硬 祖国的花朵 歌词 nike熊猫dunk板鞋太硬怎么办 祖国的花朵的音乐原声 nike dunk low 穿起来觉得整双鞋很硬是怎么回事啊 穿久了会变软吗 《祖国的花朵》整首歌词拼音 DUNK很硬么 nike dunk sb 鞋底好硬 鞋垫脚跟处的气垫中间有块垫子,而不是完全的空气,是真鞋吗? 让我们荡起双桨是一首什么的歌词 为什么nike dunk 的后帮会很软不想别的鞋款后帮处很硬捏不动? 求歌名,有一句歌词是我们都是中国的花朵请你要好好爱护我