数据结构--串的基本操作

这篇具有很好参考价值的文章主要介绍了数据结构--串的基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

第五话 数据结构之串

文章目录

  • 一、了解什么是串
  • 二、串的基本特征
  • 三、串的基本操作
    • 串的初始化
    • 串的输出 
  • 四、串的匹配模式
  • 五、总结

前言

串(即字符串)是一种特殊的线性表,在信息检索、文本编辑等领域有广泛的应用。其特殊性体现在组成线性表的每个数据元素是单个字符,而由一个个字符串起的字符串却是最基本的非数值数据,在操作过程中常常作为一个整体来处理。研究串的特点、存储结构和基本操作实现,是非常有必要的。

一、串的定义

1.串的定义

串是由零个或任意多个字符组成有限序列。一般记为:s="a1a2a3...an"(n>=0)

串可以是字母、数字或其他字符,n为串的长度。

2.串的相关术语

(1)空串。不含任何字符的串称为空串,即串的长度n=0时,称为空串。

(2)空格串。由一个或多个称为空格的特殊字符组成的串称为空格串,其长度是串中空格字符的个数。

(3)子串。串中任意连续的字符组成的子序列称为该串的子串。另外,空串是任意串的子串,任意串是自身的子串。

(4)主串。包含子串的串称为该子串的主串。

(5)匹配模式。子串的定位运算又称为串的匹配模式,是一种求子串在主串中第一次出现的第一个字符的位置。

(6)串相等。两个串的长度相等且各个位置上对应的字符也都相同。

二、串的基本特征

对照串的定义和线性表的定义可知,串是一种其数据元素固定为字符的线性表。但是,串的基本操作对象和线性表的操作对象却有很大的不同。线性表上的操作是针对其某个元素进行的,而串上的操作主要是针对串的整体或串的一部分子串进行的。这也是把串单独作为一章的原因。

三、串的基本操作 

1.定义存储结构--顺序存储

#include<stdio.h>
#include<stdlib.h>
#define maxsize 80
typedef char Elemtype;
typedef struct{
    Elemtype date[maxsize];
    int Len;
}String;

2.将串进行初始化

String *init_string()
{
    String *s;
    s = (String*)malloc(sizeof(String));
    if(s!=NULL){
        s->Len=0;
    }
    return s;
}

3. 创造一个串并求其串长度

void createstring(String *s)
{
    printf("请输入一段字符串,按回车结束:\n");
    gets(s->date);
    int i=0,j=0;
    while(s->date[i]!='\0'){
        i++;
        j++;
    }
    s->Len = j;
}

 4.在主函数中实现调用

int main()
{
    String *s1;
    s1 = init_string();
    createstring(s1);
    printf("%s",s1->date);
    return 0;
}

 数据结构--串的基本操作

四、字符串的匹配模式

 1.在主串中找子串第一次出现的位置

int stringindex(String *s1,String *s2)
{
    int i=0,j=0,k;
    while(i<s1->Len&&j<s2->Len){
        if(s1->date[i]==s2->date[j]){
            i++;
            j++;
        }else{
            i = i-j+1;
            j = 0;
        }
    }
    if(j>=s2->Len){
        k=i-s2->Len+1;
    }else{
        k=-1;//如果没找到则返回值-1;
    }
    return k;
}

2.在主串中删除子串

void deletestring(String *s,int i,int j)
{
    int k;
    if(i+j-1>s->Len){
        printf("所要删除的子串越界!");
    }else{
        for(k=i+j-1;k<s->Len;k++,i++){
            s->date[i-1] = s->date[k];
        }
    s->Len = s->Len-j;
    s->date[s->Len]= '\0';
    }
}

在主函数中实现 如下:

int main()
{
    String *s1;
    String *s2;
    s1 = init_string();
    s2 = init_string();
    createstring(s1);//创造一个主串
    createstring(s2);//创造一个子串
    int a = stringindex(s1,s2);//得到子串的位置
    int b = s2->Len;//得到子串的长度从而删除
    deletestring(s1,a,b);
    printf("%s",s1->date);
    return 0;
}

数据结构--串的基本操作

3.在主串中插入子串 

void insertstring(String *s1,String *s2,int i)//在第i位中插入
{
    int j;
    if(i>s1->Len+1){
        printf("插入的位置错误");
    }else if(s1->Len+s2->Len>maxsize){
        printf("两串长度超过存储空间长度");
    }else{
        for(j=s1->Len-1;j>=i-1;j--){//将第i位开始的字符各向后移动s2串长度
            s1->date[s2->Len+j] = s1->date[j];
        }
        for(j=0;j<s2->Len;j++){
            s1->date[i+j-1] = s2->date[j];//将子串s2插入到s1的第i个位置处
        }
        s1->Len = s1->Len+s2->Len-1;
        s1->date[s1->Len] = '\0';
    }
}

