顺序结构的存储空间都是事先定义的,顺序串也不例外,故也可成为 定长顺序串,它的存储类型是字符串的char类型。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define true 1
#define false 0
#define max 20
typedef struct {
char data[max];
int length;
}SString,*string;
//初始化串
int Init(string L){
L=(string)malloc(sizeof(SString)) ; //此处没做申请成功与否的判断
L->length=0;
}
//创建串
int StrAssign(SString *L, const char chars[]){ //双引号引起来的字符串是const的,用此说明更严谨些
int i;
for(i=0;chars[i]!='\0';i++){
L->data[i]=chars[i];
}
L->length=i;
}
//串遍历
int Strbl(string L){
if(L->length==0){
printf("当前串为空!");
return false;
}
for (int i = 0; i < L->length; i++)
{
printf("%c",L->data[i]);
}
printf("\n");
return true;
}
被插串设为L,插串设为S.pos为插入位置
//串插入
int Insert(SString *L,int pos,const SString l){
if(pos<1||pos>L->length){
printf("插入位置错误!");
return false;
}else if((L->length+l.length)<=max){ //当插入后能装下
for(int i=L->length;i>=pos;i--){ //将pos位置到L的结尾向后推l的长度
L->data[i+l.length]=L->data[i];
}
int k=pos -1;
for(int j=0;j<l.length;j++){ //将l的字符依次赋值给L的pos位往后
L->data[k++]=l.data[j];
}
L->length=L->length+l.length;
}else if(pos+l.length<=max){ //l串可以完全插入,L串出现截断
for(int i=max;i>=pos+l.length;i--){
L->data[i-1]=L->data[i-l.length];
}
for(int j=pos;j<pos+l.length;j++){
L->data[j-1]=l.data[j-pos];
}
L->length=max;
}else {
for(int i=pos;i<=max;i++){
L->data[i-1]=l.data[i-pos];
}
L->length=max;
}
}
//串删除
int StrDelete(string L,int pos,int len){
int i=1;
if(pos<1||pos>L->length||len<0||len>L->length){ //位置不合法
return false;
}
for(i=pos;i<=pos+len;i++){
L->data[i]=L->data[i+len];
}
L->length=L->length-len;
return true;
}
也存在三种情况:(被插串设为L,插串设为S)
//串连接
int StrLCon(SString *L,const SString l) {
int i;
if(L->length+l.length<=max){
for(i=0;i<l.length;i++){
L->data[L->length+i]=l.data[i];
}
L->length=L->length+l.length;
return true;
}else if(L->length<max){
for(i=0;i<max;i++){
L->data[L->length+i]=l.data[i];
}
L->length=max;
return true;
}
if(L->length>max||l.length>max){
printf("操作失误!");
return false;
}
}
找到pos位置,然后依次输出元素,到len停止
//求子串
int Strchild(SString *L,int pos,int len){
int i;
if(pos<1||pos>L->length||len<0||len>L->length){
printf("位置错误!");
return false;
}else{
for(i=1;i<=len;i++){
printf("%c",L->data[pos-1]);
}
}
}
int main(){
SString s;
SString s1;
Init(&s);
Init(&s1);
printf("-----将aaaaa赋给s,bbb赋给s1-----\n");
char a[]={"aaaaa"};
char b[]={"bbb"};
StrAssign(&s,a); //创建字符串s
StrAssign(&s1,b); //创建字符串s1
printf("此时字符串s为:");
Strbl(&s);
printf("此时字符串s1为:");
Strbl(&s1);
printf("二者连接后为:");
StrLCon(&s,s1);
Strbl(&s);
printf("在连接后s串的第二个位置插入s1串为:");
Insert(&s,2,s1);
Strbl(&s);
printf("在插入后s串的第四个位置删除长度为4的字符串:");
StrDelete(&s,4,4);
Strbl(&s);
printf("此时s串从第二个位置开始长度为2的子串:");
Strchild(&s,2,2);
}
程序能run,需要的可以扒下来。