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

来源:互联网 发布:进销存软件 推荐 知乎 编辑:程序博客网 时间:2024/05/15 07:36

串是0个或者多个字符组成的有限序列,记作

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

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

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

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

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


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

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

顺序串中数组第一个元素存储的串的长度,又因为 unsigned char 定义的数据大小范围是 0~255 所以串的空间就有了很大的限制。不过将数组的第一个元素存储串的长度符合

我们的正常逻辑(c语言的数组下标从0开始)。

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

#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAXSTRLEN 255typedef 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复制给串Tvoid StrCopy(SString T,SString S1){int i;for(i=1;i<=S1[0];i++)T[i] = S1[i];T[0] = S1[0]; }//判断串是否为空串,是返回1不是返回0int 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“大于”串 S1if(T[0] < S1[0])flag=2;if(i == S1[0] && i == T[0])flag=0;// 0 代表串T“等于”串 S1return 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连接在一起,连接之后的串复制给s1void 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的串复制给串S1void 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个字符之前插入串Tvoid 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相等的字串返回字串在主串中第一次出现的位置否则返回0int 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相同的字串将其替代为串Vvoid 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;}



原创粉丝点击