码迷,mamicode.com
首页 > 其他好文 > 详细

串及其功能的实现

时间:2015-06-05 00:45:05      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:数据结构      复制   链接   删除   

#ifndef _STRING_H_
#endif  _STRING_H_
//#pragma once


#include<iostream>
using namespace std;


#define MAX_STRING_SIZE 8

typedef char SString[MAX_STRING_SIZE+1]; 
   
int Length(SString s)
{
	return strlen(s);
}

int Index1(char *T, char *P)   
{
	int t_length = strlen(T);
	int p_length = strlen(P);
	for(int i=0; i<=t_length-p_length;++i)
	{
		for(int j=0; j<p_length;++j)
		{
			if(T[i+j] != P[j])
			{
				break;
			}
		}

		if(j == p_length)
		{
			return i;
		}
		j = 0;
	}
	return -1;
}

bool StringConcat(SString T, SString s1, SString s2)
{
	int t_length = MAX_STRING_SIZE;
	int s1_length = Length(s1);
	int s2_length = Length(s2);

	if(t_length >= s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<s2_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return true;
	}
	else if(t_length>s1_length && t_length<s1_length+s2_length)
	{
		for(int i=0; i<s1_length; ++i)
		{
			T[i] = s1[i];
		}
		for(int j=0; j<t_length-s1_length; ++j)
		{
			T[i+j] = s2[j];
		}
		T[i+j] = '\0';
		return false;
		
	}
	else if(t_length < s1_length)
	{

	}
	return true;
}
  
/* 若S为空串,则返回true,否则返回false */  
bool StrEmpty(SString S)
{  
    if (S[0] == NULL)  
        return true;  
    else  
        return false;  
}  
  
/*  初始条件: 串S和T存在 */  
/*  操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */  
int StrCompare(SString S, SString T) //StrCompare(S,T)比较
{  
    int i;  
    for (i = 1; i <= S[0] && i <= T[0]; ++i)  
        if (S[i] != T[i])  
		{
			return S[i] - T[i];
		}
    return S[0] - T[0]; // 
}  
 /* 生成一个其值等于chars的串T */  
bool StrAssign(SString T, char *chars) 
{  
    int i;  
    if (strlen(chars) > MAX_STRING_SIZE)  
        return false;  
    else {  
        T[0] = strlen(chars);  
        for (i = 1; i <= T[0]; i++)  
            T[i] = *(chars + i - 1);  
        return true;  
    }  
}  
  
/* 由串S复制得串T */  
bool StrCopy(SString T, SString S) 
{  
    int i;  
    for (i = 0; i <= S[0]; i++)  
        T[i] = S[i];  
    return true;  
} 
/* 返回串的元素个数 */  
int StrLength(SString S)
{  
    return S[0];  
} 
/* 初始条件:串S存在。操作结果:将S清为空串 */  
bool ClearString(SString S) 
{  
    S[0] = 0;/*  令串长为零 */  
    return true;  
}  
  
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */  
bool Concat(SString T, SString S1, SString S2) 
{  
    int i;  
    if (S1[0] + S2[0] <= MAX_STRING_SIZE) 
	{ /*  未截断 */  
        for (i = 1; i <= S1[0]; i++)  
            T[i] = S1[i];  
        for (i = 1; i <= S2[0]; i++)  
            T[S1[0] + i] = S2[i];  
        T[0] = S1[0] + S2[0];  
        return true;  
    } 
	else 
	{ /*  截断S2 */  
        for (i = 1; i <= S1[0]; i++)  
            T[i] = S1[i];  
        for (i = 1; i <= MAX_STRING_SIZE - S1[0]; i++)  
            T[S1[0] + i] = S2[i];  
        T[0] = MAX_STRING_SIZE;  
        return false;  
    }  
}  
 /* 用Sub返回串S的第pos个字符起长度为len的子串。 */  
bool SubString(SString Sub, SString S, int pos, int len) 
{  
    int i;  
    if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)  
        return false;  
    for (i = 1; i <= len; i++)  
        Sub[i] = S[pos + i - 1];  
    Sub[0] = len;  
    return true;  
} 


