版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u013009576/article/details/77133257

一.順序串

1.1定義

串的順序實現是指分配一塊連續的存儲單元用於串中的元素,並附設表示串長度的標誌。 
串的順序結構存儲可以描述爲:

typedef char ElemType;
typedef struct{
    ElemType data[MaxSize];
    int length;
}String;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

1.2基本操作

1.2.1創建串

輸入字符元素,以“#”號作爲結束標誌。

void StrCreat(String* S){
    char x;
    S->length=0;
    printf("Input String_S(End of '#'!):\n");
    scanf("%c",&x);
    while(x!='#'){
        S->data[S->length++]=x;
        scanf("%c",&x);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.2.2求串長度

因爲串的定義中有length變量,只需返回結果便可。

int StrLength(String* S){
    return S->length;
}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

1.2.3拷貝字符串

將字符串S拷貝到字符串T中,對字符串依次訪問,同時賦值於字符串T即可完成拷貝。

void StrCopy(String* S, String* T){
    for(int i=0;i<S->length;i++){
        T->data[i]=S->data[i];
    }
    T->length=S->length;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1.2.4比較字符串大小

字符串大小比較實際是比較ASCII碼大小,從左向右依次比較,如果此時哪個字符串的ASCII碼值比較大,則返回結果;如果兩個字符串長度不相等,但前面若干個字符均相等,則長度大的字符串比較大。

int StrCompare(String* S,String* T){
    int i=0;
    while(i!=S->length&&i!=T->length){
        if(S->data[i]<T->data[i]){
            return -1;
        }else if(S->data[i]>T->data[i]){
            return 1;
        }else{
            i++;
        }
    }
    if(i<S->length){
        return 1;
    }else if(i<T->length){
        return -1;
    }else{
        return 0;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

1.2.5連接字符串

將字符串T連接在字符串S後,注意此時S的長度以便,注意修改length變量。

void StrConcat(String* S, String* T){
    int i=S->length;
    for(i=i+1;i<S->length+T->length;i++){
        S->data[i]=T->data[i-S->length];
    }
    S->length=i;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.2.6以串S中pos位置開始的len個字符生成子串Sub

因爲採用的是順序存儲結構,可以使用函數隨機訪問,直接找到pos位置,然後將其後len個字符串均賦值給新的子串T便可。

String* SubString(String*S,int pos,int len){
    String *T;
    T=(String*)malloc(sizeof(String));
    T->length=0;
    if(pos>S->length||(pos+len)>S->length){
        printf("Illege Position!\n");
        exit(0);
    }
    for(int i=pos;i<pos+len;i++){
        T->data[T->length++]=S->data[i];
    }
    return T;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二.鏈串

2.1定義

採用鏈式存儲的串稱爲鏈串。一般採用不帶頭結點的單鏈表實現。 
鏈串的數據結構描述如下:

typedef struct SNode
{    ElemType data;
     struct SNode *next;
}String;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章