数据结构之String

静态表示方法

#include<iostream>
using namespace std;

#define MAXSTRLEN 255

#define TRUE 1
#define FALSE 0
#define Status int

typedef unsigned char String[MAXSTRLEN]; 

Status StrAssign(String &T,char *chars);//创建串
Status StrEmpty(String S);//判断串是否为空
Status StrCompare(String S,String T);//比较串
Status StrCopy(String &S,String T);//复制串
int StrLength(String S);//返回串的长度
Status Concat(String &T,String S1,String S2);//连接串
Status SubString(String &Sub,String S,int pos,int length);//替换串
int Index(String S,String T,int pos);
Status Replace(String &S,String T,String V);
Status StrInsert(String &S,int pos,String T);
Status StrDelete(String &S,int pos,int length);
void StrPrint(String S);
void DestoryString(String &S);

int main()
{
	String S;
	//测试赋值函数
	if(StrAssign(S,"abcd"))
	{
		printf("赋值成功\n");
		StrPrint(S);
	}
	//测试复制函数
	char t[20]="I like coding";
	String S1,T;
	StrAssign(T,t);
	if(StrCopy(S1,T))
	{
		printf("复制成功!\n");
		StrPrint(S1);
	}

	if(StrCompare(S,S1))
		printf("S和S1相等\n");
	else
		printf("S和S1不相等\n");

	String temp="";
	if(StrEmpty(temp))
		printf("temp为空字符串\n");
	else
		printf("temp不为空\n");
	printf("s的长度为%d\n",StrLength(S));

	String S2;
	if(Concat(S2,S,S1))
	{
		printf("连接成功  ");
		StrPrint(S2);
	}
	
	String s,V,ss;
	StrAssign(s,"bc");

	int pos=Index(S,s,1);
	printf("%d\n",pos);
	
	StrAssign(ss,"I am abcd haha ,you are a bitch");
	StrAssign(V,"heor");
	StrPrint(ss);
	if(Replace(ss,S,s))
	{
		printf("替换成功!:\n");
		StrPrint(ss);
	}

	//插入
	StrInsert(ss,2,s);
	StrPrint(ss);

	StrDelete(ss,2,2);
	StrPrint(ss);
	return 0;
}

Status StrAssign(String &T,char *chars)
{
	int m=strlen(chars);
	if(m>MAXSTRLEN)return FALSE;
	for(int i=0;i<m;i++)
		T[i+1]=chars[i];
	T[0]=m;
	return TRUE;
}

Status StrEmpty(String S)
{
	if(S[0]==0)
		return TRUE;
	return FALSE;
}

Status StrCompare(String S,String T)
{
	int i=1;
	if(S[0]==T[0])
		for(i=1;i<=S[0];i++)
			if(S[i]!=T[i])
				break;

	int n=S[0];
	if(i-1==n)
		return TRUE;
	return FALSE;
}

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

}

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

Status Concat(String &T,String S1,String S2)
{
	int uncut,i,j;
	if(S1[0]+S2[0]<=MAXSTRLEN)//如果没有截断
	{
		T[0]=S1[0]+S2[0];
		for(i=1;i<=S1[0];i++)
			T[i]=S1[i];
		for(j=1;j<=S2[0];j++)
			T[j+i-1]=S2[j];
		uncut=TRUE;
	}
	else if(S1[0]<MAXSTRLEN&&S1[0]+S2[0]>MAXSTRLEN)//部分截断
	{
		T[0]=MAXSTRLEN;
		for(i=1;i<=S1[0];i++)
			T[i]=S1[i];
		for(j=1;j+S1[0]<=MAXSTRLEN;j++)
			T[i++]=S2[j];
		uncut=FALSE;
	}
	else if(S1[0]>=MAXSTRLEN)
	{
		int i;
		T[0]=MAXSTRLEN;
		for(i=1;i<=MAXSTRLEN;i++)
			T[i]=S1[i];
		uncut=FALSE;
	}	
	return uncut;
}

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

int Index(String S,String T,int pos)
{
	int m,n,i;
	String sub;
	if(pos>0)
	{
		n=StrLength(S);
		m=StrLength(T);
		for(i=pos;i<=n-m+1;i++)
		{
			if(SubString(sub,S,i,m))
				if(StrCompare(sub,T))
					return i;
		}
				
	}
	return FALSE;
}

