您的位置:首页 > 理论基础 > 数据结构算法

一步一步复习数据结构和算法基础-顺序串

2012-07-11 17:04 489 查看
串是0个或者多个字符组成的有限序列,记作

S = ‘123456......n’ (每一个数字代表一个字符)(n >= 0)

串的元素可以使字母、数字、其他字符;简单写写串的基础知识。

1: 字串:串的任意个字符组成的子序列,例如串‘abcdefg’其中‘cde’就是‘abcdefg’的字串,而‘abcdefg’称为主串。

2:串的长度:就是串的元素的个数。

3:空串和空格串: 空串是串长度为0的串,而空格串是串的元素为一个空格的串。

那么什么是顺序串呢?顺序串就是用一组连续的存储单元来存储串。在c语言中就用定长数组来描述顺序串;

#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
顺序串中数组第一个元素存储的串的长度,又因为 unsigned char 定义的数据大小范围是 0~255 所以串的空间就有了很大的限制。不过将数组的第一个元素存储串的长度符合
我们的正常逻辑(c语言的数组下标从0开始)。

先上代码吧。顺序串可以实现的操作有很多。

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

#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];

//创建一个串
void StrAssign(SString T)
{
int i;
char temp[MAXSTRLEN];
gets(temp);
for(i=1;i<=MAXSTRLEN;i++)
{
T[i] = temp[i-1];
}
T[0] = strlen(temp);
}

//串复制,将串S1复制给串T
void StrCopy(SString T,SString S1)
{
int i;
for(i=1;i<=S1[0];i++)
T[i] = S1[i];
T[0] = S1[0];
}

//判断串是否为空串,是返回1不是返回0
int StrEmpty(SString T)
{
return T[0] == 0 ? 1:0;
}

//比较两个串大小(原理和strcmp一致)
int StrCompare(SString T,SString S1)
{
int i,flag;
for(i=1;i<T[0];i++)
{
if(T[i] > S1[i]){flag=1;break;}
if(T[i] < S1[i]){flag=2;break;} // 2 代表串T“小于”串 S1
}

if(T[0] > S1[0])flag=1; // 1 代表串T“大于”串 S1
if(T[0] < S1[0])flag=2;
if(i == S1[0] && i == T[0])flag=0; // 0 代表串T“等于”串 S1

return flag;
}

void StrCompareResult(int flag)
{
if(flag == 1)
printf("串a大于串b.\n");
else if(flag == 2)
printf("串a小于串b.\n");
else if(flag == 0)
printf("串a等于串b.\n");
}
//返回串的长度
int StrLength(SString T)
{
return T[0];
}

//清空串。
void ClearString(SString T)
{
memset(T,0,sizeof(T));
T[0]=0;
}

//将串s2和s3连接在一起,连接之后的串复制给s1
void StrConcat(SString s1,SString s2,SString s3)
{
int i,k;
if(s2[0] + s3[0] <= MAXSTRLEN)
{
s1[0] = s2[0]+s3[0];
for(i=1;i<=s2[0];i++)s1[i]=s2[i];
for(k=1;i<=s2[0]+s3[0];k++,i++)
s1[i] = s3[k];
}
else if(s2[0] < MAXSTRLEN)
{
s1[0] = MAXSTRLEN;
for(i=1;i<=s2[0];i++)
s1[i] = s2[i];
for(k=1;i<=MAXSTRLEN;i++,k++)
s1[i] = s3[k];
}
else
{
s1[0] = MAXSTRLEN;
for(i=1;i<=MAXSTRLEN;i++)
s1[i] = s2[i];
}
}

//将串T中从pos位置开始长度为len的串复制给串S1
void SubString(SString S1,SString T,int pos,int len)
{
int i,k;
if(pos < 1|| pos > T[0] || len < 0 || len > T[0] - pos + 1)
{
printf("操作失败,pos值或len值传递不合法.\n");
return;
}
S1[0] = len;
for(i=pos,k=1;i<=pos+len;i++,k++)
S1[k] = T[i];
}

//在串S的第pos个字符之前插入串T
void StrInsert(SString S,int pos,SString T)
{
int i,k;
if(pos < 1){printf("参数传递错误.\n");return;}
for(i = S[0];i>=pos;i--)
S[i+T[0]] = S[i];
for(i = pos,k=1;i<pos+T[0];i++,k++)
S[i] = T[k];
S[0] += T[0];
}

//从串S中删除第pos个字符起长度为len的字串
void StrDelete(SString S,int pos,int len)
{
int i;
if (pos < 1 || len > S[0] ||pos + len > S[0])
{
printf("参数传递错误.\n");
return ;
}
for(i=pos;i<=S[0]-len;i++)
S[i]=S[i+len];
S[0] -= len;
}

//若主串中第pos个字符之后存在于T相等的字串返回字串在主串中第一次出现的位置否则返回0
int StrIndex(SString S,SString T,int pos)
{
int m,n,i;
SString sub;
if(pos > 0)
{
n = StrLength(S); m = StrLength(T);i=pos;
while(i <= n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(sub,T) != 0 )++i;
else return i;
}
}

return 0;
}

//如果串S中有与串T相同的字串将其替代为串V
void StrReplaceSingleString(SString S,SString T ,SString V)
{
int i,pos;
pos = StrIndex(S,T,1);
if(pos == 0)return ;
StrInsert(S,pos+T[0],V);
StrDelete(S,pos,T[0]);
}
//打印一个串
void StrPrint(SString T)
{
int i;
for(i=1;i<=T[0];i++)
printf("%c",T[i]);
printf("\n");
}
int main()
{
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息