資料結構 串的順序表示和實現
阿新 • • 發佈:2018-11-27
上次寫鏈式串的時候就覺得太麻煩了,而且還不一定好用,今天就寫順序的果然方便很多。
寫的串是常用的字串以及一些常用函式。
全部自己原創的,如有不足還請指出。
#include <iostream> using namespace std; const int MAXN = (int) 1e6 + 7; typedef struct Chunk{ char * str; } Chunk; int StrSize(const Chunk &s); // 函式宣告 bool StrInit(Chunk &s) // 初始化 { s.str = NULL; s.str = new char[MAXN]; if(s.str) return true; else return false; } bool StrAssign(Chunk &s, char *t) // 賦值 { int i = 0; for(i=0; t[i] != '\0'; i++) { s.str[i] = t[i]; } s.str[i] = '\0'; return true; } bool StrCopy(Chunk &s1, const Chunk &s2) // 複製另一個串 { int i = 0; for(i=0; s2.str[i] != '\0'; i++) { s1.str[i] = s2.str[i]; } s1.str[i] = '\0'; return true; } bool StrCat(Chunk &s1, const Chunk &s2) // 連線兩個串 { int j = StrSize(s1); // j 指向 s1 的末尾 '\0' 處 for(int i=0; s2.str[i] != '\0'; i++) { s1.str[j++] = s2.str[i]; } s1.str[j] = '\0'; return true; } int StrCmp(const Chunk &s1, const Chunk &s2) // 比較兩個串 { int rec = 0; int length = min(StrSize(s1), StrSize(s2)); for(int i=0; i<=length; i++) // 這裡取等號,到最後一個一定可以分出來誰大誰小或相等 { if(s1.str[i] == s2.str[i]) continue; else if(s1.str[i] > s2.str[i]) { rec = s1.str[i] - s2.str[i]; break; } else { rec = s2.str[i] - s1.str[i]; break; } } return rec; } bool StrDelete(Chunk &s) // 銷燬串 { delete s.str; s.str = NULL; return true; } int StrSize(const Chunk &s) // 求串的長度 { int i = 0; for(i=0; s.str[i] != '\0'; i++) {} // 空迴圈體 return i; } bool StrSwap(Chunk &s1, Chunk &s2) { char ch; int length = max(StrSize(s1), StrSize(s2)); for(int i=0; i<=length; i++) { ch = s1.str[i]; s1.str[i] = s2.str[i]; s2.str[i] = ch; } return true; } int main() { Chunk s; StrInit(s); StrAssign(s, "chenglongdaxia"); cout << s.str << endl; Chunk t; StrInit(t); StrAssign(t, "123456"); StrCopy(s, t); cout << s.str << endl; StrCat(s, t); cout << s.str << endl; cout << StrCmp(s, t) << endl; StrAssign(s, "chenglongdaxia"); cout << s.str << endl; StrSwap(s, t); cout << s.str << " " << t.str << endl; StrDelete(s); // 銷燬 StrDelete(t); return 0; }