您的位置:首页 > 理论基础 > 数据结构算法

数据结构---串的定长顺序实现

2015-04-18 10:50 309 查看
计算机经常处理字符串类型数据,所以需要用一种数据结构来定义它。话术我感觉JAVA等高级语言封装后的字符串比较好用..C里面好多操作还需要自己来实现Orz

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN + 1];
typedef unsigned char *PtrString;

//get a string that value is 'chars'
PtrString StrAssign(char chars[]);

//copy a string
PtrString StrCopy(PtrString S);

//if string is empty , return 1
int StrEmpty(PtrString S);

//if S > T, return 1; if S == T , return 0; if S < T, return -1
int StrCompare(PtrString S, PtrString T);

//get length of string
int StrLength(PtrString S);

//Clear string
void ClearString(PtrString S);

//connet s1 and s2 to get a new string
PtrString Concat(PtrString S1, PtrString S2);

//get substring
PtrString SubString(PtrString S, int pos, int len);

//get substing's pos in string
int Index(PtrString S, PtrString T);

//replace substring in string
void Replace(PtrString S, PtrString T, PtrString V);

//insert substring
void StrInsert(PtrString S, PtrString T, int pos);

//from pos delete substring that length is len
void StrDelete(PtrString S, int pos, int len);

//destroy string
void DestroyString(PtrString S);

void PrintString(PtrString S);

int main()
{
PtrString S = StrAssign("abcdef");
PrintString(S);
PtrString TS = StrCopy(S);
PrintString(TS);
printf("%d\n", StrCompare(S, TS));
PtrString T = StrAssign("bc");
printf("%d\n", StrCompare(S, T));
PtrString CS = Concat(S, T);
PrintString(CS);
PtrString SS = SubString(S, 1, 2);
PrintString(SS);
printf("%d\n", Index(S, T));
StrDelete(S, 2, 2);
PrintString(S);
return 0;
}

PtrString StrAssign(char chars[])
{
PtrString S = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
for(int i = 1 ; chars[i-1] ; i ++)
{
S[i] = chars[i-1];
S[0] = i;
}
return S;
}

PtrString StrCopy(PtrString S)
{
PtrString T = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
T[0] = S[0];
for(int i = 1 ; i <= S[0] ; i ++)
T[i] = S[i];
return T;
}

int StrEmpty(PtrString S)
{
return S[0] ? 0 : 1;
}

int StrCompare(PtrString S, PtrString T)
{
int i;
for(i = 1 ; i <= S[0] && i <= T[0] ; i ++)
{
if(S[i] < T[i])
return -1;
if(S[i] > T[i])
return 1;
}
if(S[0] == T[0])
return 0;
if(i <= S[0])
return 1;
if(i <= T[0])
return -1;
}

int StrLength(PtrString S)
{
return S[0];
}

void ClearString(PtrString S)
{
S[0] = 0;
}

PtrString Concat(PtrString S1, PtrString S2)
{
if(S1[0] == MAXSTRLEN)
return StrCopy(S1);
if(S1[0] + S2[0] <= MAXSTRLEN)
{
PtrString S = StrCopy(S1);
S[0] += S2[0];
for(int i = S1[0] + 1 ; i <= S[0] ; i ++)
S[i] = S2[i-S1[0]];
return S;
}
else
{
PtrString S = StrCopy(S1);
S[0] = MAXSTRLEN;
for(int i = S1[0] + 1 ; i <= MAXSTRLEN ; i ++)
S[i] = S2[i-S1[0]];
return S;
}
}

PtrString SubString(PtrString S, int pos, int len)
{
PtrString T = (PtrString)malloc(MAXSTRLEN * sizeof(unsigned char));
T[0] = len;
for(int i = pos; i < pos + len ; i ++)
T[i-pos+1] = S[i];
return T;
}

int Index(PtrString S, PtrString T)
{
int pos = -1;
for(int i = 1 ; i <= S[0] ; i ++)
{
PtrString TS = SubString(S, i, T[0]);
if(!StrCompare(TS, T))
{
pos = i;
break;
}
}
return pos;
}

void Replace(PtrString S, PtrString T, PtrString V)
{
int pos = Index(S, T);
for(int i = pos ; i < T[0] ; i ++)
S[i] = V[i];
}

void StrInsert(PtrString S, PtrString T, int pos)
{
for(int i = 0 ; i < T[0] ; i ++)
{
for(int j = S[0] + 1 ; j >= pos + i ; j ++)
S[j] = S[j-1];
S[0] ++;
}
for(int i = 0 ; i < T[0] ; i ++)
S[i+pos] = T[i+1];
}

void StrDelete(PtrString S, int pos, int len)
{
memcpy(S + pos , S + pos + len , S[0] - pos - len + 1);
S[0] -= len;
}

void DestroyString(PtrString S)
{
free(S);
}

void PrintString(PtrString S)
{
for(int i = 1 ; i <= S[0] ; i ++)
printf("%c", S[i]);
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: