串(string)的基本用法
阿新 • • 發佈:2019-02-10
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); }