考研数据结构之串(3.1)——串的操作(C表示)

概述

串的常见操作:

  • 赋值操作:将一个字符数组(即串)中的所有元素复制到另一个字符数组中。
  • 取串长操作:在使用变长分配存储表示的情况下,直接返回str.length即可。
  • 串比较操作:设两个串A和B中的待比较字符分别为a和b,如果a的ASCII码小于b的ASCII码,则返回A小于B的标记;如果a的ASCII码大于b的ASCII码,则返回A大于B的标记;如果a的ASCII码等于b的ASCII码,则按照之前的规则比较两串中的下一对字符。经过上述步骤,在没有比较出A和B大小的情况下,先结束的串为较小的串,两串同时结束则返回两串相等标记。
  • 串连接操作:将两个串首尾相连,合并成一个字符串。
  • 求子串操作:求从给定串中某一位置开始到某一位置结束的串。
  • 串清空操作:清空串。

代码

核心代码:

/* 赋值操作 */
/* &str指的是新字符串;*ch指的是原字符串 */
int strAssign(Str &str,char *ch) {
	if(str.ch) {// 如果原字符串有内容
		free(str.ch);// 则释放原串空间
	}
	int len=0;
	char *c=ch;// 求ch串的长度
	while(*c) {
		len++;
		c++;
	}
	if(len==0) { // 如果ch为空串,则直接返回空串
		str.ch=NULL;
		str.length=0;
		return 1;
	} else {
		str.ch=(char *)malloc(sizeof(char)*(len+1));// 取len+1是为了多分配一个空间存放"\0"字符
		if(str.ch==NULL) {
			return 0;
		} else {
			c=ch;
			for(int i=0; i<=len; i++,c++) { // 注意:循环条件中之所以使用"<="是为了将ch最后的"\0"复制到新串中作为结束标记
				str.ch[i]=*c;
			}
			str.length=len;
			return 1;
		}
	}
}

/* 求字符串长度 */
int strLength(Str str) {
	return str.length;// 返回字符串的长度
}

/* 字符串的比较,返回0表示相等,返回>0表示大于,返回<0表示小于 */
/* s1指的是要参与比较的字符串1;s2的是要参与比较的字符串2 */
int strCompare(Str s1,Str s2) {
	for(int i=0; i<s1.length&&i<s2.length; i++) {
		if(s1.ch[i]!=s2.ch[i]) {
			return s1.ch[i]-s2.ch[i];
		}
	}
	return s1.length-s2.length;
}

/* 连接字符串 */
/* &str指的是连接成功后的新字符串;str1指的是原字符串1;str2指的是原字符串2 */
int concat(Str &str,Str str1,Str str2) {
	if(str.ch) {
		free(str.ch);// 释放原串空间
		str.ch=NULL;
	}
	str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
	if(str.ch==NULL) {
		return 0;
	}
	int i=0;
	while(i<str1.length) {
		str.ch[i]=str1.ch[i];
		i++;
	}
	int j=0;
	while(j<=str2.length) {
		str.ch[i+j]=str2.ch[j];
		j++;
	}
	str.length=str1.length+str2.length;
	return 1;
}

/* 求子串 */
/* &substr指的是结果子串;str指的是原字符串;pos指的是起始位置下标;len指的是要取子串的长度 */
int subString(Str &substr,Str str,int pos,int len) {
	if(pos<0||pos>=str.length||len<0||len>str.length-pos) {
		return 0;
	}
	if(len==0) {
		substr.ch=NULL;
		substr.length=0;
		return 1;
	} else {
		substr.ch=(char *)malloc(sizeof(char)*(len+1));
		int i=pos;
		int j=0;
		while(i<pos+len) {
			substr.ch[j]=str.ch[i];
			i++;
			j++;
		}
		substr.ch[j]='\0';
		substr.length=len;
		return 1;
	}
}

/* 串清空 */
int clearString(Str &str) {
	if(str.ch) {
		free(str.ch);
		str.ch=NULL;
	}
	str.length=0;
	return 1;
}

