字符串静态顺序结构C/C++实现(数据结构严蔚敏版)
生活随笔
收集整理的這篇文章主要介紹了
字符串静态顺序结构C/C++实现(数据结构严蔚敏版)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、頭文件String.h
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std;#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2typedef int Status;#define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN + 1]; //0號(hào)單元存放串的長(zhǎng)度//將字符數(shù)組賦值給字符串,并在第一位置記錄它的長(zhǎng)度 Status StrAssign(SString& T, char chars[]) { //生成一個(gè)其值等于chars的串T。int i; if(strlen(chars)>MAXSTRLEN)return ERROR;//這里的長(zhǎng)度最大只能是255,可以表示成一個(gè)字符 T[0] = strlen(chars);for(i = 0; i <= T[0]; i++){T[i+1] = chars[i];}return OK; }//字符串復(fù)制 Status StrCopy(SString& T, const SString& S) {//由串S復(fù)制得串Tint i;for(i = 1; i <= S[0]; i++){T[i] = S[i];}T[0] = S[0];return OK; }//判斷否為空字符串 Status StrEmpty(const SString& S) {//判空if(S[0] == 0)return TRUE;elsereturn FALSE; }//比較字符串 Status StrCompare(const SString& S, const SString& T){//若S>T,則返回值>0,若S=T,則返回值=0;若S<T,則返回值<0//s[0]和T[0]分別表示為字符串長(zhǎng)度int i;for(i = 1; i<=S[0] && i<=T[0]; i++){if(S[i] != T[i])return S[i] - T[i]; }return S[0]-T[0];}//獲取字符串的長(zhǎng)度 Status StrLength(const SString& S) {return S[0]; }//連接兩個(gè)字符串 Status Concat(SString& T, const SString& S1, const SString& S2){ //用串T返回由S1和S2連接而成的新串。int i,j;//是否被截?cái)?Status uncut;if( S1[0]+S2[0] <= MAXSTRLEN )//未截?cái)鄘T[0] = S1[0] + S2[0];for(i = 1; i <= S1[0]; i++){T[i] = S1[i];}for(j = 1; j <= S2[0]; j++){T[S1[0] + j] = S2[j]; }uncut=TRUE;}else if(S1[0] < MAXSTRLEN)//截?cái)鄘T[0] = MAXSTRLEN;//將S1中的字符復(fù)制到T中 for( i = 1; i < S1[0]; i++){T[i] = S1[i];}//將S2的字符復(fù)制到T中,直到T滿了為止 for(j = 1; j <= MAXSTRLEN-S1[0]; j++){T[S1[0]+j] = S2[j];}uncut=FALSE;}else// S1[0]>MAXSTRLEN{T[0] = MAXSTRLEN;for(i = 1; i<= MAXSTRLEN; i++){T[i] = S1[i];}uncut=FALSE;}return uncut; }//求子串 Status SubString(SString& Sub, const SString& S, int pos, int len) { //求子串//用Sub返回串S的第pos個(gè)字符起長(zhǎng)度為len的子串int i, j;if(pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)return ERROR;if(len == 0){Sub[0] = 0;}else{for(i = 1,j = pos; i <= len-1,j <= pos+len-1; i++,j++)Sub[i] = S[j];Sub[0]=len;}return OK; }//模式匹配 Status Index(SString& S, SString& T, int& pos) { //若主串S中存在和串T相同的子串,則返回它在主串S的第pos個(gè)//字符之后第一次出現(xiàn)的位置,否則函數(shù)值為0int n, m, i;SString Sub;if(pos>0){n = StrLength(S);m = StrLength(T);i = pos;while(i <= n-m+1){SubString(Sub, S, i, m);if (StrCompare(Sub, T) != 0)++i;elsereturn i;}}return 0; }Status StrInsert(SString& S, int pos, const SString& T) { //插入函數(shù)//在串S的第pos個(gè)字符之前插入串T。int i;if (pos<1 || pos>S[0])return ERROR;if (S[0]+T[0] < MAXSTRLEN)//完全插入{for (i = S[0]; i >= pos; i--){S[i + T[0]] = S[i];}for (i = 1; i <=T[0]; i++){S[pos-1+i] = T[i];}S[0] = S[0] + T[0];return TRUE;}else{for (i = S[0]; i >= MAXSTRLEN-S[0];i--){S[MAXSTRLEN-S[0]+1] = S[i];}for (i = 1; i <= MAXSTRLEN - S[0];i++){S[pos - 1 + i] = T[i];}return FALSE;} }Status StrDelete(SString& S, int pos, int len) { //刪除//從串S中刪除第pos個(gè)字符起長(zhǎng)度為len的子串int i;if (pos<1 || pos>S[0])return ERROR;elsefor (i = pos + len ; i<=S[0]; i++){S[i-len] = S[i];}S[0] -= len;return OK; }Status StrPrint(const SString& S) {//輸出函數(shù)int i;for (i = 1; i <= S[0]; i++){cout << S[i];}cout << endl;return 0; }2、測(cè)試文件test.cpp
#include "String.h"int main(void) { SString S, Sub, s, t;int pos;int len;int n;char a[100], b[100];cout<<" 0----退出"<<endl;cout<<" 1----初始化字符串"<<endl;cout<<" 2-----判斷字符串是否為空"<<endl;cout<<" 3-----比較字符串大小,并返回"<<endl;cout<<" 4------求字符串的長(zhǎng)度"<<endl;cout<<" 5-------截取字符串"<<endl;cout<<" 6--------查找子串的位置"<<endl;cout<<" 7--------插入子串"<<endl;cout<<" 8---------刪除子串"<<endl;cout<<" 9---------打印字符串\n"<<endl; cout<<"請(qǐng)輸入你的操作"<<endl;cin>>n;while(1){switch(n){case 0: cout<<"你已經(jīng)退出"<<endl;exit(0);case 1:cout<<"請(qǐng)輸入字符串"<<endl; cin>>a;StrAssign(S, a);break; case 2:if(!StrEmpty(S)){cout<<"字符串不是空串"<<endl;}else{cout<<"字符串是空串"<<endl;}break;case 3:cout<<"請(qǐng)輸入你要比較的兩個(gè)字符串"<<endl;cin>>a;cin>>b;StrAssign(s, a);StrAssign(t, b); n = StrCompare(s, t);if(n > 0){cout<<"第一字符串大"<<endl;}else if(n == 0){cout<<"兩個(gè)字符串大小相等"<<endl;}else{cout<<"第二個(gè)字符串大" ;}break;case 4:len = StrLength(S); cout<<"字符串的長(zhǎng)度是:"<<len<<endl;break;case 5:cout<<"請(qǐng)輸入你要截取的子串的位置"<<endl;n = SubString(Sub, S, pos, len);if(n){cout<<"你截取的字符串為"<<StrPrint(Sub);}else{cout<<"截取失敗"<<endl; }break;case 6:cout<<"請(qǐng)輸入后你查找的子串"<<endl;cin>>a;StrAssign(t, a);Index(S, t, pos);cout<<"你查找的子串位置是:"<<pos<<endl;break;case 7:cout<<"請(qǐng)輸入你要插入的位置和子串"<<endl;cin>>pos; cin>>a;StrAssign(t, a);StrInsert(S, pos, t);break;case 8:cout<<"請(qǐng)輸入你要?jiǎng)h除的子串位置和長(zhǎng)度"<<endl;cin>>pos;cin>>len;StrDelete(S, n, len);break;case 9:cout<<"字符如下:"<<endl;StrPrint(S); }cout<<" 0----退出"<<endl;cout<<" 1----初始化字符串"<<endl;cout<<" 2-----判斷字符串是否為空"<<endl;cout<<" 3-----比較字符串大小,并返回"<<endl;cout<<" 4------求字符串的長(zhǎng)度"<<endl;cout<<" 5-------截取字符串"<<endl;cout<<" 6--------查找子串的位置"<<endl;cout<<" 7--------插入子串"<<endl;cout<<" 8---------刪除子串";cout<<" 9---------打印字符串\n\n"<<endl; cout<<"請(qǐng)輸入你的操作\n"<<endl;cin>>n; }return 0; }總結(jié)
以上是生活随笔為你收集整理的字符串静态顺序结构C/C++实现(数据结构严蔚敏版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 队列链式结构C/C++实现(数据结构严蔚
- 下一篇: Vbox linux虚拟机桥接(VM操作