資料結構之順序串的基本操作——C語言
阿新 • • 發佈:2018-12-17
#include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef struct { char data[MaxSize]; int len; }SqString; void StrAssign(SqString &str,char cstr[]) { int i; for (i=0;cstr[i]!='\0';i++) str.data[i]=cstr[i]; str.len=i; } void StrCopy(SqString &s,SqString t) /*引用型引數*/ { int i; for (i=0;i<t.len;i++) s.data[i]=t.data[i]; s.len=t.len; } int StrEqual(SqString s,SqString t) { int same=1,i; if (s.len!=t.len) same=0; /*長度不相等時返回0*/ else for (i=0;i<s.len;i++) if (s.data[i]!=t.data[i]) /*有一個對應字元不同時返回0*/ { same=0; break; } return same; } int StrLength(SqString s) { return s.len; } SqString Concat(SqString s,SqString t) { SqString str; int i; str.len=s.len+t.len; for (i=0;i<s.len;i++) /*s.data[0..s.len-1]=>str*/ str.data[i]=s.data[i]; for (i=0;i<t.len;i++) /*t.data[0..t.len-1]=>str*/ str.data[s.len+i]=t.data[i]; return str; } SqString SubStr(SqString s,int i,int j) { SqString str; int k; str.len=0; if(i<=0 || i>s.len || j<0 || i+j-1>s.len) { printf("引數不正確\n"); return str; /*引數不正確時返回空串*/ } for(k=i-1;k<i+j-1;k++) /*s.data[i..i+j]=>str*/ str.data[k-i+1]=s.data[k]; str.len=j; return str; } SqString InsStr(SqString s1,int i,SqString s2) { int j; SqString str; str.len=0; if (i<=0 || i>s1.len+1) /*引數不正確時返回空串*/ { printf("引數不正確\n"); return s1; } for (j=0;j<i-1;j++) /*s1.data[0..i-2]=>str*/ str.data[j]=s1.data[j]; for (j=0;j<s2.len;j++) /*s2.data[0..s2.len-1]=>str*/ str.data[i+j-1]=s2.data[j]; for (j=i-1;j<s1.len;j++) /*s1.data[i-1..s1.len-1]=>str*/ str.data[s2.len+j]=s1.data[j]; str.len=s1.len+s2.len; return str; } SqString DelStr(SqString s,int i,int j) { int k; SqString str; str.len=0; if (i<=0 || i>s.len || i+j>s.len+1) /*引數不正確時返回空串*/ { printf("引數不正確\n"); return str; } for (k=0;k<i-1;k++) /*s.data[0..i-2]=>str*/ str.data[k]=s.data[k]; for (k=i+j-1;k<s.len;k++) /*s.data[i+j-1..s.len-1]=>str*/ str.data[k-j]=s.data[k]; str.len=s.len-j; return str; } SqString RepStr(SqString s,int i,int j,SqString t) { int k; SqString str; str.len=0; if (i<=0 || i>s.len || i+j-1>s.len) /*引數不正確時返回空串*/ { printf("引數不正確\n"); return str; } for (k=0;k<i-1;k++) /*s.data[0.i-2]=>str*/ str.data[k]=s.data[k]; for (k=0;k<t.len;k++) /*t.data[0..t.len-1]=>str*/ str.data[i+k-1]=t.data[k]; for (k=i+j-1;k<s.len;k++) /*s.data[i+j-1..s.len-1]=>str*/ str.data[t.len+k-j]=s.data[k]; str.len=s.len-j+t.len; return str; } void DispStr(SqString s) { int i; if (s.len>0) { for (i=0;i<s.len;i++) printf("%c",s.data[i]); printf("\n"); } } int main() { SqString s,s1,s2,s3,s4; printf("建立串S和S1\n"); StrAssign(s,"abcdefghijklmn"); StrAssign(s1,"xyz"); printf("輸出串S\n"); DispStr(s); printf("輸出串S的長度\n"); printf("%d\n",StrLength(s)); printf("在串S的第9個字元位置插入串S1而生成串S2"); s2 = InsStr(s,9,s1); printf("輸出串S2\n"); DispStr(s2); printf("刪除串S的第2個字元開始的5個字元而生成串S2\n"); s2 = DelStr(s,2,5); printf("輸出串S2\n"); DispStr(s2); printf("將串S的第2個字元開始的5個字元替換成串S1而生成串S2\n"); s2 = RepStr(s,2,5,s1); printf("輸出串S2\n"); DispStr(s2); printf("提取串S的第2個字元開始的10個字元而生成串S3\n"); s3 = SubStr(s,2,10); printf("輸出串S3\n"); DispStr(s3); printf("將串S1和S2連線起來而生成串S4\n"); s4 = Concat(s1,s2); printf("輸出串S4\n"); DispStr(s4); return 0; }