完整代码:

#include<stdio.h>
#include<stdlib.h>

#define maxSize 20

typedef struct {
	char *ch;
	int length;
} Str;

/* 打印字符串 */
void printStr(Str str) {
	printf("\n");
	for(int i=0; i<str.length; i++) {
		printf("%c",str.ch[i]);
	}
	printf("\n");
}

/* 赋值操作 */
/* &str指的是新字符串;*ch指的是原字符串 */
int strAssign(Str &str,char *ch) {
	if(str.ch) {// 如果原字符串有内容
		free(str.ch);// 则释放原串空间
	}
	int len=0;
	char *c=ch;// 求ch串的长度
	while(*c) {
		len++;
		c++;
	}
	if(len==0) { // 如果ch为空串,则直接返回空串
		str.ch=NULL;
		str.length=0;
		return 1;
	} else {
		str.ch=(char *)malloc(sizeof(char)*(len+1));// 取len+1是为了多分配一个空间存放"\0"字符
		if(str.ch==NULL) {
			return 0;
		} else {
			c=ch;
			for(int i=0; i<=len; i++,c++) { // 注意:循环条件中之所以使用"<="是为了将ch最后的"\0"复制到新串中作为结束标记
				str.ch[i]=*c;
			}
			str.length=len;
			return 1;
		}
	}
}

/* 求字符串长度 */
int strLength(Str str) {
	return str.length;// 返回字符串的长度
}

/* 字符串的比较,返回0表示相等,返回>0表示大于,返回<0表示小于 */
/* s1指的是要参与比较的字符串1;s2的是要参与比较的字符串2 */
int strCompare(Str s1,Str s2) {
	for(int i=0; i<s1.length&&i<s2.length; i++) {
		if(s1.ch[i]!=s2.ch[i]) {
			return s1.ch[i]-s2.ch[i];
		}
	}
	return s1.length-s2.length;
}

/* 连接字符串 */
/* &str指的是连接成功后的新字符串;str1指的是原字符串1;str2指的是原字符串2 */
int concat(Str &str,Str str1,Str str2) {
	if(str.ch) {
		free(str.ch);// 释放原串空间
		str.ch=NULL;
	}
	str.ch=(char *)malloc(sizeof(char)*(str1.length+str2.length+1));
	if(str.ch==NULL) {
		return 0;
	}
	int i=0;
	while(i<str1.length) {
		str.ch[i]=str1.ch[i];
		i++;
	}
	int j=0;
	while(j<=str2.length) {
		str.ch[i+j]=str2.ch[j];
		j++;
	}
	str.length=str1.length+str2.length;
	return 1;
}

/* 求子串 */
/* &substr指的是结果子串;str指的是原字符串;pos指的是起始位置下标;len指的是要取子串的长度 */
int subString(Str &substr,Str str,int pos,int len) {
	if(pos<0||pos>=str.length||len<0||len>str.length-pos) {
		return 0;
	}
	if(len==0) {
		substr.ch=NULL;
		substr.length=0;
		return 1;
	} else {
		substr.ch=(char *)malloc(sizeof(char)*(len+1));
		int i=pos;
		int j=0;
		while(i<pos+len) {
			substr.ch[j]=str.ch[i];
			i++;
			j++;
		}
		substr.ch[j]='\0';
		substr.length=len;
		return 1;
	}
}

/* 串清空 */
int clearString(Str &str) {
	if(str.ch) {
		free(str.ch);
		str.ch=NULL;
	}
	str.length=0;
	return 1;
}

int main() {
	Str str;
	strAssign(str,"abcd efgh");
	printStr(str);

	Str str2,str3;
	str2.length=2;
	str2.ch="ab";
	str3.length=3;
	str3.ch="abc";
	int r=strCompare(str2,str3);
	printf("%d",r);

	Str str4;
	concat(str4,str2,str3);
	printStr(str4);

	Str str5;
	int i=subString(str5,str,2,2);
	printStr(str5);

	return 0;
}

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章