此文大部分內容借鑑網上文章,我只是按照自己的思路整合了一遍。
實驗目的
熟悉唯一可譯碼判決準則。
掌握C語言字符串處理程序的設計和調試技術
實驗要求
已知:信源符號個數r、碼字集合C。
輸入:任意的一個碼。碼字個數和每個具體的碼字在運行時從鍵盤輸入
輸出:判決(是唯一可譯碼/不是唯一可譯碼)。
實驗原理
A.A.Sardinas和G.W.Patterson於1957年提出了一種用於判斷碼C的唯一可譯性。算法原理如下:
其中 和 都是碼字。可知,當且僅當某個有限長的碼符號序列能譯成不同的碼字序列時,此碼不是唯一可譯碼,此時 一定是 的前綴,而 的尾隨後綴一定是另一個碼字 的前綴;而 的尾隨後綴優勢其他他碼字的前綴。最後,嗎符號序列的尾部一定是一個碼字。設C爲碼字集合,按以下步驟構造此碼的尾隨後綴集合
(1)考察C中所有的碼字,若
(2)考察C和
(3)
(4)若 中出現了C中的元素,則算法中值,返回C不是唯一可譯碼。否則若F中沒有出現新的元素,則C是唯一可譯碼。
算法實現
主要的工作是構造C和F這兩個集合,其中集合C是待判決的碼字集合,通過輸入獲得,集合F是尾隨碼集合,集合F的構造過程就是整個算法實現的核心。用構造的鏈表來存儲集合F。
鏈表基本數據類型
struct strings
{
char *string;
struct strings *next;
};
程序的核心函數
1 .void houzhui(char *CP, char *tempPtr)
2. int comparing(strings *st_string, char *code)
用來判斷兩個碼字是否一個是另一個的前綴,如果是則生成後綴碼
3. void outputstr(strings *str)
用來輸出字符串。
完整代碼見Gitub倉庫
源代碼倉庫
運行測試
首先輸入一組爲唯一可譯的碼,各個碼字分別爲1222 1345 2222 4567共四個碼字
下面看一下當碼字不是唯一可譯的情況,同樣輸入四個不同的碼字,分別是1234 123 111 1 。但是碼字不是異字頭碼,即有的碼字是其他碼字的頭部。
程序運行結果顯示該碼不是唯一可譯碼,該測試程序有效。