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 0typedef 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的长度+1while (*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+str2str.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分配空间,空间大小为lensubstr.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;
}