• 数据结构之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("赋值成功
    ");
    		StrPrint(S);
    	}
    	//测试复制函数
    	char t[20]="I like coding";
    	String S1,T;
    	StrAssign(T,t);
    	if(StrCopy(S1,T))
    	{
    		printf("复制成功!
    ");
    		StrPrint(S1);
    	}
    
    	if(StrCompare(S,S1))
    		printf("S和S1相等
    ");
    	else
    		printf("S和S1不相等
    ");
    
    	String temp="";
    	if(StrEmpty(temp))
    		printf("temp为空字符串
    ");
    	else
    		printf("temp不为空
    ");
    	printf("s的长度为%d
    ",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
    ",pos);
    	
    	StrAssign(ss,"I am abcd haha ,you are a bitch");
    	StrAssign(V,"heor");
    	StrPrint(ss);
    	if(Replace(ss,S,s))
    	{
    		printf("替换成功!:
    ");
    		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("替换错误!
    ");
    		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("
    ");
    }
    	                                                                                                                                                  


    串实际上是一个字符数组,一般第一位适用于存储字符串的长度,注意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
    ");
    	else if(n==0)
    		printf("S=H
    ");
    	else
    		printf("S<H
    ");
    	//连接操作
    	if(Concat(SS,S,T))
    		StrPrint(SS);
    	else
    		printf("连接失败!
    ");
    
    	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("
    ");
    }
    



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

  • 相关阅读:
    【转】 grep 文件报错 “Binary file ... matches”
    JS 将值插入数组中
    Vue 刷新当前页面,并重新加载页面数据
    Vue 获得所选中目标的状态(checked)以及对应目标的数据,并进行相应的操作
    JS --- 如何获取一个对象的类型
    vue-cli项目开发/生产环境代理实现跨域请求+webpack配置开发/生产环境的接口地址
    VUE 处理文本框获焦点高亮
    VUE项目问题之:去掉url中的#/
    关于移动端终极适配解决方案
    VUE.JS 使用axios数据请求时数据绑定时 报错 TypeError: Cannot set property 'xxxx' of undefined 的解决办法
  • 原文地址:https://www.cnblogs.com/gaot/p/4833820.html
Copyright © 2020-2023  润新知