• 数据结构之‘串’


    \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;
    }
    
    
    
    
  • 相关阅读:
    敏感词检测库ToolGood.Words中 WordsHelper类使用简介
    SVN服务器迁移方法(Windows环境)
    窗口看门狗使用介绍
    如何将base64图片转化为URL格式
    远程linux机器中使用camera
    《web课程设计》基于HTML+CSS+JavaScript典的中医药大学网(11个页面)
    Kubernetes基础(二)-Headless Service
    unity scene场景调整好后让game窗口的视角与scene相同
    23种设计模式(八)代理模式(阁瑞钛伦特软件-九耶实训)
    Apache Hudi 如何加速传统的批处理模式?
  • 原文地址:https://blog.csdn.net/qq_61866637/article/details/140437747