Establishment and operation sequence string

A, as follows

/*
项目名称:顺序串的建立与基本操作

编译环境:VC++ 2008

作者相关:。。。

最后修改:2019.6.29


学习目标:赋值、复制、判空、比较、求长、清空、连接、返回子串、

返回子串下标、替换子串、删除子串、销毁

注意事项:1.测试所有功能是否正常

*/

#include <stdio.h>
#include <string.h>

#define  ERROR    0
#define  OK       1

#define  MAXSTRLEN 255

typedef  bool   Status;

typedef  unsigned char String[MAXSTRLEN+1];//0号单元存放串的长度

Status StrAssign(String &T,const char *s);

Status StrCopy(String &T,String S);

Status StrEmpty(String S);

int    StrCompare(String S,String T);

int    StrLength(String S);

Status ClearString(String &S);

Status Concat(String &T,String S1,String S2);//用T返回由S1和S2连接而成的新串

Status SubString(String &Sub,String S,int pos,int len);

int    Index(String S,String T,int pos);

Status Replace(String &S,String T,String V);

Status StrMoveEnd(String &S,int pos,int i);

Status StrInsert(String &S,int pos,String T);

Status StrMoveFront(String &S,int pos,int i);

Status StrDelete(String &S,int pos,int len);

Status StrOut(String S);

int main()
{
	String T1;
	const char *s = "hello data structure!";

	StrAssign(T1,s);
	printf("T1");
	StrOut(T1);

	String T2;
	StrCopy(T2,T1);
	printf("T2");
	StrOut(T1);

	if(StrEmpty(T1))
		printf("T1为空!\n\n");
	else
		printf("T1非空!\n\n");

	int k = StrCompare(T1,T2);

	if(k>0)
		printf("T1大于T2!\n\n");
	else if(k<0)
		printf("T1小于T2!\n\n");
	else
		printf("T1等于T2!\n\n");

	String T;
	Concat(T,T1,T2);
	printf("T");
	StrOut(T);

	String Sub,Sub2;
	SubString(Sub,T1,7,4);
	printf("Sub");
	StrOut(Sub);

	int j = Index(T1,Sub,2);
	printf("Sub在T1串第2个位置后第一次出现的位置是: %d\n\n",j);

	SubString(Sub2,T1,1,4);
	Replace(T1,Sub,Sub2);
	printf("替换后的字符串T1");
	StrOut(T1);

	StrInsert(T2,4,Sub);
	printf("插入后的T2");
	StrOut(T2);

	StrDelete(T1,1,5);//删除前5个字符
	printf("删除后的T1");
	StrOut(T1);

	return 0;
}

Status StrAssign(String &T,const char *s)
{
	int i;
	if(strlen(s)>MAXSTRLEN)
		return ERROR;
	else
	{
		T[0]=strlen(s);
		for(int i=0;i<T[0];i++)
			T[i+1]=s[i];

		return OK;
	}

}

Status StrCopy(String &T,String S)
{
	for(int i=0;i<=S[0];i++)
		T[i]=S[i];

	return OK;
}

Status StrEmpty(String S)
{
	if(S[0]==0)
		return true;
	else
		return false;
}

int StrCompare(String S,String T)
{
	int i;
	for(i=1;i<=S[0]&&i<=T[0];i++)//这样就确定了长度最短的字符串,也可两者相等
		if(S[i]!=T[i])
			return S[i]-T[i];//S小则返回负数,S大则返回正数
		else
			return S[0]-T[0];//直到某个字符串结束,比较的字符全部相同,现在比较长度
}

int    StrLength(String S)
{
	return S[0];
}

Status ClearString(String &S)
{
	S[0]=0;
	return OK;
}

Status Concat(String &T,String S1,String S2)
{
	if(S1[0]+S2[0]<=MAXSTRLEN)
	{
		for(int i=1;i<=S2[0];i++)
			S1[S1[0]+i] = S2[i];

		S1[0]+=S2[0];
		StrCopy(T,S1);
	}
	else if(S1[0]<MAXSTRLEN)//截断S2
	{
		for(int i=1;i<=MAXSTRLEN-S1[0];i++)
			S1[S1[0]+i] = S2[i];

		S1[0]=MAXSTRLEN;
		StrCopy(T,S1);
	}
	else
	{
		StrCopy(T,S1);//S1已达到最大长度
	}

	return OK;
}

Status SubString(String &Sub,String S,int pos,int len)
{
	if(pos>=1&&pos<=S[0]&&len>=0&&len<=S[0]-pos+1)
	{
		for(int i=1;i<=len;i++)
			Sub[i]=S[pos+i-1];
		Sub[0]=len;
	}
	else
		return ERROR;

	return OK;
}

int Index(String S,String T,int pos)
{
	String Sub;
	if(pos>=1&&pos<=S[0])
	{
		for(int i=1;i<=S[0]-T[0]+1;i++)
		{
			SubString(Sub,S,i,T[0]);
			if(!StrCompare(Sub,T))
			{
				if(i>pos)
					return i;
				else
					return 0;
			}
		}
	}
}

Status Replace(String &S,String T,String V)
{
	String Sub;
	for(int i=1;i<=S[0]-T[0]+1;i++)
	{
		int j=1,k;               //每一次循环对j要重新赋值
		SubString(Sub,S,i,T[0]);
		if(!StrCompare(Sub,T))
		{
			k=i;
			while(j<=T[0])
			{
				S[k]=V[j];
				++k;
				++j;
			}
		}
	}
	return OK;
}

Status StrMoveEnd(String &S,int pos,int i)//从pos开始字符串向后移动i个单位
{
	for(int j=S[0];j>=pos;j--)//因为该函数被插入函数调用,在这里假设pos合法
		S[j+i]=S[j];

	return OK;

}

Status StrInsert(String &S,int pos,String T)
{
	if(pos<1||pos>S[0]+1)
		return ERROR;
	else
	{
		StrMoveEnd(S,pos,T[0]);
		for(int i=1;i<=T[0];i++)
			S[pos+i-1]=T[i];

	}
	return OK;
}

Status StrMoveFront(String &S,int pos,int len)
{
	for(int i=pos;i<=S[0]-len;i++)
		S[i]=S[i+len];

	return OK;
}

Status StrDelete(String &S,int pos,int len)
{
	if(StrEmpty(S)||pos<1||pos>S[0]-len+1)
		return ERROR;
	else
		StrMoveFront(S,pos,len);

	return OK;
}

Status StrOut(String S)
{
	printf("串内容: ");
	for(int i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
	printf("\n\n");
	return OK;
}

 Second, the effect of

Guess you like

Origin blog.csdn.net/Sruggle/article/details/94216150