串的鏈式表示和實現
阿新 • • 發佈:2018-11-27
用連結串列的方法來寫串真的是太麻煩了(下回更新一個用動態陣列寫的)。
下面是我簡單實現的鏈式串的幾個功能,沒辦法,資料結構老師不給程式碼,這些完全是我自己想的。
應該沒什麼邏輯上的錯誤,如有發現還請提出來。
#include <iostream> #include <cstring> using namespace std; const int SIZE = 80 + 7; typedef struct Chunk{ char ch[SIZE]; // 結點型別和大小 struct Chunk *next; } Chunk; typedef struct { Chunk *head, *tail; // 串的頭指標和尾指標 int curlen; // 串的長度 } LString; bool StrInit(LString &S) { S.head = NULL; S.head = new Chunk; // 初始分配第一個節點 S.tail = S.head; S.tail->next = NULL; if( !S.head) return false; else return true; } bool StrAssign(LString &S, Chunk *s2) { LString s1, tmp; s1.head = S.head->next; while(s1.head != NULL) // 如果是賦值就刪除除出第一個結點外的所有節點 { tmp.head = s1.head; s1.head = s1.head->next; delete tmp.head; } strcpy(S.head->ch, s2->ch); // 賦值到頭結點 return true; } bool StrDelete(LString &S); bool StrCopy(LString &s1, const LString &s2) { StrDelete(s1); // 先將第一個串清空成空串 s1.curlen = s2.curlen; // 先複製長度值 LString i = s2; while(i.head != NULL) // 以此可以訪問到s2中所有的結點 { Chunk *tmp = new Chunk; // 新定義一個結點,並分配空間 strcpy(tmp->ch, i.head->ch); tmp->next = i.head->next; if(i.head == NULL) // 如果頭結點為空 { s1.head = tmp; s1.tail = tmp; } else { s1.tail->next = tmp; // 插入在尾結點的後面 s1.tail = s1.tail->next; // 尾指標後移 } i.head = i.head->next; // i後移到下一個節點 } } bool StrDelete(LString &S) // 刪除所有節點,使稱為空串 { LString tmp; while(S.head != NULL) { tmp.head = S.head; S.head = S.head->next; delete tmp.head; } S.tail = S.head; // 都置位空 return true; } bool StrSwap(LString &s1, LString &s2) // 交換兩個串 { LString tmp; tmp = s1; s1 = s2; s2 = tmp; return true; } int StrSize(const LString &S) { return S.curlen; // 返回的是結點的個數 } int main() { LString S; StrInit(S); cin >> S.head->ch; cout << S.head->ch; return 0; }