/*  初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */  
/*  操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */  
bool StrInsert(SString S, int pos, SString T) 
{  
    int i;  
    if (pos < 1 || pos > S[0] + 1)  
        return false;  
    if (S[0] + T[0] <= MAX_STRING_SIZE) 
	{ /*  完全插入 */  
        for (i = S[0]; i >= pos; i--)  
            S[i + T[0]] = S[i];  
        for (i = pos; i < pos + T[0]; i++)  
            S[i] = T[i - pos + 1];  
        S[0] = S[0] + T[0];  
        return true;  
    }
	else 
	{ /*  部分插入 */  
        for (i = MAX_STRING_SIZE; i <= pos; i--)  
            S[i] = S[i - T[0]];  
        for (i = pos; i < pos + T[0]; i++)  
            S[i] = T[i - pos + 1];  
        S[0] = MAX_STRING_SIZE;  
        return false;  
    }  
}  
  
/*  初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */  
/*  操作结果: 从串S中删除第pos个字符起长度为len的子串 */  
bool StrDelete(SString S, int pos, int len) 
{  
    int i;  
    if (pos < 1 || pos > S[0] - len + 1 || len < 0)  
        return false;  
    for (i = pos + len; i <= S[0]; i++)  
        S[i - len] = S[i];  
    S[0] -= len;  
    return true;  
}
  
 /* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */  
/* 其中,T非空,1≤pos≤StrLength(S)。 */  
/* 蛮力法*/  
int Index(SString S, SString T, int pos) 
{  
    int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */  
    int j = 1; /* j用于子串T中当前位置下标值 */  
    while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */  
    {  
        if (S[i] == T[j]) /* 两字母相等则继续 */  
        {  
            ++i;  
            ++j;  
        } else /* 指针后退重新开始匹配 */  
        {  
            i = i - j + 2; /* i退回到上次匹配首位的下一位 */  
            j = 1; /* j退回到子串T的首位 */  
        }  
    }  
    if (j > T[0])  
        return i - T[0];  
    else  
        return 0;  
} 
/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */  
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */  
bool Replace(SString S, SString T, SString V) 
{  
    int i = 1; /*  从串S的第一个字符起查找串T */  
    if (StrEmpty(T)) /*  T是空串 */  
        return false;  
    do {  
        i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */  
        if (i) /*  串S中存在串T */  
        {  
            StrDelete(S, i, StrLength(T)); /*  删除该串T */  
            StrInsert(S, i, V); /*  在原串T的位置插入串V */  
            i += StrLength(V); /*  在插入的串V后面继续查找串T */  
        }  
    } while (i);  
    return true;  
} 
  
  
/*  初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */  
/*  操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */  
bool StrReplace(SString S, SString T, SString V) {  
    int i = 1; /*  从串S的第一个字符起查找串T */  
    if (StrEmpty(T)) /*  T是空串 */  
        return false;  
    do {  
        i = Index(S, T, i); /*  结果i为从上一个i之后找到的子串T的位置 */  
        if (i) /*  串S中存在串T */  
        {  
            StrDelete(S, i, StrLength(T)); /*  删除该串T */  
            StrInsert(S, i, V); /*  在原串T的位置插入串V */  
            i += StrLength(V); /*  在插入的串V后面继续查找串T */  
        }  
    } while (i);  
    return true;  
}  
 
 
 
 
 
    
 
 

 
#include"String.h"



void main()
{
	char *T = "abbaba";
	char *P = "abc";
      
	int index = Index1(T,P);
	cout<<"index = "<<index<<endl;
	cout<<StrCompare( T,P)<<endl;
	//cout<<StrEmpty(T)<<endl;//空为1;非空为0
}


串及其功能的实现

标签:数据结构      复制   链接   删除   

原文地址:http://blog.csdn.net/fujinlong520/article/details/46369373

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!