注意事项:
- 在串的顺序存取中,一旦操作的串序列长度超过上界时,会采用截尾法处理,克服这个弊端可以使用动态分配串值得存储空间。
- 堆分配——也是以一组地址连续的存储单元存放串值字符序列,但他们的存储空间是在程序运行过程中动态分配而得。
- 一般对串操作时,多使用堆分配存储方式。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct
{
char *ch;
int length;
}HS, *HString;
void InitString(HString S);
void StrAssign(HString T, char * chars);
void StrCopy(HString T, HString S);
int StrCompare(HString S, HString T);
void Concat(HString T, HString s1, HString s2);
int SubString(HString sub, HString S, int pos, int len);
int StrInsert(HString S, int pos, HString T);
int StrDelete(HString S, int pos, int len);
void StrPrint(HString S);
int main()
{
int i;
char c, *p = "God bye!", *q = "God luck!";
HString T = (HString)malloc(sizeof(HS));
HString S = (HString)malloc(sizeof(HS));
HString R = (HString)malloc(sizeof(HS));
InitString(T);
InitString(S);
InitString(R);
StrAssign(T, p);
printf("串t为:");
StrPrint(T);
StrAssign(S, q);
printf("串s为:");
StrPrint(S);
i = StrCompare(S, T);
if (i < 0)
c = '<';
else if (i > 0)
c = '>';
else
c = '=';
printf("串s %c 串t", c);
Concat(R, S, T);
printf("串t连接s产生的串r为:");
StrPrint(R);
return 0;
}
void InitString(HString S)
{
S->length = 0;
S->ch = NULL;
}
void StrAssign(HString T, char *chars)
{
int i, j;
if (T->ch)
free(T->ch);
i = strlen(chars);
if (!i)
InitString(T);
else
{
T->ch = (char*)malloc(i * sizeof(char));
for (j = 0; j < i; j++)
T->ch[j] = chars[j];
T->length = i;
}
}
void StrCopy(HString T, HString S)
{
int i;
if (T->ch)
free(T->ch);
T->ch = (char*)malloc(S->length * sizeof(char));
for (i = 0; i < S->length; i++)
T->ch[i] = S->ch[i];
T->length = S->length;
}
int StrCompare(HString S, HString T)
{
int i;
for (i = 0; i < S->length && i < T->length; i++)
if (S->ch[i] != T->ch[i])
return S->ch[i] - T->ch[i];
return S->length - T->length;
}
void Concat(HString T, HString S1, HString S2)
{
int i;
if (T->ch)
T->ch = NULL;
T->length = S1->length + S2->length;
T->ch = (char*)malloc(T->length * sizeof(char));
for (i = 0; i < S1->length; i++)
T->ch[i] = S1->ch[i];
for (i = 0; i < S2->length; i++)
T->ch[i + S1->length] = S2->ch[i];
}
int SubString(HString Sub, HString S, int pos, int len)
{
int i;
if (pos > S->length || pos < 1 || len <0 || len >= S->length - pos)
return 0;
if (Sub->ch)
Sub->ch = NULL;
if (!len)
InitString(Sub);
else
{
Sub->ch = (char*)malloc(len * sizeof(char));
for (i = 0; i < len; i++)
Sub->ch[i] = S->ch[i];
Sub->length = len;
}
}
int StrInsert(HString S, int pos, HString T)
{
int i;
if (pos < 1 || pos > S->length + 1)
return 0;
if (T->length)
{
S->ch = (char*)realloc(S->ch, (S->length + T->length) * sizeof(char));
for (i = S->length - 1; i >= pos - 1; --i)
S->ch[i + T->length] = S->ch[i];
for (i = 0; i < T->length; i++)
S->ch[pos + i - 1] = T->ch[i];
S->length += T->length;
}
}
int StrDelete(HString S, int pos, int len)
{
int i;
if (S->length <= pos + len)
return 0;
for (i = pos - 1; i <= S->length - len; i++)
S->ch[i] = S->ch[i + len];
S->length -= len;
S->ch = (char*)realloc(S->ch, S->length * sizeof(char));
return 1;
}
void StrPrint(HString S)
{
int i;
for (i = 0; i < S->length; i++)
printf("%c", S->ch[i]);
printf("\n");
}