1. 程式人生 > >字串資料結構實現(連結串列方式)

字串資料結構實現(連結串列方式)

相較於陣列方式的實現,C語言我採用了單鏈表的方式實現,C++採用了雙鏈表的方式。毫無疑問,雙鏈表的效率肯定是要遠高於單鏈表的。這次支援中文字元的操作,這個實現的思路是,在節點類中新增兩個成員變數,一個用來存放char字元,一個用來存放wchar_t字元。關於兩者的相互轉換及輸出請參考 C語言寬字元輸出和轉換

C程式碼實現下載
C++程式碼實現下載
(備用下載地址 )

這裡講一下字串單鏈表實現的思路和雙鏈表實現的思路(如果不太懂單鏈表的實現和雙鏈表的實現請參考線性表之單鏈表線性表之雙向連結串列

毫無疑問,用連結串列的方式來儲存的時候,是一個個節點進行儲存的,所以一個節點內你可以存放char字元或者wchar_t字元,不想陣列那樣,存放以及取出wchar_t字元是如此的困難。

單鏈表方式:
1.建立一個節點結構體,裡面包含三個欄位,分別是char、wchar_t、和Node*。

typedef struct _node
{
    char c;         //窄位元組
    wchar_t w;      //寬位元組
    _node* next;
}Node,*PNode;

2.建立一個字串結構體,用來管理字元節點,裡面包含三個欄位,分別是count(字串長度)、headNode(頭節點)、endNode(尾節點)。

typedef struct _string
{
    int count;        //字元個數
    PNode headNode;   //存放資料的節點(可以理解為一個String有一個頭節點,然後訪問陣列的時候通過這個頭節點訪問)
PNode endNode; //方便訪問最後一個節點 }String,*PString;

3.第三步就是實現字元的增、刪、改、查操作,這個和單鏈表的實現基本相同,就是data域換成了char和wchar_t。

4.第四部就是新增進去後的字元,如何取出作為字串輸出,那就是將所有節點的值串起來即可,儲存到char*緩衝區中。

雙鏈表方式:
1.建立一個節點類,用來存放字元的值,裡面包含四個成員變數,分別是c(char字元)、w(wchar_t字元)、next(後繼節點)、pre(前驅節點)。

2.實現字元的增、刪、改、查,可以參考雙鏈表的實現程式碼。

3.取出字串也是將節點串起來。所以這一步的操作會比陣列方式慢很多。

總結一下難點:
第一,如何儲存中文字元,一般判斷該字元的int值是否大於255即可判斷是否是中文字元,大於255就是中文字元,否則是英文字元。之後如果是wchar_t字元就存放在w域中,否則存放在c域中。記住,一個節點中,c和w一定要有一個為0,否則取出的時候不好判斷。

第二,如何取出中文字元,如果w值不為0,則可以取出,這個步驟還要細分,首先,先把wchar_t字元轉換為char[3]陣列,為什麼呢?因為一個wchar_t 佔2個字元,所以轉換後,一箇中文字元需要char[0],char[1]兩個位元組來表示。

第三,如何將一個個節點內的字串成串,建立一個char* buf的緩衝區,然後從頭節點開始遍歷,如果c不為0,則是英文字元,此時可以取出直接放進buf中,若w不為0,則是中文字元,此時可以取出進行窄位元組的轉換後,再放進buf中,此時放進去的是兩個位元組。以此類推,直到最後一個節點。

第四,這也是最重要的,如果沒有這一步,那麼wchar_t的轉換以及輸出都會亂碼。那就是用setlocale函式設定字符集環境為中文。具體請參考 C語言寬字元輸出和轉換