串的順序存儲結構


一 串的存儲格式

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM