leiyahui

纸上得来终觉浅,绝知此事要躬行
串的顺序存储结构

一 串的存储格式

  串的静态存储结构即串的顺序存储结构,在大多数的计算机系统中,一个字占用多个字节,而一个字符只占用一个字节,所以为了节省空间,就采用紧缩格式存储。即一个字节一个字符,一个存储单元放多个字符。
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
        }
    }

 

posted on 2015-11-18 10:05  雷大叔  阅读(3004)  评论(0编辑  收藏  举报