在主函数中实现 如下:

int main()
{
    String *s1;
    String *s2;
    s1 = init_string();
    s2 = init_string();
    createstring(s1);//创造一个主串
    createstring(s2);//创造一个子串
    int a = s1->Len;//得到主串的位置
    insertstring(s1,s2,a);
    printf("%s",s1->date);
    return 0;

数据结构--串的基本操作

4.比较两个串的大小 

void cmpstring(String *s1,String *s2)
{
    int i=0,flag=0;
    while(s1->date[i]!='\0'&&s2->date[i]!='\0'){
        if(s1->date[i]!=s2->date[i]){//两串对应的位置是否相等
            flag = 1;
            break;
        }else{
            i++;
        }
    }
    if(flag==0&&s1->Len==s2->Len){
        printf("两串相等\n");
    }else{
        printf("两个串不相等,两串ASCII差值为%d\n",s1->date[i]-s2->date[i]);
        //不相等返回不同位置的ASCII码差值
    }
}

 在主函数中实现 如下:

int main()
{
    String *s1;
    String *s2;
    s1 = init_string();
    s2 = init_string();
    creatstring(s1);
    creatstring(s2);
    cmpstring(s1,s2);
    return 0;
}

数据结构--串的基本操作

 数据结构--串的基本操作


五、总结

1、串的基本概念

串是一种特殊的线性表,规定每个数据元素仅由一个字符组成。串上的操作主要是针对串的整体或串的一部分子串进行的。

2、串的存储结构

串是字符型的线性表,与线性表类似,串也有两种基本存储结构:顺序存储和链式存储。由于串的特殊性。主要运用顺序存储。

3、串的运算实现

串的基本运算包括串的连接、插入、删除、比较、寻找等,要求重点掌握串的定长顺序存储的基本算法。文章来源地址https://www.toymoban.com/news/detail-415969.html

到了这里,关于数据结构--串的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构--图的基本操作

    使用的存储模式: 图的基本操作: • Adjacent(G,x,y):判断图G是否存在边x, y或(x, y)。 • Neighbors(G,x):列出图G中与结点x邻接的边。 • InsertVertex(G,x):在图G中插入顶点x。 • DeleteVertex(G,x):从图G中删除顶点x。 • AddEdge(G,x,y):若无向边(x, y)或有向边x, y不存在,则向图G中添加该

    2024年02月16日
    浏览(53)
  • (数据结构)链队列的基本操作

    2024年02月08日
    浏览(45)
  • 数据结构之栈的基本操作

    该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈 实现的功能有:入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素 此外根据上述功能,编写了数值转换(十进制转化八进制)方法、括号匹配方法。 控制台界面展示: 进栈展示

    2024年01月23日
    浏览(50)
  • 数据结构——单链表基本操作实现 (c++)

    单链表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这里存储单元可以是连续的,也可以是不连续的),为了表示每个数据元素a与其直接后继数据元素之间的逻辑关系,除了存储信息本身外还要存储一个指示其直接后继的信息(地址). 这两部分信

    2024年02月03日
    浏览(68)
  • 数据结构---双向链表的基本操作

    头插法 遍历链表 尾插法 头删法 尾删法 按位置插入数据 按位置删除数据 dooublelinklist.c doublelinklist.h doublemain.c

    2024年02月22日
    浏览(53)
  • 【数据结构】队列基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(51)
  • 数据结构实验4:二叉树的基本操作

    一、问题描述 运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的基本操作。 三、实验内容及要求 1、构造

    2024年01月23日
    浏览(43)
  • 数据结构——单链表上基本操作的实现

    1.按位序插入(带头结点) : ==ListInsert(L, i, e): ==在表L 中的第 i 个位置上插入指定元素 e = 找到第 i-1 个结点 ( 前驱结点 ) ,将新结点 插入其后;其中头结点可以看作第 0 个结点,故 i=1 时也适用。 typedef struct LNode{ ElemType data; struct LNode *next; }LNode, *LinkList; // 在第 i 个位置插入

    2024年01月21日
    浏览(57)
  • 【玩转408数据结构】线性表——定义和基本操作

            线性表是算法题命题的重点,该类题目实现相对容易且代码量不高,但需要最优的性能(也就是其时间复杂度以及空间复杂度最优),这样才可以获得满分。所以在考研复习中,我们需要掌握线性表的基本操作,在平时多进行代码练习。当然在考场上,我们并不一

    2024年02月19日
    浏览(47)
  • 【数据结构】——单链表的基本操作(带头结点)

            单链表解决了顺序表需要大量连续存储单元的缺点,但单链表附加指针域, 存储密度较顺序表低(考点!!) 。由于单链表的元素离散地分布在存储空间中,所以单链表是 非随机存取 的存储结构,即不能直接找到表中某个特定的结点。当查找某个特定结点时,需要

    2024年02月05日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包