【数据结构基础】-串-顺序结构的基本操作实现

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值