串的顺序存储结构
一 串的存储格式
串的静态存储结构即串的顺序存储结构,在大多数的计算机系统中,一个字占用多个字节,而一个字符只占用一个字节,所以为了节省空间,就采用紧缩格式存储。即一个字节一个字符,一个存储单元放多个字符。
C语言的数组就是这样处理的
按照这样的格式,
设S=“Data Struct”,其长度为14,每个存储结构能够存放4个字符,则共用了[14/4]=4个存储单元。这中格式的存储的优点是比较节省存储空间,缺点是提取和分离字符比较麻烦。
若一个存储单元存放一个字符,则共需要14个存储单元,这样的优点是比较容易分离和提取字符,但是比较浪费存储空间。
二 串名的存储映像
串名的存储映像是串名与串值的对照表。
有以下三种形式
设S为‘DATASTRUCT’
T为‘ABC’
第一种
串名 | 访问类型 | 传值/地址 |
T | 0 | 地址 |
S | 1 | 值 |
第二种
串名 | 起始地址 | 末地址 |
T | tf | tr |
S | sf | sr |
第三种
串名 | 起始地址 | 长度 |
T | tf | 13 |
S | sf | 3 |
三 串的静态存储结构描述
typedef struct
{
char data[maxsize];
int len;
}stype;
四 静态串的基本操作实现
1 void Smove(stype* s,stype* t,int i,int j,int n)
这个函数是将t中从i个字符开始长度为n的字符串送到s的第j个位置
在这个函数中,如果t=s,其中i>j时不会出现问题,但是当i<j时如果继续从左向右移动字符串的话,就有可能会出现覆盖的状况,因此应该是从右向左移动字符串
函数实现
void SMove(stype* s, stype* t, int i, int j, int n)
{
if (i < 0 || j<0 || n<0 || i + n - 1>t->len - 1 || j + n - 1>maxsize - 1)
Error(i, j, n);
else
{
int k;
if (i >= j)
{
for (k = 0; k < n; k++)
{
s->data[j + k] = s->data[i + k];
}
}
else
{
for (k = n - 1; k >= 0; k--)
{
s->data[j + k] = t->data[i + k];
}
}
}
}
2 连接操作的算法
int Contact(stype* s, stype s1, stype s2)
{
if ((s1.len + s2.len)<=maxsize)
{
s->len = s1.len + s2.len;
SMove(s, &s1, 0, 0, s1.len);
SMove(s, &s2, 0, s1.len, s2.len);
return 1;
}
else
{
return 0
}
}