mirror of
https://github.com/kangjianwei/Data-Structure.git
synced 2026-02-09 02:02:32 +08:00
196 lines
2.9 KiB
C
196 lines
2.9 KiB
C
/*=============================
|
||
* 串的定长顺序存储表示(顺序串)
|
||
*
|
||
* 包含算法: 4.1、4.2、4.3、4.5
|
||
==============================*/
|
||
|
||
#include "SString.h" //**▲04 串**//
|
||
|
||
/*
|
||
* 初始化
|
||
*
|
||
* 构造一个值为chars的串T。
|
||
*
|
||
*【注】
|
||
* 该操作属于最小操作子集
|
||
*/
|
||
Status StrAssign(SString T, const char* chars) {
|
||
int i, len;
|
||
|
||
len = (int) strlen(chars);
|
||
|
||
// chars过长
|
||
if(len > MAXSTRLEN) {
|
||
return ERROR;
|
||
}
|
||
|
||
T[0] = len;
|
||
for(i = 1; i <= len; i++) {
|
||
T[i] = chars[i - 1];
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
/*
|
||
* 清空
|
||
*
|
||
* 将串S清空。
|
||
*/
|
||
Status ClearString(SString S) {
|
||
// 只需要将长度置为0就可以
|
||
S[0] = 0;
|
||
return OK;
|
||
}
|
||
|
||
/*
|
||
* 判空
|
||
*
|
||
* 判断串S中是否包含有效数据。
|
||
*
|
||
* 返回值:
|
||
* TRUE : 串S为空
|
||
* FALSE: 串S不为空
|
||
*/
|
||
Status StrEmpty(SString S) {
|
||
return S[0] == 0 ? TRUE : FALSE;
|
||
}
|
||
|
||
/*
|
||
* 计数
|
||
*
|
||
* 返回串S中元素的个数。
|
||
*
|
||
*【注】
|
||
* 该操作属于最小操作子集
|
||
*/
|
||
int StrLength(SString S) {
|
||
return S[0];
|
||
}
|
||
|
||
/*
|
||
* ████████ 算法4.3 ████████
|
||
*
|
||
* 求子串
|
||
*
|
||
* 用Sub返回S[pos, pos+len-1]。
|
||
* 返回值指示是否截取成功。
|
||
*
|
||
*【注】
|
||
* 该操作属于最小操作子集
|
||
*/
|
||
Status SubString(SString Sub, SString S, int pos, int len) {
|
||
int i;
|
||
|
||
if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) {
|
||
return ERROR;
|
||
}
|
||
|
||
// 复制元素
|
||
for(i = 1; i <= len; i++) {
|
||
Sub[i] = S[pos + i - 1];
|
||
}
|
||
|
||
// 确定新长度
|
||
Sub[0] = len;
|
||
|
||
return OK;
|
||
}
|
||
|
||
/*
|
||
* 删除
|
||
*
|
||
* 删除S[pos, pos+len-1]。
|
||
*/
|
||
Status StrDelete(SString S, int pos, int len) {
|
||
int i;
|
||
|
||
if(pos < 1 || pos + len - 1 > S[0] || len < 0) {
|
||
return ERROR;
|
||
}
|
||
|
||
// 如果待删除的长度为0,则提前返回
|
||
if(len == 0) {
|
||
return OK;
|
||
}
|
||
|
||
// 把后面的元素挪到前面,覆盖掉被删除的元素
|
||
for(i = pos + len; i <= S[0]; i++) {
|
||
S[i - len] = S[i];
|
||
}
|
||
|
||
// 长度减少
|
||
S[0] -= len;
|
||
|
||
return OK;
|
||
}
|
||
|
||
/*
|
||
* 比较
|
||
*
|
||
* 比较串S和串T,返回比较结果。
|
||
*
|
||
*【注】
|
||
* 该操作属于最小操作子集
|
||
*/
|
||
int StrCompare(SString S, SString T) {
|
||
int i = 1;
|
||
|
||
while(i <= S[0] && i <= T[0]) {
|
||
// 遇到不同的字符时,比较其大小
|
||
if(S[i] != T[i]) {
|
||
return S[i] - T[i];
|
||
}
|
||
|
||
i++;
|
||
}
|
||
|
||
return S[0] - T[0];
|
||
}
|
||
|
||
/*
|
||
* 复制
|
||
*
|
||
* 将串S复制到串T。
|
||
*/
|
||
Status StrCopy(SString T, SString S) {
|
||
int i;
|
||
|
||
// 连同长度信息一起复制
|
||
for(i = 0; i <= S[0]; i++) {
|
||
T[i] = S[i];
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
/*
|
||
* 清理字符串S中的空白,包括清理不可打印字符和清理空格。
|
||
*
|
||
*【注】
|
||
* 该函数是在本章中新增的。
|
||
*/
|
||
Status ClearBlank(SString S) {
|
||
int i, j;
|
||
|
||
// 如果是空串
|
||
if(S[0] == 0) {
|
||
return ERROR;
|
||
}
|
||
|
||
for(i = 1, j = 0; i <= S[0]; i++) {
|
||
// 如果遇到空白,则略过
|
||
if(S[i] == ' ' || !isprint(S[i])) {
|
||
continue;
|
||
}
|
||
|
||
j++;
|
||
|
||
S[j] = S[i];
|
||
}
|
||
|
||
S[0] = j;
|
||
|
||
return OK;
|
||
}
|