Status Replace(String &S,String T,String V)
{
	int i,pos;
	if(S[0]<T[0]||S[0]<V[0])return FALSE;
	pos=Index(S,T,1);
	if(pos==0)
	{
		printf("替换错误!\n");
		return FALSE;
	}
	else
	{
		if(T[0]==V[0])
			for(i=pos;i<=V[0];i++)
				S[i]=V[i];
		else if(T[0]<V[0])
		{
			int length=V[0]-T[0];
			for(i=S[0];i>=pos+length-1;i--)
				S[i+length]=S[i];
			for(i=pos;i<=V[0];i++)
				S[i]=V[i];
		}
		else if(T[0]>=V[0])
		{
			int length = T[0]-V[0];
			int n=StrLength(V);
			int m=StrLength(S);
			StrPrint(V);
			for(i=pos;i<=pos+n-1;i++)
				S[i]=V[i-pos+1];
			for(;i<=m-length;i++)
				S[i]=S[i+length];
		}
	}
	return TRUE;
}

Status StrInsert(String &S,int pos,String T)
{
	int i,m,n;
	m=StrLength(T);
	n=StrLength(S);
	if(pos<=n)
	{
		for(i=n;i>=pos;i--)
			S[i+m]=S[i];
		for(i=1;i<=m;i++)
			S[pos+i-1]=T[i];
	}
	else
	{
		for(i=1;i<=m;i++)
			S[n+i]=T[i];
	}
	return TRUE;
}

Status StrDelete(String &S,int pos,int length)
{
	int m=StrLength(S);
	if(pos>m||length>m-pos+1)return FALSE;	
	for(int i=pos;i<=m-length;i++)
		S[i]=S[i+length];
	return TRUE;
}

void StrPrint(String S)
{
	int n=S[0];
	for(int i=1;i<=n;i++)
		printf("%c",S[i]);
	printf("\n");
}
	                                                                                                                                                  


串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意char c=2;实际上是对应存储的ASCII码,使用的时候需要直接传换成int型,int a=c就解决了。


动态表示

#include<iostream>
#include<cstring>
using namespace std;
#define OK 1
#define ERROR 0
#define SSIZE 100
#define Status int
#define OVERFLOW 0

typedef struct{
	char *ch;//若为空串,按长度分配
	int length;
}HString;

void StrInit(HString &S);
Status StrAssign(HString &T,char *chars);
int StrLength(HString S);
int StrCompare(HString S,HString T);
Status ClearString(HString &S);
Status Concat(HString &S,HString S1,HString S2);
HString SubString(HString S,int pos,int length);
void StrPrint(HString S);

int main()
{
	int n;
	char a[100]="abc",b[100]="bcd";
	HString S,T,SS;
	StrInit(S);
	StrInit(T);
	StrInit(SS);
	StrAssign(S,a);
	StrAssign(T,b);
	n=StrCompare(S,T);
	if(n>0)
		printf("S>H\n");
	else if(n==0)
		printf("S=H\n");
	else
		printf("S<H\n");
	//连接操作
	if(Concat(SS,S,T))
		StrPrint(SS);
	else
		printf("连接失败!\n");

	HString V;
	V=SubString(SS,1,3);
	StrPrint(V);
	return 0;
}

void StrInit(HString &S)
{
	S.ch=NULL;
	S.length=0;
}

Status StrAssign(HString &T,char *chars)
{
	int n;
	n=strlen(chars);
	if(T.ch)free(T.ch);
	if(n==0)
	{
		T.ch=NULL;
		T.length=0;
	}
	else
	{
		T.ch=(char*)malloc(n*sizeof(char));
		if(!T.ch)exit(ERROR);
		for(int i=0;i<n;i++)
			T.ch[i]=chars[i];
		T.length=n;
	}
	return OK;
}

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

int StrCompare(HString S,HString T)
{
//	if(strcmp(S,T)>0)   //这种方法不行,因为字符串结尾没有终结符,所以不能够比较
//		return 1;
//	else if(strcmp(S,T)==0)
//		return 0;
//	else
//		return -1;

	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;
}

Status ClearString(HString &S)
{
	if(S.ch)
	{
		free(S.ch);
		S.ch=NULL;
	}
	S.length=0;
	return OK;
}

Status Concat(HString &S,HString S1,HString S2)
{
	int i;
	if(S.ch)free(S.ch);
	S.ch=(char*)malloc((S1.length+S2.length)*sizeof(char));
	if(!S.ch)return ERROR;//申请内存失败;
	S.length=S1.length+S1.length;
	for(i=0;i<S1.length;i++)
		S.ch[i]=S1.ch[i];	
	for(i=0;i<S2.length;i++)
		S.ch[i+S1.length]=S2.ch[i];
	return OK;
}

HString SubString(HString S,int pos,int length)
{
	HString T;
	StrInit(T);
	T.ch=(char*)malloc(length*sizeof(char));
	if(pos+length+1>S.length)exit(0);
	for(int i=pos;i<pos+length;i++)
		T.ch[i-pos]=S.ch[i];
	T.length=length;
	return T;
		
}
void StrPrint(HString S)
{
	for(int i=0;i<S.length;i++)
		printf("%c",S.ch[i]);
	printf("\n");
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-07-17 23:12  gaot  阅读(416)  评论(0编辑  收藏  举报