廣義表的深度和長度(C語言)詳解

2021-09-30 01:25:39 字數 1815 閱讀 4798

廣義表的長度,指的是廣義表中所包含的資料元素的個數。

由於廣義表中可以同時儲存原子和子表兩種型別的資料,因此在計算廣義表的長度時規定,廣義表中儲存的每個原子算作乙個資料,同樣每個子表也只算作是乙個資料。

例如,在廣義表 } 中,它包含乙個原子和乙個子表,因此該廣義表的長度為 2。

再比如,廣義表 } 中只有乙個子表 ,因此它的長度為 1。

前面我們用 ls= 來表示乙個廣義表,其中每個 ai 都可用來表示乙個原子或子表,其實它還可以表示廣義表 ls 的長度為 n。

廣義表規定,空表 {} 的長度為 0。
在程式設計實現求廣義表長度時,由於廣義表的儲存使用的是鍊錶

結構,且有以下兩種方式

對於圖 1a) 來說,只需計算最頂層(紅色標註)含有的節點數量,即可求的廣義表的長度。

同理,對於圖 1b) 來說,由於其最頂層(藍色標註)表示的此廣義表,而第二層(紅色標註)表示的才是該廣義表中包含的資料元素,因此可以通過計算第二層中包含的節點數量,即可求得廣義表的長度。

由於兩種演算法的實現非常簡單,這裡只給出計算圖 1a) 中廣義表長度的 c 語言實現**:

#include #include typedef struct glnodeptr;//子表結點的指標域,hp指向表頭;tp指向表尾

};}*glist;

glist creatglist(glist c)

int glistlength(glist c)

return number;

}int main()

程式執行結果為:

廣義表的深度,可以通過觀察該表中所包含括號的層數間接得到

此廣義表從左往右數有兩層左括號(從右往左數也是如此),因此該廣義表的深度為 2。 

再比如,廣義表 ,}} 中,子表 和 } 位於同層,此廣義表中包含 3 層括號,因此深度為 3。

以上觀察括號的方法需將廣義表當做字串看待,並借助棧儲存結構實現,這裡不做重點介紹。
編寫程式計算廣義表的深度時,以第一種廣義表為例,可以採用遞迴的方式:

其實,每次遞迴返回的值都是當前所在的子表的深度,原子預設深度為 0,空表預設深度為 1。
c 語言實現**如下:

#include #include typedef struct glnodeptr;//子表結點的指標域,hp指向表頭;tp指向表尾

};}*glist,gnode;

glist creatglist(glist c)

int glistdepth(glist c)

//如果表c為原子時,直接返回0;

if (c->tag==0)

int max=0;//設定表c的初始長度為0;

for (glist pp=c; pp; pp=pp->ptr.tp)

}//程式執行至此處,表明廣義表不是空表,由於原子返回的是0,而實際長度是1,所以,此處要+1;

return max+1;

}int main(int argc, const char * ar**)

程式執行結果:

廣義表的深度為:2

廣義表的長度和深度怎麼算 機器學習 廣義線性模型

ai小白入門 作者 編輯 文傑 yuquanle 機器學習 知否?知否?廣義線性模型 mp.weixin.qq.com 從線性回歸,logistic回歸,softmax回歸,最大熵的概率解釋來看,我們會發現線性回歸是基於高斯分布 最大似然估計的結果,logistic回歸是伯努利分布 對數最大似然估計...

C 如何實現廣義表詳解

以下給出幾種簡單的廣義表模型 由上圖我們可以看到,廣義表的節點型別無非head value sub三種,這裡設定列舉型別,利用列舉變數來記錄每個節點的型別 enum type 每個節點都有自己的型別以及next指標,除此之外,如果該節點是value型別還要分配空間儲存該節點的有效值 但是若該節點是s...

廣義表的建立,遍歷,求深度

include typedef char atomtype typedef enum elemtag atom 0,表示原子 list 1,表示子表 typedef struct glnode htp 表結點的指標域htp,包括 表頭指標域hp和表尾指標域tp atom htp atom htp 是...