#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "declear.h"
#define MAXSIZE 40
typedef char String[MAXSIZE + 1];
/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{
unsigned int index;
if (strlen(chars) > MAXSIZE)
{
return ERROR;
}
T[0] = strlen(chars); //T[0]存放长度
for (index=1; index <= strlen(chars); index++)
{
T[index] = chars[index - 1];
}
T[index] = '\0'; //方便调试
return OK;
}
/* 由串S复制得串T */
Status StrCopy(String T,String S)
{
unsigned int index;
for(index = 0; index <= S[0]; index++)
{
T[index] = S[index];
}
T[index] = '\0'; //方便调试
return OK;
}
/* 若S为空串,则返回TRUE,否则返回FALSE */
Status StrEmpty(String S)
{
if(!S[0])
{
return TRUE;
}
else
{
return FALSE;
}
}
/* 初始条件: 串S和T存在 */
/* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
int StrCompare(String S,String T)
{
/* 算法一(不简明)
unsigned minLen;
unsigned index;
minLen = S[0] < T[0] ? S[0]:T[0];
for (index = 1; index <= minLen; index++)
{
if (S[index] != T[index]) //一旦遇上不相等则推出循环
{
break;
}
}
if (index > minLen && S[0] == T[0]) //长度相同,并且完全匹配,则相等
{
return 0;
}
else if ((index <= minLen && S[index] > T[index]) || (index > minLen && S[0] > T[0]))
{
return 1; //若没有完全匹配,在适配的位置大的则大;如果完全匹配,长度大的则大
}
else
{
return -1;
}
*/
/***方法简明,想法很好***/
for (unsigned int index = 1; index <= S[0], index <= T[0]; index++)
{
if (S[index] != T[index]) //遇上不相等,比较失配位置的值
{
return S[index] - T[index];
}
}
return S[0] - T[0]; //若果完全匹配,比较长度
}
unsigned int StrLength(String S)
{
return S[0];
}
/* 初始条件:串S存在。操作结果:将S清为空串 */
Status ClearString(String S)
{
S[0] = 0;
return OK;
}
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
unsigned index;
if(S1[0] + S2[0] <= MAXSIZE)
{
//StrAssign(T, S1); //不能这样把S1的值赋给T,这样吧S[0]赋给了T[1]
for (index = 1; index <= S1[0]; index++)
{
T[index] = S1[index];
}
// printf("T[0] = %d\n",T[0]);
// printf("S1[0] = %d\n",S1[0]);
for (index = 1; index <= S2[0]; index++)
{
T[S1[0] + index] = S2[index];
//++T[0];
}
T[0] = S1[0] + S2[0];
T[S1[0] + S2[0] + 1] = '\0';
return TRUE;
}
else
{
//StrAssign(T, S1);
for (index = 1; index <= S1[0]; index++)
{
T[index] = S1[index];
}
for (index = S1[0] + 1; index <= MAXSIZE; index++)
{
T[index] = S2[index - S1[0]];
}
T[MAXSIZE] = '\0';
return FALSE;
}
}
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
if (pos < 1 || pos > S[0] || pos > S[0] - len +1 || len <0) //注意条件
{
return ERROR;
}
for (unsigned index = 1; index <= len; index++)
{
Sub[index] = S[index + pos - 1];
}
Sub[0] = len;
Sub[len + 1] = '\0';
return OK;
}
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
int Index(String S, String T, int pos)
{
int sIndex = pos;
int tIndex = 1;
while (sIndex <= S[0] && tIndex <= T[0])
{
if (T[tIndex] == S[sIndex])
{
++tIndex;
++sIndex;
}
else
{
tIndex = 1;
sIndex = sIndex - tIndex + 2;
}
}
if (tIndex > T[0])
{
return sIndex - T[0];
}
else
{
return FALSE;
}
}
Status StrPrint(String T)
{
for(unsigned index = 1; index <= T[0]; index++)
{
printf("%c", T[index]);
}
printf("\n");
return OK;
}
/* 初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/* 操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
Status StrInsert(String S,int pos,String T)
{
unsigned index;
if (S[0] + T[0] <= MAXSIZE) //完全插入
{
for (index = S[0]; index >= pos; index--)
{
S[index + T[0]] = S[index];
}
for (index = 1; index <= T[0]; index++)
{
S[index + pos - 1] = T[index];
}
S[0] = S[0] + T[0];
return OK;
}
else //不完全插入
{
for (index = S[0]; index >= pos; index--) //从pos开始到串尾移动到剩余空间的尾部
{
S[MAXSIZE - (S[0] - index)] = S[index];
//printf("0k\n");
}
//printf("%c\n", S[MAXSIZE]);
for (index = 1; index <= MAXSIZE - S[0]; index++) //从T[1]开始到剩余空间,插满为止
{
S[pos + index - 1] = T[index];
}
S[0] = MAXSIZE;
return FALSE;
}
}
/* 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/* 操作结果: 从串S中删除第pos个字符起长度为len的子串 */
Status StrDelete(String S,int pos,int len)
{
int index;
if (pos < 1 || pos + len > S[0] - 1 || len < 0)
{
return ERROR;
}
for (index = pos + len; index <= S[0]; index++)
{
S[index - len] = S[index];
}
S[0] = S[0] - len;
return OK;
}
int main()
{
String S, T, C;
Status flag = StrAssign(S,"hello,world!");
if (!flag)
{
printf("out of length!\n");
exit(OVERFLOW);
}
printf("S = ");
StrPrint(S);
StrCopy(T, S);
printf("T = ");
StrPrint(T);
printf("is string S an empty string?yes(1),no(0)\n");
printf("%d\n",StrEmpty(S));
StrAssign(S,"hello,world!!!!");
printf("S = ");
StrPrint(S);
printf("T = ");
StrPrint(T);
printf("StrLength(S) = %d\n",StrLength(S));
printf("StrLength(T) = %d\n",StrLength(T));
SubString(C, S, 3, 3);
printf("C = ");
StrPrint(C);
printf("position of C in S is = %d.Not Find (0)\n",Index(S, C, 1));
printf("compare S and T? S is bigger(1), equal(0), S is smaller(-1).\n");
printf("%d\n",StrCompare(S, T));
printf("%d\n",Concat(C, S, T));
printf("StrLength(C) = %d\n",StrLength(C));
printf("C = ");
StrPrint(C);
StrAssign(S,"Testmmmmmmmmmmmmmm");
StrInsert(S, 1, C);
printf("S = ");
StrPrint(S);
StrDelete(S,3,3);
printf("S = ");
StrPrint(S);
return 0;
}
《大话数据结构》读书笔记之串和源码
最新推荐文章于 2019-10-27 15:27:20 发布