数据结构学习笔记【第4章 串】
4.1 串类型的定义
- 串:字符串
- 串的长度:串中字符数目
- 位置:字符在序列中的序号
- 子串:串中任意个连续的字符组成的子序列
- 空串:零个字符的串
- 空格串:由一个或多个空格组成的串
4.2 串的表示和实现
4.1 定长顺序存储表示
- 用一组地址连续的存储单元存储串值的字符序列(字符数组)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN + 1];
Status Concat(SString& T, SString S1, SString S2);
Status SubString(SString& Sub, SString S, int pos, int len);
void print_SString(SString S);
int main()
{
SString S1;
S1[0] = 2;
S1[1] = 'H';
S1[2] = 'i';
S1[3] = '\0';
SString S2;
S2[0] = 3;
S2[1] = ' ';
S2[2] = 'g';
S2[3] = 's';
S2[4] = '\0';
SString T;
Concat(T, S1, S2);
print_SString(T);
SString Sub;
SubString(Sub, T, 4, 2);
print_SString(Sub);
system("pause");
return 0;
}
Status Concat(SString& T, SString S1, SString S2)
{
if (S1[0] + S2[0] <= MAXSTRLEN) {
int i;
for (i = 1; i <= S1[0]; i++) {
T[i] = S1[i];
}
for (i = S1[0] + 1; i <= S1[0] + S2[0]; i++) {
T[i] = S2[i - S1[0]];
}
T[0] = S1[0] + S2[0];
T[T[0]+1] = '\0';
return TRUE;
}
else if (S1[0] < MAXSTRLEN) {
int i;
for (i = 1; i <= S1[0]; i++) {
T[i] = S1[i];
}
for (i = S1[0] + 1; i <= MAXSTRLEN; i++) {
T[i] = S2[i - S1[0]];
}
T[0] = MAXSTRLEN;
return FALSE;
}
else {
int i;
for (i = 1; i <= MAXSTRLEN; i++) {
T[i] = S1[i];
}
T[0] = MAXSTRLEN;
return FALSE;
}
}
Status SubString(SString& Sub, SString S, int pos, int len)
{
if (pos<1 || pos>S[0] || len<0 || len>S[0] - pos + 1)return ERROR;
int i;
for (i = 1; i <= len; i++) {
Sub[i] = S[i + pos - 1];
}
Sub[0] = len;
return OK;
}
void print_SString(SString S)
{
int i;
printf("SString(length:%d):", S[0]);
for (i = 1; i <= S[0]; i++)
{
printf("%c", S[i]);
}
printf("\n");
}
4.2 堆分配存储表示
- 以一组地址连续的存储单元存放串值序列,但它们的存储空间是在程序执行过程中动态分配而得
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define MAXSIZE 100
typedef struct {
char* ch;
int length;
}HString;
Status StrAssign(HString& T, char* chars);
int StrLength(HString S);
int StrCompare(HString S, HString T);
Status ClearString(HString& S);
Status Concat(HString& T, HString S1, HString S2);
Status SubString(HString& Sub, HString S,int pos, int len);
Status StrInsert(HString& S, int pos, HString T);
void print_HString(HString T);
int main()
{
char* ch;
ch = (char*)malloc(MAXSIZE * sizeof(char));
if (!ch) exit(OVERFLOW);
ch[0] = 'H';
ch[1] = 'i';
ch[2] = '\0';
HString T;
T.ch = (char*)malloc(MAXSIZE * sizeof(char));
StrAssign(T, ch);
print_HString(T);
char* ch1;
ch1 = (char*)malloc(MAXSIZE * sizeof(char));
if (!ch1) exit(OVERFLOW);
ch1[0] = ' ';
ch1[1] = 'g';
ch1[2] = 's';
ch1[3] = '\0';
HString S;
S.ch = (char*)malloc(MAXSIZE * sizeof(char));
StrAssign(S, ch1);
print_HString(S);
HString R;
R.ch = (char*)malloc(MAXSIZE * sizeof(char));
Concat(R, T, S);
print_HString(R);
HString Sub;
Sub.ch = (char*)malloc(MAXSIZE * sizeof(char));
SubString(Sub, R, 4, 2);
print_HString(Sub);
StrInsert(T, 2, S);
print_HString(T);
system("pause");
return 0;
}
Status StrAssign(HString& T, char* chars)
{
if (T.ch) {
free(T.ch); T.ch = NULL;
}
int i;
char* c;
for (i = 0, c = chars; *c; i++, c++);
if (!i) {
T.ch = NULL;
T.length = 0;
}
else {
if (!(T.ch = (char*)malloc(i * sizeof(char)))) exit(OVERFLOW);
int j;
for (j = 0; j < i; j++) {
T.ch[j] = chars[j];
}
T.ch[j] = '\0';
T.length = i;
}
return OK;
}
int StrLength(HString S)
{
return 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;
}
}
Status ClearString(HString& S)
{
if (S.ch) {
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return OK;
}
Status Concat(HString& T, HString S1, HString S2)
{
if (T.ch) free(T.ch);
if (!(T.ch = (char*)malloc((S1.length + S2.length) * sizeof(char)))) exit(OVERFLOW);
int i;
for (i = 0; i < S1.length;i++) T.ch[i] = S1.ch[i];
T.length = S1.length + S2.length;
for (i = S1.length; i <T.length; i++) T.ch[i] = S2.ch[i-S1.length];
T.ch[i] = '\0';
return OK;
}
Status SubString(HString& Sub, HString S, int pos, int len)
{
if (pos<1 || pos>S.length || len<0 || len>S.length - pos + 1)return ERROR;
if (Sub.ch) free(Sub.ch);
if (!len) { Sub.ch = NULL; Sub.length = 0; }
else {
Sub.ch = (char*)malloc(len * sizeof(char));
int i;
for (i = 0; i < len; i++)
{
Sub.ch[i] = S.ch[i + pos - 1];
}
Sub.length = len;
Sub.ch[Sub.length] = '\0';
}
return OK;
}
Status StrInsert(HString& S, int pos, HString T)
{
if (pos<1 || pos>S.length + 1)return ERROR;
if (T.length) {
if (!(S.ch = (char*)realloc(S.ch, (S.length + T.length) * sizeof(char))))exit(OVERFLOW);
int i;
for (i = S.length - 1; i >= pos - 1; i--)S.ch[i + T.length] = S.ch[i];
for (i = pos - 1; i < pos - 1 + T.length; i++)S.ch[i] = T.ch[i - pos + 1];
S.length += T.length;
S.ch[S.length] = '\0';
}
return OK;
}
void print_HString(HString T)
{
printf("HString(length:%d):", T.length);
for (int i = 0; i < T.length; i++)printf("%c", T.ch[i]);
printf("\n");
}
4.3 串的模式匹配算法
4.4 串操作应用举例
4.4.1 文本编辑
- 将文本看成一个字符串,页则是文本串的字串,行又是页的字串
- 未完待续…
4.4.2 建立词索引表