数据结构——串的基本操作(C语言,究极简单,完整实现)


文章目录

  • 前言
  • 一、串是什么?
  • 二、该如何理解串?
  • 三、各类串的形式
  • 四、串的实现
    • 1.串的实现
      • 1.1 引入库以及设置结构体
      • 1.2初始化串
      • 1.3求子串的功能实现
      • 1.4两串比较的功能实现
      • 1.5定位功能
      • 1.6求串的长度功能
      • 1.7串的输出功能
      • 1.8判断串的是否为空功能
      • 1.8主函数实现上述全部功能
  • 总结


前言

本文就介绍了数据结构中串的基本操作的编程实现,掌握串的建立、遍历,求子串,定位等基本操作


提示:以下是本篇文章正文内容,下面案例可供参考
有更简洁的代码实现,请移步

一、串是什么?

在计算机程序设计中,字符串 string 通常是字符序列,要么是文字常量,要么是某种变量。后者可能允许其元素发生突变,长度改变,或者是固定的(在创建之后)。字符串通常被认为是一种数据类型,通常作为字节(或字)的数组数据结构来实现,它存储了一系列元素,通常是使用一些字符编码的字符。字符串还可以用来表示更一般的数组或其他序列(或列表)数据类型和结构。

根据所使用的编程语言和精确的数据类型,声明为字符串的变量可能会导致内存中的存储被静态地分配给预先确定的最大长度,或者可以使用动态分配来容纳可变数量的元素。

当一个字符串在源代码中出现时,它被称为字符串文字或匿名字符串。

在数学逻辑和理论计算机科学中使用的正式语言中,string 是由一个叫做字母表的集合所选择的有限的符号序列。
串的实现形式有两种,堆分配和块链存储,本文讲述块链存储

二、该如何理解串?

串 sting,一般又可以被称作字符串,是由0个或则多个字符组成的有限序列。一般我们用S = “a1 a2 a3…an” 来表示,其中S 是串的名字,双引号或则单引号作为串的定界符用来表示串的内容即串值,ai (0<= i <= n) 则代表串中的单个元素,n表示穿的个数即串中有几个字符,当n 为0时,该串被称为空串(null string),用双引号“”来表示,符号记为Ф。

注,空白串(blank string)和空串的区别,空白串是由一个或多个空格组成的串。
在JAVA中,String有着更深层次的理解,本文不做过多叙述

三、各类串的形式

子串(subString):串中任意几个连续的字符组成的子序列即为该串的子串

主串:相应地,包含该子串的串称为主串

子串的位置(index):子串在主串中首次出现时,该子串的首字符对应在主串中的序号,即为子串在主串中的位置。

这里有一个很经典的例子用来辅助说明。例如,设A和B分别为 A=‘This is a string’ B=‘is’ 则B是A的子串,A为主串。B在A中出现了两次,其中首次出现所对应的主串位置是3。因此,称B在A中的位置为3。 特别地,空串是任意串的子串,任意串是其自身的子串。

连接 (concatenation):连接是一个重要的二进制操作。对于任意两个主串中的子串s和t,它们的连接根据放置s和t 的前后顺序来定符号序列。例如,子串s = love,t = hug,那么st 就是lovehug,ts 就是huglove。

前缀和后缀 prefixes and suffixes:字符串s 可以说是t 的前缀,如果存在一个字符串u 满足条件t =su。如果u 是非空的,那么可以说s 是t 的一个合适的前缀;相应地,串s 可以说t 的后缀如果存在一个串u 满足条件t=us。如果u 是非空的,s 可以说是t 的一个合适的后缀。前缀和后缀可以说是t 的子串。

旋转:串s = uv 可以被说成t 的旋转如果t = vu. 举个例子,当u = 00110, v = 01的时候,串0011001 是0100110 的旋转。

逆转:串的逆转就是具有相同符号单顺序相反的字符串。例如,如果s=abc(a、b和c是字母表中符号),那么s 的逆转就是cba。一个与自身相反的字符串(例如,s=madam,逆转还是madam)被称为回文 palindrome,它还包括空字符串和所有长度为1的字符串。

四、串的实现

1.串的实现

1.1 引入库以及设置结构体

#include
#include
#include
#include
typedef struct{
	char *ch;
	int length;
}BBT;//定义一个串的结构体 

1.2初始化串

int StrAssign(BBT &T,char *chars){
	int i ;
	char *c;
//	if(T.ch)
//		free(T.ch);
	for(i=0,c=chars;*c;i++,c++);
	if(!i){
		T.ch=NULL;
		T.length=0;
	}//如果所求的串是空串 
	else{
		if(!(T.ch=(char*)malloc(i*sizeof(char)))){
			return -1;
		}
		for(int n=0;n<=i-1;n++)
			T.ch [n]=chars[n];
		T.length =i;
		}
	return 0; 
}

1.3求子串的功能实现

//求子串
int SubString(BBT &Sub,BBT S,int pos ,int len){
	if (pos<1||pos>S.length ||len<0||len>S.length-pos+1)
	return 0;
	if(Sub.ch) free(Sub.ch);
	if(!len){Sub.ch=NULL;Sub.length=0;}
	else{
		Sub.ch=(char*)malloc(len*sizeof(char));
		for(int j=0,pos;j<len,pos<pos+len-2;j++,pos++){
			Sub.ch[j]=S.ch[pos];
		}
			Sub.length=len; 
	}
	return 0;
}

1.4两串比较的功能实现

int StrCompare(BBT S,BBT 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 ;
} 

1.5定位功能

int index(BBT S,BBT T,int pos){
	int m,n;
	BBT Sub;
	if(pos>0){
		n=StrLength(S);m=StrLength(T);int i=pos;
		while(i<n-m+1){
			SubString(Sub,S,i,m);
			if(StrCompare(Sub,T)!=0) i++;
		else return i;
		}
	}	
	return 0;
}

1.6求串的长度功能

int StrLength(BBT S){
	return S.length;
} 

1.7串的输出功能

void StrPrint(HString T)
{
	int i;
	for(i=0;i<T.length;i++)
	{
		printf("%c",T.ch[i]);
	}
} 

1.8判断串的是否为空功能

bool StrClear(BBT &S)
{
	if(S.ch)
	{
		free(S.ch);
		S.ch=NULL;
	}
	S.length=0;
	return true;
}

1.8主函数实现上述全部功能

int main(){
	BBT S;
	char s1[15]="aabbccdssssdff";	
	StrAssign(S,s1);
	printf(S.ch);printf("\n");
	int n=StrLength(S);
	BBT T;
	char s2[15]="aabb";
	StrAssign(T,s2);
	printf(T.ch);printf("\n");
//	int q=StrCompare(T,S);
//	printf("%d\n",q);	
	printf("%d,%d,%d\n",n,StrLength(T),StrCompare(S,T));
	printf("%d\n",index(S,T,0));
	return 0;
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了串基础结构以及基础功能的相应实现。
希望对你有所帮助

你可能感兴趣的:(数据结构,字符串,数据结构)