1. 程式人生 > >【資料結構】演算法4.2&4.3 串連線Concat&求子串SubString

【資料結構】演算法4.2&4.3 串連線Concat&求子串SubString

/*  串的定長順序儲存表示  */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 40
#define MAXSTRLEN 6 //最大字串
typedef int Status;
typedef char SString[MAXSIZE+1];
//此處宣告的SString[maxsize+1]雖是陣列,在SubString中作為指標使用,

//因位是指標,SString[0]存放實際陣列的地址,使用時不用加*或&,直接傳入陣列的值
/*******************************宣告部分****************************************/ Status StrAssign(SString *T,char *chars); //生成一個其值等於chars的串T 第一個元素為字串長度 Status SubString(SString Sub, SString T,int pos,int len); //用Sub返回串T的第pos個字元起長度為len的子串 Status Concat(SString T,SString S1,SString S2); //用T返回由S1和S2連線而成的新串 /*Status SubString(SString Sub, SString T,int pos,int len)*/
int StrCompare(SString S,SString T); int StrLength(SString S); int StrEmpty(SString S); Status StrCopy(SString S,SString *T); Status ClearString(SString S); /*******************************函式部分****************************************/ Status StrAssign(SString *T,char *chars) { int i,ct; for
(i = 0;i <= MAXSIZE; i++) (*T)[i] = '\0'; //全部清零 (*T)[0] = strlen(chars); for(ct = 1;*chars != '\0';ct++,chars++){ (*T)[ct] = *chars; } return OK; } Status SubString(SString Sub, SString T,int pos,int len) { if(pos<1 || pos>T[0] || len<0 || len>T[0]-pos+1) return ERROR; int ct,cnt; for(ct = 1,cnt = pos;cnt <= len+pos;ct++,cnt++){ Sub[ct]=T[cnt]; } Sub[0] = len+1; return OK; } /* Status SubString(SString Sub, SString T,int pos,int len) { if(pos<1 || pos>T[0] || len<0 || len>T[0]-pos+1) return ERROR; int i ; for(i = 1;i<=len;i++) Sub[i] = T[pos+i-1]; Sub[0] = len; return OK; } */ Status Concat(SString T,SString S1,SString S2) { int count,i; int uncut; //情況一:若不用截斷,直接複製S1和S2到T中 if(S1[0]+S2[0] <= MAXSTRLEN){ T[0] = S1[0] + S2[0]; for(count = 1;count <= S1[0];count++){ //複製S1的值到T中 T[count] = S1[count]; } for(count = S1[0]+1,i = 1;count <= T[0];count++,i++){ //複製S2的值到T中 T[count] = S2[i]; } uncut = TRUE; }//if //情況二:因為長度超出限制,需截斷S2後面的子串 else if( S1[0] < MAXSTRLEN){ T[0] = MAXSTRLEN; for(count = 1;count <= S1[0];count++){ //複製S1的值到T中 T[count] = S1[count]; } for(count = S1[0]+1,i = 1;count <= T[0];count++,i++){ //複製截斷的S2的值到T中 T[count] = S2[i]; } uncut = FALSE; }//else if //情況三:因為S1的長度已經達到最大長度,T只取S1 else{ T[0] = MAXSTRLEN; for(count = 1;count <= S1[0];count++){ //複製S1的值到T中 T[count] = S1[count]; } }//else } int StrCompare(SString S,SString T) { int i = 1; while(i<=S[0] && i<= T[0]){ if(S[i] == T[i]) i++; else return S[i]- T[i]; } return S[0] - T[0]; } int StrLength(SString S) { return S[0]; } int StrEmpty(SString S) { return S[0] == 0; } Status StrCopy(SString S,SString *T) { int i; for(i = 0;i<=S[0];i++) (*T)[i] = S[i]; return OK; } Status ClearString(SString S) { S[0] = 0; } /*******************************主函式部分**************************************/ int main() { SString T,S1,S2; //驗證情況一 /*char *chars1 = "abcd"; char *chars2 = "e";*/ //驗證情況二 /* char *chars1 = "abcd"; char *chars2 = "efghijk";*/ //驗證情況三 char *chars1 = "abcdef"; char *chars2 = "efghijk"; StrAssign(&S1,chars1); StrAssign(&S2,chars2); Concat(T,S1,S2); //列印T中的值 int i; for(i = 1;i<=T[0];i++) printf("%c",T[i]); return 0; }