2019.10.12
数据结构中串的基本操作实现,包括串的定义,串的初始化,赋值,获取串的长度,串的比较,连接串,求子串,清空串。
语言:c语言
运行环境:dev
#include <stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
//数据结构-串
typedef struct {
//指向串的首地址
char *ch;
//串的长度
int length;
} SString;
//串的初始化,分配空间
Status SStringInit(SString *str) {
str->length =0;
str->ch=NULL;
return OK;
}
//将ch的值复制到str中
Status SStringAssign( SString & str ,char * ch) {
int len = 0;
char * c = ch;
//求串长,计算需要给str分配多大空间,len=ch的长度+1
while (*c) {
++len;
++c;
}
str.ch = (char *)malloc(sizeof(char)*(len + 1));
if(str.ch ==NULL)//空间分配失败
return 0;
else {
c = ch;
for(int i = 0; i <= len ; ++i,++c)
str.ch[i] = *c;
str.length = len;
return 1;
}
}
//获取串的长度
Status GetSStringLength(SString str) {
return str.length;
}
//串比较,
Status StrCompare(SString str1,SString str2) {
for(int i = 0; i <str1.length && i < str2.length; ++i)
if(str1.ch[i] != str2.ch[i])
return str1.ch[i] - str2.ch[i];
return str1.length - str2.length;
}
//连接str1,str2,并且将其储存到str中
Status Concat(SString str1, SString str2, SString &str) {
//先给str分配空间,大小为str1+str2
str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
if(str.ch==NULL) {
printf("分配空间失败!");
return ERROR;
}
//定义i,j,一个辅助str1的转移,另一个辅助str2的转移,最后将str.length=i+j, 并且str.ch[i+j]='\0';
int i=0,j=0;
while(i<str1.length) {
str.ch[i]=str1.ch[i];
i++;
}
while(j<str1.length) {
str.ch[i+j]=str2.ch[j];
j++;
}
str.ch[i+j]='\0';
str.length = str1.length+str2.length;
return OK;
}
//求子串:从主串str里的第pos位置后开始,依次把len个元素作为子串substr
Status GetSubString(SString str,int pos, int len, SString &substr) {
//判断该位置是否合理
if(pos<0||pos>str.length) {
printf("输入的起始位置不合法!");
return ERROR;
}
//如果substr.ch之前已经分配过空间了,便将其释放,使指针指向null,重新分配空间
if(substr.ch) {
free(substr.ch);
substr.ch=NULL;
}
//为str分配空间,空间大小为len
substr.ch=(char *)malloc(sizeof(char)*(len+1));
//
int i=pos,j=0;
while(i<pos+len) {
substr.ch[j]=str.ch[i];
i++;
j++;
}
substr.ch[j]='\0';
substr.length=len;
return OK;
}
//清空串
Status ClearString(SString &str) {
if(str.ch) {
free(str.ch);
str.ch=NULL;
}
str.length=0;
return OK;
}
int main() {
SString str1,str2,str;
SStringInit(&str1);
printf("str1初始化:%s %d\n",str1.ch,str1.length);
SStringInit(&str2);
printf("str2初始化:%s %d\n",str2.ch,str2.length);
SStringAssign(str1,"hello world");
printf("填充内容:%s 长度:%d\n",str1.ch,str1.length);
SStringAssign(str2,"hello world1");
printf("填充内容:%s 长度:%d\n",str2.ch,str2.length);
printf("str1的长度为:%d\n",GetSStringLength(str1));
printf("两个串是否相等?:%d (0代表相等,其余值代表不相等)\n",StrCompare(str1,str2));
Concat(str1,str2,str);
printf("str1与str2连接后:%s\n",str.ch);
GetSubString(str1,0,5,str);
printf("str1从0到5的内容:%s\n",str.ch);
ClearString(str);
printf("清除串str:%s %d\n",str.ch,str.length);
return 0;
}