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

运行截图。

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

下次自己申请了一个指针,就得初始化,不然在判断是否为空的操作下,会导致程序停止运行。(传说中的敲代码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;
 } 
时间: 2024-11-09 22:20:35

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

C语言数据结构——第四章 串

四.串 4.1-串的基本概念 串的定义 串是由数字.字母或其他字符组成的有限序列,一般记为 StringName = “a[0]a[1]a[2]···a[i]···a[n-1]”(n>0,0<=i<=n-1) 其中StringName是串名,双引号内的序列是该串的值,n为串的长度,i为某一字符在该串中的下标 串的常用术语 串的长度:串中包含字符个数即为串的长度 空串:串中不包含任何字符时被称为空串,此时串的长度为0 空格串:由一个或多个空格组成的串被称为空格串,它的长度是串中空格的个数

第四章 串和数组 (主要kmp算法)

第四章 题目:串的模式匹配 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. (用KMP算法,就是不用再回溯, 最前面的k个字符和j之前的最后k个字符是一样的:P[1~ k] == P[j-k ~ j-1]) 1.先定义一个串的顺序存储结构,因为不需要出插入和删除操作,所以选用了顺序存储 typedef struct { char ch[maxlen + 2]; int length

【数据结构】第四章学习小结

串.数组 在第四章中,我学到的主要是关于串与数组的内容,至于广义表,既然老师让我们课后有时间去看,那我这里就先不讲广义表了(其实只是粗略的看了一下,还没看懂) 在上学期的c++中我就已经学过有关串的一些知识,对于串还是可以很好的理解的,在数据结构中,串将被看作是一种特殊的线性表,跟线性表一样,串也有两种基本存储结构,个人觉得顺序存储结构对于串的运用比较方便,简单易懂,所以在作业题中会首先考虑使用顺序串. 串有许多很重要的应用,例如搜索引擎,数据压缩等,这些应用都离不开串的模式匹配算法(子串的定位

数据结构第四章总结

数据结构第四章学习的是串,数组和广义表(广义表课程中没讲,问题不大) 串的定义其实在c++学习中就有所接触,所以这里不详说,  重点说的是两个串模式匹配算法 1.BF算法 BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符: 若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果.BF算法是一种蛮力算法. 2.KMP算法 KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

数据结构 【实验 串的基本操作】

一.实现主要功能为: 1.输入模式串.目标串 2.根据目标串生成next[]和nextval[]数组 3.根据next[]或者nextval[]进行匹配. 二.程序截图: 三.代码: 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 #define MAXSIZE 1000 //最大

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树 >=左子树的所有key,<=右子树的所有key 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成. h>=(lgn向下取整) 和快速排序算法一样,其平均性能更接近于最好情形. 随机构建二叉搜索树期望高度为O(lgn). 各种操作请自行查阅. 第十三章 红黑树 是一种(近似)平衡的二叉搜索树.可以保证在最坏情况下基本动态集合操作的时

数据结构第四章小结

任选本章一道题目,谈谈你解决该题的心得体会.同时谈谈你对上次制定目标的完成情况, 以及接下来的目标. 一.第四章主要学习了串,我觉得最重要的两个内容,一个是AI核心代码,一个是稀疏矩阵的十字链表压缩存储:AI核心代码呢,老师在课堂上讲了一部分,自己也接受了挺多的,当天我就趁热打铁在通识课上回味了一下,老师有留给我们自己完成can you 的那一部分内容,之前有一部分是you变成I,我参照着之前的自己写了一遍,但是一开始出现了错误,又重新写了好几遍,但是总是会出现warning,可能是溢出的问题,

数据结构第四章学习小结

第四章主要是串和数组的学习,之前对串和数组的应用仅限于对其单独处理,本章学习着重于对具体题目的实际操作,实践了串的模式匹配算法,对其有了更深入的了解,数组的应用拓展到了稀疏矩阵的存储的实现. 一.串 串的模式匹配 BF算法 首先未匹配到串尾时,将两个字符串一一匹配,可用C++自带的length()函数实现 while(i<=S.length()&&j<=T.length()) 接下来就是匹配的过程 if(S[i]==T[j]){ i++;j++; }//若匹配则继续比较下一位