串的順序存儲

Common.h

#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int ElemType;

#endif // COMMON_H_INCLUDED


String_Seq.h

#ifndef STRING_SEQ_H_INCLUDED
#define STRING_SEQ_H_INCLUDED

#include "Common.h"

#define MAXSTRLEN 255
typedef char SString[MAXSTRLEN+1];//0號單元存放串的長度

Status StrAssign_Seq(SString s, char * chars);
Status StrCopy_Seq(SString s, SString t);
Status StrEmpty_Seq(SString s);
int StrCompare_Seq(SString s, SString t);
int StrLength_Seq(SString s);
Status ClearString_Seq(SString s);
Status Concat_Seq(SString t, SString s1, SString s2);
Status SubString_Seq(SString sub, SString s, int pos, int len);
int Index_Seq(SString s, SString t, int pos);
Status Replace_Seq(SString s, SString t, SString v);
Status StrInsert_Seq(SString s, int pos, SString t);
Status StrDelete_Seq(SString s, int pos, int len);
Status DestroyString_Seq(SString s);
void StringPrint_Seq(SString s);

#endif // STRING_SEQ_H_INCLUDED


String_Seq.c

#include "String_Seq.h"

Status StrAssign_Seq(SString s, char * chars)
{

    if(strlen(chars) > MAXSTRLEN)
        return ERROR;
    s[0] = strlen(chars);
    int i;
    for(i=0; i<s[0]; i++)
    {
        s[i+1] = chars[i];
    }
    return OK;
}

Status StrCopy_Seq(SString s, SString t)
{
    s[0] = t[0];
    int i;
    for(i=1; i<=s[0]; i++)
    {
        s[i] = t[i];
    }
    return OK;
}

Status StrEmpty_Seq(SString s)
{
    if(s[0] == 0)
        return TRUE;
    else
        return FALSE;
}

int StrCompare_Seq(SString s, SString t)
{
    int i;
    for(i=1;i<=s[0]&&i<=t[0];++i)
        if(s[i]!=t[i])
            return s[i]-t[i];
    return s[0]-t[0];
}

int StrLength_Seq(SString s)
{
    return s[0];
}

Status ClearString_Seq(SString s)
{
    s[0] = 0;
    return OK;
}

Status Concat_Seq(SString t, SString s1, SString s2)
{
    if(s1[0] + s2[0] <= MAXSTRLEN)
    {
        t[0] = s1[0] + s2[0];
        int i;
        for(i=1; i<=s1[0]; i++)
        {
            t[i] = s1[i];
        }
        for(i=1; i<=s2[0]; i++)
        {
            t[i+s1[0]] = s2[i];
        }
    }
    else
    {
        t[0] = MAXSTRLEN;
        int i;
        for(i=1; i<=s1[0]; i++)
        {
            t[i] = s1[i];
        }
        for(i=1; i<=MAXSTRLEN-s1[0]; i++)
        {
            t[i+s1[i]] = s2[i];
        }
    }
    return OK;
}

Status SubString_Seq(SString sub, SString s, int pos, int len)
{
    if(pos < 1 || pos > StrLength_Seq(s))
        return ERROR;
    if(len < 0 || len > StrLength_Seq(s)-pos+1)
        return ERROR;
    sub[0] = len;
    int i;
    for(i=1; i<=len; i++)
    {
        sub[i] = s[pos+i-1];
    }
    return OK;
}

int Index_Seq(SString s, SString t, int pos)
{
    if(pos < 1 || pos>StrLength_Seq(s))
        return ERROR;
    int i = pos;
    int tlen = StrLength_Seq(t);
    int slen = StrLength_Seq(s);
    SString sub;
    while(i < slen-tlen+1)
    {
        SubString_Seq(sub, s, i, tlen);
        if(StrCompare_Seq(sub, t)!= 0)
            i++;
        else
            return i;
    }
    return 0;
}
Status Replace_Seq(SString s, SString t, SString v)
{
    int i=1;
    if(StrEmpty_Seq(t))
        return ERROR;
    do
    {
        i=Index_Seq(s,t,i);
        if(i)
        {
            StrDelete_Seq(s,i,StrLength_Seq(t));
            StrInsert_Seq(s,i,v);
            i+=StrLength_Seq(v);
        }
    }while(i);
    return OK;
}

Status StrInsert_Seq(SString s, int pos, SString t)
{
    if(pos < 1 || pos > StrLength_Seq(s)+1)
        return ERROR;
    if(t[0] + s[0] > MAXSTRLEN)
        return ERROR;
    int i;
    for(i=s[0]; i>=pos; i--)
        s[i+t[0]] = s[i];
    for(i=pos; i<pos+t[0]; i++)
        s[i] = t[i-pos+1];

    s[0] += t[0];
    return OK;
}

Status StrDelete_Seq(SString s, int pos, int len)
{
    if(pos < 1 || pos>StrLength_Seq(s)-len+1)
        return ERROR;
    int i;
    for(i=pos; i<=s[0]; i++)
    {
        s[i] = s[i+len];
    }
    s[0] -= len;
    return OK;
}

Status DestroyString_Seq(SString s)
{
    //定長類型,不銷燬
    s[0] = 0;
    return OK;
}

void StringPrint_Seq(SString s)
{
    int i;
    for(i=1; i<=s[0]; i++)
        printf("%c", s[i]);
    printf("\n");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章