4.1串的定义和基本操作








4.1_2串的存储结构


#include<stdio.h>
#define MAXLEN 255//
typedef struct{
char ch[MAXLEN];//
int length;//
}SString;
typedef struct{
char ch*;
int length;
}HString;
HString S;
S.ch = (char *)malloc(MAXLEN * sizeof(char));
S.length = 0;


typedef struct StringNode{
char ch;
struct StringNode * next;
}StringNode,* String;
typedef struct StringNode{
char ch[4];
struct StringNode * next;
}StringNode, * String;

#include<stdio.h>
#include<stdbool.h>
#define MAXLEN 255
typedef struct{
char ch[MAXLEN];
int length;
}SString;
bool SubString (SString &Sub, SString S,int pos,int len){
if(pos+len-1 > S.length)
return false;
for(int i=pos;i<pos+len;i++)
Sub.ch[i-pos+1] = S.ch[i];
Sub.length = len;
return true;
}
#include<stdio.h>
#include<stdbool.h>
#define MAXLEN 255
// 定长顺序存储串(教材常用:ch[0]闲置,有效字符从 ch[1] 开始)
typedef struct{
char ch[MAXLEN];
int length;
}SString;
// 取子串:C语言用指针代替引用
bool SubString(SString *Sub, SString S, int pos, int len)
{
// 增加pos合法性判断 + 长度校验
if(pos < 1 || len < 0 || pos + len - 1 > S.length)
return false;
for(int i = pos; i < pos + len; i++)
{
Sub->ch[i - pos + 1] = S.ch[i];
}
Sub->length = len;
return true;
}
// 测试代码
int main(void)
{
SString s, sub;
// 赋值源串
s.ch[1] = 'a';
s.ch[2] = 'b';
s.ch[3] = 'c';
s.ch[4] = 'd';
s.length = 4;
if(SubString(&sub, s, 2, 2))
{
printf("子串:");
for(int i = 1; i <= sub.length; i++)
putchar(sub.ch[i]);
printf("\n长度:%d\n", sub.length);
}
else
{
printf("取子串失败\n");
}
return 0;
}

int StrCompare(SString S,SString T){
for(int i=1;i<S.length && i<=T.length;i++){
if(S.ch[i]!=T.ch[i])
return true;
}
return S.length-T.length;
}

int Index(SString S,SString T){
int i = 1,n=StrLength(S),m=StrLength(T);
SString sub;
while(i<=n-m+1){
SubString(sub,S,i,m);
if(String(sub,T)!=0) ++i;
else return i;
}
return 0;
}
