• 数据结构之‘串’


    \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;
    }
    
    
    
    
  • 相关阅读:
    维格云小程序如何快速上手开发?
    计算机未来-发展趋势和未来方向
    如何将dwg文件转成kml文件
    Ubuntu 17.10的超震撼声音权限
    el-form 初值和resetFields问题
    前端实战|React18极客园——项目打包与优化
    一、Azkaban简明笔记
    Redis总结(一)
    初步认识泛型
    [Games101] Lecture 03-04 Transformation
  • 原文地址:https://blog.csdn.net/qq_61866637/article/details/140437747