• 数据结构之‘串’


    \quad

    一. 串的定义

    \quad

    在这里插入图片描述
    \quad

    在这里插入图片描述
    \quad

    \quad

    二. 串的基本操作

    \quad

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    \quad

    三. 串的存储结构

    \quad

    \quad

    3.1 顺序存储

    \quad
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    得一个一个遍历

    在这里插入图片描述
    结合方案一和方案二的优点

    \quad

    3.2 链式存储

    \quad
    在这里插入图片描述

    \quad

    3.3 基于顺序存储的基本操作

    \quad

    在这里插入图片描述
    \quad
    \quad

    在这里插入图片描述
    在这里插入图片描述

     #pragma once
    #include<stdio.h>
    #include<string.h>
    #include<stdbool.h>
    #include<stdlib.h>
    #define MAXLEN 255
    
    
    typedef char Stdate;
    
    typedef struct SString{
    	char ch[MAXLEN];
    	int length;
    }SString;
    
    
    
    void PrintStr(SString* s); //打印串
    
    void Strinit(SString* s);//初始化
    void StrAssign(SString* s, char*c); //赋值操作,把串T赋值为chars
    void ClearString(SString* s); //将S清为空串
    bool SubString(SString* sub, SString* s, int pos, int len);//求子串, 从pos的位置起,len长,放入sub
    int StrCompare(SString* a, SString* b);//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
    int Index(SString* a, SString* b); //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
    
    
    void Strinit(SString* s)//初始化
    {
    	s->length = 0;
    }
    
    
    
    void StrAssign(SString* s, char* c) //赋值操作,把串T赋值为chars
    {
    	int i = 1;
    	while (*c != '\0')
    	{
    		s->ch[i] = *c;
    		i++;
    		c++;
    		s->length++;
    	}
    
    }
    
    
    void PrintStr(SString* s) //打印串
    {
    	int i = 1;
    	for (i = 1; i <= s->length; i++) {
    		printf("%c ",s->ch[i]);
    	}
    	printf("\n");
    }
    
    void ClearString(SString* s) //将S清为空串
    {
    	s->length = 0;
    }
    
    
    bool SubString(SString* sub, SString* s, int pos, int len)//求子串
    {
    	int i = 0;
    	if (pos + len-1 > s->length)
    	{
    		return false;
    	}
    	else {
    		for (i = 0; i < len; i++)
    		{
    			sub->ch[i + 1] = s->ch[pos+i];
    			sub->length++;
    		}
    		return true;
    	}
    }
    
    
    int StrCompare(SString* a, SString* b)//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
    {
    	for (int i = 1; i <= a->length && i <= b->length; i++)
    	{
    		if (a->ch[i] != b->ch[i])
    		{
    			return a->ch[i] - b->ch[i];
    		}
    	}
    
    	int k = a->length - b->length;
    
    	return k;
    	
    }
    
    int Index(SString* a, SString* b) //若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
    {
    	SString c;
    	Strinit(&c);
    	int i = 1;
    	int n = a->length;
    	int m = b->length;
    
    	while(i<=n-m+1)
    	{
    		SubString(&c, a, i, m);
    		if (StrCompare(&c, b) != 0)
    		{
    			ClearString(&c);
    			i++;
    		}
    		else {
    			return i;
    		}
    	}
    
    	return 0;
    
    }
    
    
    
    
    int main()
    {
    	SString s;
    	SString sub;
    	char chars1[] = "abcdefghiklmn";
    	char chars2[] = "def";
    	
    	Strinit(&s);
    	Strinit(&sub);
    	
    
    	StrAssign(&s, chars1); //赋值串
    	StrAssign(&sub, chars2);
    	//PrintStr(&s);
    	
    
    	//ClearString(&s); //将S清为空串
    	//PrintStr(&s);
    
    	//SubString(&sub, &s, 7, 4);
    	//PrintStr(&sub);
    
    
    	//比较两个字符串的大小,若a>b,则返回>0,若相等,则返回0,若a
    	//printf("%d\n", StrCompare(&s, &sub));
    
    	//若主串中存在与串b值相同的子串,则返回它第一次出现的位置, 否则返回0;
    	printf("%d\n", Index(&s, &sub));
    
    	return 0;
    }
    
    
    
    
  • 相关阅读:
    uniapp-ios打包安装测试
    vue中$attrs和$listeners 的使用
    结构化面试 --- 介绍 + 人际关系
    LeetCode 308 周赛
    第六章 图论 8 AcWing 1624. 地铁地图
    二叉树的中序遍历三种解法(递归+迭代+线索化)
    遍历线索化二叉树(思路分析) [算法与数据结构][Java]
    TypeScript查缺补漏【TS自动重启+自动运行+parcel自动打包】
    [PAT练级笔记] 31 Basic Level 1031 查验身份证
    EMQX 安装(数据挂载必要目录)以及SpringBoot使用
  • 原文地址:https://blog.csdn.net/qq_61866637/article/details/140437747