串分为顺序串,堆串,快链串三种
#include<stdio.h> #define MAXLEN 40 typedef struct String{ char ch[MAXLEN]; int len;//该串的长度 }SString; //顺序串插入函数,将字符串t插入字符串s的pos位置之前 //1.S->len+t->len<=MAXLEN //2.S->len+t->len>MAXLEN而且 pos+len<=MAXLEN,字符串t能够完全插入 //3.s->len+t->len>MAXLEN而且pos+len>MAXLEN,字符串t不能够完全插入 bool StrInsert(SString *s,int pos,SString t) { int i; //插入位置不合法 if(pos<0||pos>MAXLEN) return false; //插入后长度小于MAXLEN if(s->len+t.len<=MAXLEN) { //将s串下半部分放在正确位置 for(i=s->len+t.len-1;i>=pos+t.len;i--) s->ch[i]=s->ch[i-t.len]; //将t串插入pos for(i=0;i<t.len;i++) s->ch[pos+i]=t.ch[i]; //改变新串的长度值len s->len=s->len+t.len; } //插入后串长>MAXLEN,但是字符串t能够完全插入 else if(pos+t.len<=MAXLEN) { //将s串下半部分放在正确位置 for(i=MAXLEN-1;i>=pos+t.len;i--) s->ch[i]=s->ch[i-t.len]; //将t串插入正确位置 for(i=0;i<t.len;i++) s->ch[pos+i]=t->ch[i]; //改变新串的长度 s->len=MAXLEN; } //插入后串长>MAXLEN,且字符串t不能完全插入 else if(pos+t.len>MAXLEN) { //将t串部分元素放在正确位置 for(i=MAXLEN-1;i>=pos;i--) { s->ch[i]=t[i-pos]; } s->len=MAXLEN } return true; } //顺序串删除函数 //从顺序串中pos的位置开始删除len个元素:len为0时不删除,len>0时从pos开始一直删除到pos+len-1 bool SteString(SString *s,int pos,int len) { int i; if(pos<0||pos+len>s->len) return false; else { //从pos+len开始,每个元素都向前移动len个字符 for(i=pos+len;i<s->len;i++) s->ch[i-len]=s->ch[i]; return true; } } //串复制函数:将串t的值复制到s中 bool StrCopy(SString* s,SString t) { int i; for(i=0;i<s->len;i++) { s->ch[i]=t.ch[i]; } s->len=t.len; } //顺序串判空函数 bool IsEmpty(SString* s) { if(s->len==0) return true; else return false; } int StrCompare(SString* s,SString* t) { int i; for(i=0;i<s->len&&i<t->len;i++) if(s->ch[i]!=t->ch[i]) return s->ch[i]-t->ch[i]; return s->len-t->len; } //求串长函数 int StrLength(SString* s) { return s->len; } //清空串函数 void StrClear(SString* s) { s->len=0; } //串连接函数: /* 分为三种情况 1.如果s->len+t->len<=MAXLEN 2.如果s->len+t->len>MAXLEN而且s->len<MAXLEN,t能够连接部分进去 3.如果s->len=MAXLEN */ int StrCat(SString* s,SString* t) { int i,flag;//flag:0完全连接,1部分连接 2没有连接 if(s->len+t->len<=MAXLEN) { for(i=s->len;i<=s->len+t->len-1;i++) s->ch[i]=t[i-s->len]; flag=0; return flag } else if(s->len<MAXLEN) for(i=MAXLEN-1;i>=s->len;i--) s->ch[i]=t[i-s->len]; flag=1; return flag; else flag=2; return flag; } //求子串 bool SubString(SString* s,SString* t,int pos,int len) { int i; if(pos<0||pos+len>s->len||s->len==0||len<1) return false; else { for(i=0;i<len;i++) t->ch[i]=s->ch[pos+i]; t->len=len; return true; } } //顺序串的模式匹配 int StrIndex(SString* s,SString* t,int pos) { int i,j,start; if(pos>=s->len) return -1; if(t->len==0) return 0;//串为空串时,是任意串的匹配 start=pos; i=start; j=0; while(i<s->len&&j<t->len) { if(s->ch[i]==t->ch[j]) { i++; j++ } else { start++; i=start; j=0; } } if(j>=t->len) return start; else return -1; }
恩,这是大概的实现,具体的以后再说