一 串的存儲格式
串的靜態存儲結構即串的順序存儲結構,在大多數的計算機系統中,一個字占用多個字節,而一個字符只占用一個字節,所以為了節省空間,就采用緊縮格式存儲。即一個字節一個字符,一個存儲單元放多個字符。
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
}
}