1. 程式人生 > >串(string)的基本用法

串(string)的基本用法

2018/3/22

資料結構

1.串(string)

1.概念:由n個字元所組成的有限數列

2.串是一種特殊的線性表,但是也有著不同之處,串的操作物件只能是字元,而且線性表一次只能操作一個數,但是串一次可以操作多個字元

2.動態陣列的應用

注:這裡是採用動態陣列的方法來分配空間,即:在空間不夠的時候,繼續動態分配空間(realloc(size,number))

#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
char *str;//字串內容
int length;//字串長度
int maxlength;//最長長度
}DString;
//1.新建字串
void initString(DString *S,int max, char *string)//引數表列:主字串,字串長度,字串內容
{
int i;
S->str = (char*)malloc(sizeof(char)*max);//申請動態空間
S->maxlength = max;//申請最大值(可變)
S->length =strlen(string);//使用標準函式來計算鍵入字串的長度
for (i = 0; i < S->length; i++)//迴圈輸入
{
S->str[i] = string[i];
}
}
//2.插入子串(含動態分配空間)
int insert_string(DString *S, int pos, DString T)//在pos的地方插入子串T
{
int i;
char *p;
//判斷特殊情況
if (pos<0 || pos>S->length)
{
printf("插入位置錯誤\n");
return 0;
}
//!!!動態分配
else
{
if (S->length + T.length > S->maxlength)//如果陣列的長度超出了預設長度
{
p =(char *)realloc(S->str, (S->length + T.length)*sizeof(char));
//realloc(p,size),表示重新給p分配一個size大小的空間
if (p == NULL)
{
printf("空間不足\n");
return 0;
}
}
//迴圈給值
for (i = S->length - 1; i >= pos; i--)
{
S->str[i + T.length] = S->str[i];//資料移位
}
for (i = 0; i < T.length; i++)
{
S->str[pos + i] = T.str[i];//賦子串值入源串
}
S->length = S->length + T.length;
return 1;
}
}
//3.刪除指定位置子串
int delete_string(DString *S, int pos,int len)//引數表列:所刪除的串,刪除的位置,刪除的位數
{
int i;
//判斷特殊情況
if (S->length <= 0)
{
printf("無數可刪除\n");
return 0;
}
else if (pos < 0 || len<0 || pos + len>S->length)//pos+length為總長度
{
printf("引數選擇錯誤\n");
return 0;
}
else
{
for (i = pos + len; i <= S->length - 1; i++)
{
S->str[i - len] = S->str[i];
S->length = S->length - len;
return 1;
}
}
}
//4.取子串
int catch_string(DString *S, int pos, int len, DString *T)//引數表列:主字串,所取字串的頭,所取字串的尾,返回子串
{
int i;
if (pos < 0 || len<0 || pos + len>S->length)//pos+length為總長度
{
printf("引數選擇錯誤\n");
return 0;
}
else
{
for (i = 0; i < len; i++)
{
T->str[i] = S->str[pos + i];//取得子串
T->length = len;
return 1;
}
printf("\n取得子串為\n");
for (i = 0; i < T->length; i++)
{
printf("%2c", T->str[i]);
}
}
}
//5.撤銷字串
void destroy(DString *S)//釋放指標,將長度置為0
{
free(S->str);//釋放指標
S->maxlength = 0;
S->length = 0;
printf("\n撤銷完成\n");
}
//6.BF演算法
int BFindex(DString S,int start,DString T)//引數表列:查詢從start開始的子串在S中的位置
{
    int i,j,v;
    i=start;
    j=0;
    while(i<S.length&&j<T.length)
    {
        if(S.str[i]==T.str[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;//如果S和j不匹配,所以i的位置跳到下一位
            j=0;
        }


    }
    if(j==T.length)//已經走完
    {
        v=i-T.length;//現在v已經到了子串的尾部
        printf("\n字串已經找到了,在第%2d個位置\n",v);
    }
    else
    {
        v=-1;
        printf("\n沒有找到該字串\n");
        return v;
    }



}

//原始檔
void main()
{
DString string1, string2, string3;
int i;
int max1 = 10, max2 = 20, max3 = 10;
//init
initString(&string1, max1, "Data Structure");
initString(&string2, max2, "Structure");
initString(&string3, max3, "");
//insert_string
BFindex( string1,0,string2);
insert_string(&string2, 0, string1);
for (i = 0; i < string2.length; i++)
printf("%c", string2.str[i]);
printf("\n");
//delete_string
delete_string(&string2, 0, 5);
for (i = 0; i < string2.length; i++)
printf("%c", string2.str[i]);
printf("\n");
//catch_string
catch_string(&string2, 0, 3,&string3);

//destroy
destroy(&string1);
destroy(&string2);
destroy(&string3);
}