考研數據結構之串(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;
}

運行結果:

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