您的当前位置:首页正文

顺序串的基本操作(C实现)

2024-11-28 来源:个人技术集锦

一、概念

顺序结构的存储空间都是事先定义的,顺序串也不例外,故也可成为 定长顺序串,它的存储类型是字符串的char类型。

二、具体实现

1.结构体定义

#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;

2.串的初始化

//初始化串
int Init(string L){
	L=(string)malloc(sizeof(SString)) ;   //此处没做申请成功与否的判断
	L->length=0;
}

3.串的赋值(创建)

//创建串
 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;
 }

4.串遍历

//串遍历
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;
}

5.串插入

被插串设为L,插串设为S.pos为插入位置

  • 插入后串长小于等于max,则先将L的pos位到最后的元素后移S的串长,再将l的元素依次赋给L的pos位往后。
  • 插入后串长大于max,且S能完全插进去,L出现截断(元素丢失)。这时需要注意:L的后移元素的个数是max-S的串长+pos;
  • 插入后串长大于max,且S不能完全插进去。这时L不用后移,S后移的元素是max-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;
	}
}

6.串删除

//串删除
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;
}

7.串连接

也存在三种情况:(被插串设为L,插串设为S)

  • 连接后串长小于等于max,S直接依次赋值。
  • 连接后串长大于max,S截断赋值。
  • L串长大于等于max,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;
	}
}

8.求字串

找到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]);
		}
	}
} 

9.main函数

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,需要的可以扒下来。

显示全文