c语言字符串数组和特殊矩阵
储及其实现 1、串的顺序存储及其部分运算的实现
串的顺序存储使用数组存放,具体类型定义如下: #define MAXSIZE 100 typedef struct { char str[MAXSIZE]; int length ; } seqstring;
两个字符串相等,当且仅当两个串的长度相等,并且各个对应位置的字符都相等。例如: T1=“REDROSE” T2=“RED ROSE”
由于T1和T2的长度不相等,因此T1≠T2。 若
T3=“STUDENT” T4=“STUDENS” 虽然T3和T4的长度相等,但两者有些对应的字符不同,因而T3≠T4。
return (r); }
(4)求子串运算substring(S,i,len)
seqstring *substring(seqstring S,int i, int len) { int k; seqstring *r;
if (i<1 || i>S.length || i+len-1>S.length) { printf(“error\n”); return(NULL);}
(1)插入运算strinsert(S,i,T)
void strinsert(seqstring *S, int i , seqstring T) { int k;
if (i<1 || i>S->length+1 || S->length + T.length>MAXSIZE) printf("connot insert\n“);
c语言字符串数组和特殊矩阵
4 .1 字符串 4.1.1 字符串的基本概念
字符串是由零个或多个字符构成的有限序列,一般可表示成如下形式:
“c1 c2 c3….cn” (n≥0) 串中所含字符的个数n称为字符串的长度;当n=0时,称字符串为空串。
串中任意个连续的字符构成的子序列称为该串的子串,包含子串的串称为主串。通常称字符在字符串序列 中的序号为该字符在串中的位置。子串在主串中的位置以子串的第一个字符在主串中的位置来表示。例如:T =“STUDENT”,S=“UDEN”, 则S是T的子串,S在T中出现的位置为3。
值得一提的是,若S=“ ”,此时S由一个空格字符组成,其长度为1,它不等价于空串,因为空串的长度为 0。
4.1.2 字符串类的定义
ADT string { 数据对象D:由零个或多个字符型的数据元素构成的有限集合; 数据关系R:{<ai, ai+1>|其中ai, ai+1D, i=1,2,……n-1 } 字符串的基本操作如下: (1) Strcreate(S) (2) Strassign(S, T) (3) Strlength(S) (4) Strempty(S)
else { for(k=S->length-1;k>=i-1;k--) S->str[T.length+k]=S->str[k]; for (k=0;k<T.length;k++) S->str[i -1 +k]=T.str[k]; S->length= S->length + T.length; S->str[S->length]=‘\0’; } }
}
(3)连接运算strconcat(S1,S2) seqstring * strconcat(seqstring S1,seqstring S2)
{ int i; seqstring *r; if (S1.length+S2.length>MAXSIZE) { printf("cannot concate"); return(NULL);} else { r=(seqstring*)malloc (sizeof(seqstring)); for (i=0; i<S1.length;i++) r->str[i]= S1.str[i]; for (i=0; i<S2.length;i++) r->str[ S1.length+i]= S2.str[i]; r->length= S1.length+ S2.length; r->str[r->length]='\0'; }
else { r=(seqstring*) malloc (sizeof(seqstring)); for(k=0;k<len;k++) r->str[k]= S.str[i-1+k]; r->length=len; r->str[r->length]='\0'; }
return(r); }
2 串的链接存储及其部分运算的实现 串的链接存储采用单链表的形式实现,其中每个结点的定义如下:
(2)删除运算strdelete(S,i,len)
void strdelete(seqstring *S,int i,int len) { int k ;
if (i<1 || i>S->length||i+len-1>S->length) printf(“ cannot delete\n”);
else { for(k=i-1+len; k<S->length;k++) S->str[k-len]= S->str[k]; S->length=S->length-len; S->str[S->length]=‘\0’; }
(5) Strclear(S) (6)Strcompare(S1,S2) (7) Strconcat(S1,S2) (8) Substring(S, i, len) (9) Index(P,T) (10) Strinsert(S, i, T) (11) Strdelete(S,i,len) (12) Replace(S, T1, T2) (13) Strdestroy(S)
typedef struct node { char data; struct node *next; } linkstrnode;
typedef linkstrnode *linkstring; 例如,串S=“abcde”,其链接存储结构如下图所示:
S
a
b
c
d
e∧
(1)创建字符串运算strcreate (S)