字符串的动态顺序结构(C/C++语言)
生活随笔
收集整理的這篇文章主要介紹了
字符串的动态顺序结构(C/C++语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
所有實現代碼在頭文件中,只要在測試代碼加上頭文件,就可以測試了。測試代碼你覺得不好用,可以再修改。
#include "str.h"1.頭文件str.h
#include<iostream> using namespace std; #include<string.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2#define MAXQSIZE 5 //Status是函數的類型,其值是函數結果狀態碼 typedef int Status;//字符串定義 typedef struct{char *ch; //若是非空串,則按串長分配存儲區,否則 ch 為 NULLint length; //字符串長度 }HString;//初始化給字符串賦值 Status StrAssign(HString &T, char * chars){//if(T.ch) free(T.ch);//若串存儲空間不為NULl 釋放原有空間int i = strlen(chars); //獲取chars長度if(!i){T.ch = NULL; //串常量chars長度為0時串為空串長度0存儲區間指向NULLT.length = 0;}else{T.ch = (char *)malloc(i * sizeof(char)); //申請空間if(!T.ch)exit(OVERFLOW);for(int j = 0; j < i; j++){T.ch[j] = chars[j]; //寫入chars串}T.length = i;}return OK; }//返回字符串的長度 int StrLength(HString &S){return S.length; }//字符串復制,將字符串T復制給S Status StrCopy(HString& S, const HString& T){int i;//如果字符串不為空,就釋放它的空間 if(!S.ch) free(S.ch);//如果字符串是空串 if(!T.length){S.ch = NULL;S.length;} else{//給字符串S申請 S.ch = (char*)malloc(sizeof(char) * T.length);//如果分配地址失敗,就退出 if(!S.ch) exit(OVERFLOW);//將字符串T賦值給S,長度是T的長度 for(int i=0; i<T.length; i++){S.ch[i] = T.ch[i];}S.length = T.length;}return OK; } //插入子串,將字符串T插入到字符串S的pos位置 Status StrInsert(HString& S, const int& pos, const HString& T){//判斷插入配置是否合理 if(pos < 0 || pos > S.length) return ERROR;if(T.ch){//重新改變字符串的長度 S.ch = (char*)realloc(S.ch, (S.length+ T.length) * sizeof(char));if(!S.ch) return ERROR;//將pos位置后的數據后移,騰出空間給T for(int i = S.length-1; i >= pos; i--){S.ch[i+T.length] = S.ch[i];}//字符串插入 for(int i = 0; i < T.length; i++){S.ch[pos+i] = T.ch[i];}S.length = S.length + T.length;}return OK; } //比較兩個字符串的大小,若 S>T 返回值>0。相等 返回0 ,否則返回 <0 int StrCompare(const HString& S, const HString& T){for(int i = 0; i < S.length && i < T.length; i++){if(S.ch[i] != T.ch[i])return S.ch[i] - T.ch[i];}return S.length-T.length; }//清空串S為空串,并釋放所占空間 Status ClearString(HString &S){if(S.ch){free(S.ch);S.ch = NULL;}S.length = 0;return OK; }//連接兩個字符串,生成一個新的字符串 Status Concat(HString &T, const HString& S1, const HString& S2){if(T.ch) free(T.ch);//申請內存空間 T.ch = (char *)malloc( (S1.length + S2.length) * sizeof(char) );if(!T.ch) exit(OVERFLOW);//長度等于兩個字符串的長度和 T.length = S1.length + S2.length;//復制S1的字符串 for(int i = 0; i < S1.length; i++)T.ch[i] = S1.ch[i];//復制S2的字符串 for(int i = 0;i < S2.length; i++)T.ch[i + S1.length] = S2.ch[i];return OK; }//字符串截取,返回截取的子串 Status SubString(HString& sub, const HString& S, const int& pos, const int& len){//判斷截取是否合法 if( pos < 1 || pos > S.length || len < 0 || (S.length - pos + 1 ) < len )return ERROR;//釋放就空間 if(sub.ch) free(sub.ch);//分配新地址空間 sub.ch=(char *)malloc( len * sizeof(char) ); if(!sub.ch) exit(OVERFLOW);//復制字符串 for(int i = 0; i < len; i++)sub.ch[i] = S.ch[i + pos - 1];sub.length = len;return OK; }//刪除子串 Status StrDelete(HString& S, int pos, int len){//判斷刪除的位置和長度是否合法 if(pos < 0 || len < 0 ||pos+len > S.length)return ERROR;//將pos+len位置后面的數據前移 for(int i = pos+len; i <= S.length-1; i++){S.ch[i-len] = S.ch[i];} //刪除pos到pos+len位置的數據 S.ch = (char*)realloc(S.ch, (S.length-len)*sizeof(char));S.length = S.length - len;return OK; } //字符串的定位,查找字符串T字主串S中的位置,并返回給pos Status Index(const HString& S, const HString& T, int& pos){int i = 0, j = 0;while(i < S.length && j < T.length){//如果兩個字符相同,就繼續比較下一個字符 if(S.ch[i] == T.ch[j]){i++;j++;}else{ // 遇到不匹配的字符,就重新進行匹配,從主串第i-j+1位置重新跟T進行匹配 i = i-j+1;j = 0;}}//匹配完成 if(j == T.length){pos = i-T.length;return OK;}else{//沒完全匹配,后面剩余一些字符沒匹配 return ERROR;} } //置換子串操作 Status StrReplace(HString&S, const HString& T, const HString& V) {int pos;while(Index(S, T, pos)){//判斷T是否為S的子串 StrDelete(S, pos, T.length);//刪除S中的子串T StrInsert(S, pos, V);//在S中插入子串V return OK;} //沒有在S中查到子串T return ERROR; }//打印字符串 Status Print(const HString& S){for(int i = 0; i < S.length; i++){cout<<S.ch[i];} return OK; }2.測試文件test.cpp
#include "str.h" int main(void){HString S, T, s1, s2, V;int n, length, index;char s[30];S.ch = NULL;T.ch = NULL;cout<<"請輸入你的操作"<<endl;cout<<" 0-------------退出"<<endl;cout<<" 1-------------初始化字符串"<<endl;cout<<" 2-------------獲取字符串的長度"<<endl;cout<<" 3-------------清空字符串"<<endl;cout<<" 4--------------字符串比較"<<endl;cout<<" 5--------------獲取子串"<<endl;cout<<" 6---------------打印子串"<<endl; cout<<" 7---------------連接子串\n"<<endl;cout<<" 8---------------替換子串\n"<<endl;cin>>n;getchar();while(1){switch(n){case 0:cout<<"你已經退出"<<endl;exit(0);case 1:cout<<"請輸入你要輸入的字符串"<<endl;gets(s);StrAssign(S, s);cout<<"初始化成功"<<endl;break;case 2: length = S.length;cout<<"你輸入的字符串的長度是"<<endl;cout<<length<<endl;break; case 3:ClearString(S);cout<<"字符串已經清空"<<endl;break; case 4:cout<<"請再輸入一個你要比較的另一個字符串"<<endl;gets(s);StrAssign(T, s);index = StrCompare(S, T);if(index > 0){cout<<"第一個字符串大"<<endl; }else{cout<<"第二個字符串大"<<endl; }break;case 5:cout<<"請輸入你要獲取子串的位置和長度"<<endl;cin>>n;cin>>length;SubString(T, S, n, length);cout<<"你獲取的字符串子串如下:"<<endl;Print(T);break;case 6:cout<<"你輸入字符串信息如下: "<<endl;Print(S);break;case 7:char a[10];cout<<"請輸入你要連接的兩個子串"<<endl;gets(a);StrAssign(s1, a);getchar();gets(s);StrAssign(s2, s);Concat(T, s1, s2);cout<<"你連接的字符串如下: "<<endl; Print(T);break;case 8:char s[10];char t[10];char v[10];cout<<"請輸入字符串、替換字符串、替換后的字符串"<<endl;cin>>s;StrAssign(S, s);cin>>t;StrAssign(T, t);cin>>v;StrAssign(V, v);StrReplace(S, T, V);Print(S);break;}cout<<"\n\n請輸入你的操作"<<endl;cout<<" 0-------------退出"<<endl;cout<<" 1-------------初始化字符串"<<endl;cout<<" 2-------------獲取字符串的長度"<<endl;cout<<" 3-------------清空字符串"<<endl;cout<<" 4--------------字符串比較"<<endl;cout<<" 5--------------獲取子串"<<endl;cout<<" 6---------------打印子串"<<endl; cout<<" 7---------------連接子串\n"<<endl;cout<<" 8---------------替換子串\n"<<endl;cin>>n;getchar();}}總結
以上是生活随笔為你收集整理的字符串的动态顺序结构(C/C++语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vbox linux虚拟机桥接(VM操作
- 下一篇: windows下利用IIS搭建web和f