1. 程式人生 > >資料結構之串的基本操作的實現(c語言)

資料結構之串的基本操作的實現(c語言)

我們先一起來看串的一些概念…
字串(簡稱串),可以將其看作是種特殊的線性表,其特殊性在於線性表的資料元素的型別總是字元性,字串的資料物件約束為字符集。

串是由0個或多個字元組成的有限序列。一般記作:s = “s1 s2 s3 …. sn”,,其中,s是串名,用雙引號括起來的字元序列稱為串的值,si(1<=i <= n)稱為串的元素,可以是字母,數字或其他字元,是構成串的基本單位,字元的個數n稱為串的長度.

1.串的定義:串是由零個或多個組成的有序佇列。
2.串的長度:串中字元的數目稱為串的長度。
3.空串:由零個字元組成的串叫做空串,空串不包括任何字元,其長度為零。
4.子串:

串中任意個連續的字元組成的子序列稱為該串的子串,空串是任何串的子串。
5.主串:包含子串的串相應的稱為主串。
串的表示:
串有兩種表示形式:順序儲存表示和鏈式儲存表示。
順序儲存表示:串的順序儲存結構簡稱為順序串,順序串中的字元序列被順序地存放在一組連續的儲存單元中,主要有三種實現順序串的方式。
接下來實現的程式碼是順序儲存,帶串長的實現:
str.h

#pragma once
#define SIZE 20
typedef struct Str
{
    char elem[SIZE];//elem陣列用來存放串的元素
    int length;//定義一個串長度
}Str;

void StrAssign(Str *s
, const char *chars);//初始化串 void StrCpy(Str*s, Str*t);//拷貝串 int Getlength(Str *s);//獲取串的長度 void Clear(Str *s);//清空串s bool Inset(Str *s,int pos,Str *t);//在串spos位置插入串t void Show(Str *s) ;//列印串 int BF(Str *s,Str *sub,int pos);//在串s裡找第一個串sub,並返回串sub的第一個元素的下標 bool DeletePos(Str* s,int pos,int len);//在串中的pos位置開始刪除len長度個元素 bool Delete(Str *s
,int pos,Str *t);//在串中的pos位置開始刪除串t bool Replace(Str *s,Str *t,Str *v,int pos);//用v替換從pos位置開始的第一個t bool RepIaceAll(Str *s,Str *t,Str *v);//在串s中查詢到串t並用串v替換

這裡的串和字串的區別就是字串會以“\n”終止符來判定字串的長度,串中我們給length值就用來直接記錄串的長度。

str.c

#include"str.h"
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>

void StrAssign(Str *s, const char *chars)//初始化串
{
    assert(s != NULL);
    int len = strlen(chars);

    /*if(s->length<len)
    {
        return;
    }*/
    s->length = len;
    for(int i = 0;i<len;i++)
    {
        s->elem[i] = chars[i];
    }
}

void StrCpy(Str*s, Str*t)//拷貝串
{
    for(int i = 0;i<t->length;i++)
    {
        s->elem[i] = t->elem[i];
    }
    s->length = t->length;
}

int Getlength(Str *s)//獲取串的長度
{
    return s->length ;
}

void Clear(Str *s)//清空串s
{
    s->length = 0;
}

bool SubStr(Str *sub,Str *s,int pos,int len)//空白字元不拷貝
{
    if(pos < 0 || len < 1||pos >=s->length||pos+len>s->length-1)
    {
        return false;
    }
    for(int i = pos;i<pos+len;i++)
    {
        sub->elem[i-pos] = s->elem[i];
    }
    sub->length = len;
    return true;
}

bool Inset(Str *s,int pos,Str *t)//在串spos位置插入串t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||pos+t->length>SIZE)
    {
        return false;
    }
    for(int i = s->length-1;i>=pos;i--)
    {
        s->elem[i+t->length] = s->elem[i];  
    }
    for(int j = 0;j<t->length;j++)
        {
            s->elem[j+pos] = t->elem[j];
        }
    s->length +=t->length;
    return true;
}
int BF(Str *s,Str *sub,int pos)//在串s裡找第一個串sub,並返回串sub的第一個元素的下標
{
    if(pos<0||pos>s->length)
    {
        return -1;
    }

    int i = pos;
    int j = 0;

    int lens = s->length;
    int lensub = sub->length;

    while (i < lens && j < lensub)
    {
        if (s->elem[i] == sub->elem[j])
        {
            i++;
            j++;
        }
        else
        {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= lensub)
        {
            return i - j;
        }
        else 
            return -1;
}

bool DeletePos(Str* s,int pos,int len)//從pos位置開始刪除len個長度
{
    assert(s!=NULL);
    if(pos<0||pos+len>s->length||len<0)
    {
        return false;
    }
    //for(int i = pos;i<len+pos;i++)
    for(int i = pos;i<s->length-len;i++)
    {
        s->elem[i] = s->elem[i+len];
    }
    s->length -= len;
    return true;
}

bool Delete(Str *s,int pos,Str *t)//在串中的pos位置開始刪除串t
{
    assert(s!=NULL);
    assert(t!=NULL);
    if(pos<0||pos>s->length||t->length>s->length)
    {
        return false;
    }
    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    return DeletePos(s,index,t->length);
}
bool Replace(Str *s,Str *t,Str *v,int pos)//用v替換從pos位置開始的第一個t
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    int index = BF(s,t,pos);
    if(index < 0)
    {
        return false;
    }
    DeletePos(s,index,t->length);
    return Inset(s,index,v);
}
bool RepIaceAll(Str *s,Str *t,Str *v)//在串s中查詢到串t並用串v替換
{
    assert(s!=NULL);
    assert(t!=NULL);
    assert(v!=NULL);

    while(Replace(s,t,v,0));
    return true;
}
void Show(Str *s) //列印  
{
    for(int i=0;i<Getlength(s);i++)
    {
        printf("%c",s->elem[i]); 
    }
    printf("\n");
}  


int main()
{
    Str s;
    char *s1 = "abcdecdfcd";
    StrAssign(&s, s1);
    Show(&s);

    Str t;
    char *t1 = "cd";
    StrAssign(&t, t1);
    Show(&t);
    /*
    Inset(&s, 2, &t);
    Show(&s);

    Inset(&s, 7, &t);
    Show(&s);*/

    /*int index = BF(&s,&t,0);
    printf("index = %d\n",index);*/

    /*DeletePos(&s,3,2);
    Show(&s);*/

    /*Str v;
    char *v1 = "zkr";
    StrAssign(&v, v1);
    Show(&v);
    Replace(&s,&t,&v,0);
    Show(&s);*/

    Str v;
    char *v1 = "zkr";
    StrAssign(&v, v1);
    Show(&v);
    RepIaceAll(&s,&t,&v);
    Show(&s);
    system("pause");
    return 0;
}