leiyahui

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

一 串的动态存储结构分为两种。一种是链式存储结构,另一种是被称为堆结构的存储方式

1链式存储结构

如果说每个节点只存储一个字符串的话,就会耗费大量的空间,因为一个节点中还有一个指针。于是在每个节点中存放若干个字符,形成字符块,再把这些块连在一起,这样的链式结构也被称为块链结构,这样会比较节省存储空间,但是操作不

链式存储结构的描述,以一个节点一个字符为例

    typedef struct node
    {
        char data;
        struct node* next;
    }snode,*stlink;

链式存储结构的基本操作如下

(1) 前插操作

    slink Sinsert(stlink s, int i, slink t)  //将串t插到串s的i节点之前
    {
        if (i < 0)
        {
            return NULL;
        }
        if (t = NULL)
        {
            return s;
        }
        if (s = NULL)
        {
            return t;
        }
        stlink p, q;
        p = s;
        int j;
        for (j = 0; j < i; j++)
        {
            p = p->next;
        }
        q = p->next;
        p->next = t;
        while (p->next)
        {
            p = p->next;
        }
        p->next = q;
        return s;
    }

(2)删除操作

  stlink Sinsert(stlink s, int i,int len)  //从i节点起,删除len长度的字符串
    {
        if (i < 0)
        {
            return NULL;
        }
        stlink p;
        stlink q;
        stlink r;
        int j;
        p = s;
        for (j = 0; j < i; j++)   //找到节点的前一个节点
        {
            p = p->next;
        }
        q = p;
        for (j = 0; j < len; j++)   //找到要删除的节点指针
        {
            p = p->next;
        }
        if (i == 0)        //如果从头删除的话,S的指向就要改变
        {
            r = q;
            s->next = q->next;  
        }
        else
        {
            r = q->next;
            q->next = p->next;
        }
        while (r!=p)  //循环释放内存
        {
            q = r;
            r = r->next;
            free(r);
        }
        return s;

    }

3 判断串大小的操作

int Compare(stlink s, stlink t)
    {
        int d = 0;
        stlink p, q;
        p = s;
        q = t;
        while (p&&q)
        {
            p = p->next;
            q = q->next;
            d = p->data - q->data;
            if (d != 0)
            {
                break;
            }
        }
        if (p == NULL&q != NULL)  //q是Q的前缀
        {
            return -1;
        }
        else if (p != NULL&&q == NULL)  //q是p的前缀
        {
            return 1;
        }
        else
        {
            return d;
        }
    }

 

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