数据结构之字符串

      串(或字符串),是由零个或多个字符组成的有穷序列。含零个字符的串称为空串,用Ф表示。

    串中所含字符的个数称为该串的长度(或串长)。

   通常将一个串表示成"a1a2…an"的形式。其中,最外边的双引号本身不是串的内容,它们是串的标志,以便将串与标识符(如变量名等)加以区别。每个ai(1≤i≤n)代表一个字符。

   

   

//字符串
#include "stdafx.h"
#include <stdio.h>

#define MaxSize 100  //最多的字符个数

typedef struct
{
   char data[MaxSize];//可容纳MaxSize个字符的空间
   int length;//当前串的实际长度

}SqString;
//将一个字符串常量赋给串s,即生成一个其值等于cstr[]的串s。
void StrAssign(SqString &s, char cstr[])
{
	int i;
	for (i = 0; cstr[i] != '\0' && i < MaxSize; i++)
	{
		s.data[i] = cstr[i];
	}
	s.length = i;
}

//串复制:将串t赋给串s。
void StrCopy(SqString &s, const SqString t)
{
	int i;
	for (i = 0; i < t.length && i < MaxSize; i++)
	{
		s.data[i] = t.data[i];
	}
	s.length = t.length;
}
//判串相等:若两个串s与t相等则返回真;否则返回假。
bool StrEqual(const SqString s, const SqString t)
{
	bool same = true;
	int i;
	if (s.length != t.length)
	{
	   same = false;//长度不等则串不等
	}else
	{
		for (i = 0; i < s.length ; i++)
	   {
		   if (s.data[i] != t.data[i])
			  {
			      same = false;
				  break;
			  }
	   }
	}
  return same;
}
//求串长:返回串s中字符个数。
int StrLength(const SqString s)
{
	return s.length;
}
//返回由两个串s和t连接在一起形成的新串。
SqString Concat(SqString s, SqString t)
{
	SqString str;
	int i;
	str.length = s.length + t.length;
	for (i = 0; i < s.length; i++)
	{//将s.data[0..s.length-1]复制到str
		str.data[i] = s.data[i];
	}

	for (i = 0; i < t.length; i++)
	{//将t.data[0..t.length-1]复制到str
		str.data[s.length + i] = t.data[i];
	}

	return str;
}
//返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j个字符组成的子串。
SqString SubStr(SqString s,int i, int j)
{
   int k;
   SqString str;
   str.length = 0;

   if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length)
   {
        return str;//参数不正确,返回空串
   }

   for (k = i - 1; k < i + j - 1; k++)
   {//将s.data[i..i+j]复制到str
	   str.data[k - i + 1] = s.data[k];
   }
   str.length = j;
   return str;

}
//将串s2插入到串s1的第i个字符中,即将s2的第一个字符作为s1的第i个字符,并返回产生的新串。
SqString InsStr(SqString s1, int i, SqString s2)
{
	int j;
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s1.length + 1)
	{
	   return str;//参数不正确时返回空串
	}
	for (j = 0; j < i -1; j++)
	{//将s1.data[0..i-2]复制到str
		str.data[j] = s1.data[j];
	}
	for (j = 0; j < s2.length; j++)
	{//将s2.data[0..s2.length-1]复制到str
		str.data[i + j - 1] = s2.data[j];
	}
	for (j = i -1; j < s1.length; j++)
	{//将s1.data[i-1..s1.length-1]复制到str
		str.data[s2.length + j] = s1.data[j];
	}
	str.length = s1.length + s2.length;
	return str;
}
// 从串s中删去第i(1≤i≤StrLength(s))个字符开始的长度为j的子串,并返回产生的新串。
SqString DelStr(SqString s,int i, int j)
{
	int k;
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s.length || i + j > s.length + 1)
	{ 
	   return str;//参数不正确,返回空串
	}
	for (k = 0; k < i - 1; k++)
	{//将s.data[0..i-2]复制到str
		str.data[k] = s.data[k];
	}
	for (k = i + j -1; k < s.length; k++)
	{//将s.data[i+j-1..s.length-1]复制到str
		str.data[k - j] = s.data[k];
	}
	str.length = s.length - j;
	return str;
}
// 在串s中,将第i(1≤i≤StrLength(s))个字符开始的j个字符构成的子串用串t替换,并返回产生的新串。
SqString RepStr(SqString s, int i, int j, SqString t)
{
	int k;
	SqString str;
	str.length = 0;

	if (i <= 0 || i > s.length || i + j - 1 > s.length)
	{
	   return str;//参数不正确,返回空串
	}
	for (k = 0; k < i - 1; k++)
	{//将s.data[0..i-2]复制到str
		str.data[k] = s.data[k];
	}
	for (k = 0; k < t.length; k++)
	{//将t.data[0..t.length-1]复制到str
		str.data[i + k -1] = t.data[k];
	}
	for (k = j + i -1; k < s.length; k++)
	{//将s.data[i+j-1..s.length-1]复制到str
		str.data[t.length + k - j] = s.data[k];
	}
	str.length = s.length - j + t.length;
	return str;
}
//输出串s的所有元素值。
void DispStr(SqString s)
{
	int i;
	if (s.length > 0)
	{
		for (i = 0; i < s.length; i++)
	  {
		  printf("%c", s.data[i]);
	  }
		printf("\n");
	}

}

int main()
{
	SqString s,s1,s2,s3,s4,s5;
	printf("顺序串的基本运算如下:\n");
	printf("  (1)建立串s和串s1\n");
	StrAssign(s,"abcdefghijklmn");
	StrAssign(s1,"123");
	printf("  (2)输出串s:");
	DispStr(s);
	printf("  (3)串s的长度:%d\n",StrLength(s));
	printf("  (4)在串s的第9个字符位置插入串s1而产生串s2\n");
	s2 = InsStr(s,9,s1);
	printf("  (5)输出串s2:");
	DispStr(s2);
	printf("  (6)删除串s第2个字符开始的5个字符而产生串s2\n");
	s2 = DelStr(s,2,3);
	printf("  (7)输出串s2:");
	DispStr(s2);
	printf("  (8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
	s2 = RepStr(s,2,5,s1);
	printf("  (9)输出串s2:");
	DispStr(s2);
	printf("  (10)提取串s的第2个字符开始的10个字符而产生串s3\n");
	s3 = SubStr(s,2,10);
	printf("  (11)输出串s3:");
	DispStr(s3);
	printf("  (12)将串s1和串s2连接起来而产生串s4\n");
	s4 = Concat(s1,s2);
	printf("  (13)输出串s4:");
	DispStr(s4);
	printf("  (14)s4复制字符串到s5\n");
	StrCopy(s5, s4);
	printf("  (15)输出串s5:");
	DispStr(s5);
	printf("  (16)比较s4和s5是否相等\n");
	printf("  (17)s4和s5%s\n", StrEqual(s4, s5) ? "相等":"不想等");
	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值