perl案例區(qū)分圖文說明教程之14
發(fā)表時(shí)間:2024-02-05 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]十、用關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu) 用關(guān)聯(lián)數(shù)組可以模擬在其它高級(jí)語(yǔ)言中常見的多種數(shù)據(jù)結(jié)構(gòu),本節(jié)講述如何用之實(shí)現(xiàn):鏈表、結(jié)構(gòu)和樹。 2、結(jié)構(gòu) 許多編程語(yǔ)言可以定義結(jié)構(gòu)(structure),即一組數(shù)據(jù)的集合。結(jié)構(gòu)中的每個(gè)元素有其自己的名字,并通過該名字來訪問。 Perl不直接提供結(jié)構(gòu)這種數(shù)據(jù)結(jié)構(gòu),但可以...
十、用關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
用關(guān)聯(lián)數(shù)組可以模擬在其它高級(jí)語(yǔ)言中常見的多種數(shù)據(jù)結(jié)構(gòu),本節(jié)講述如何用之實(shí)現(xiàn):鏈表、結(jié)構(gòu)和樹。
2、結(jié)構(gòu)
許多編程語(yǔ)言可以定義結(jié)構(gòu)(structure),即一組數(shù)據(jù)的集合。結(jié)構(gòu)中的每個(gè)元素有其自己的名字,并通過該名字來訪問。
Perl不直接提供結(jié)構(gòu)這種數(shù)據(jù)結(jié)構(gòu),但可以用關(guān)聯(lián)數(shù)組來模擬。例如模擬C語(yǔ)言中如下的結(jié)構(gòu):
struce{
int field1;
int field2;
int field3; }mystructvar;
我們要做的是定義一個(gè)含有三個(gè)元素的關(guān)聯(lián)數(shù)組,下標(biāo)分別為field1、field2、field3,如:
%mystructvar = ("field1" , "" ,
"field2" , "" ,
"field3" , "" ,);
像上面C語(yǔ)言的定義一樣,這個(gè)關(guān)聯(lián)數(shù)組%mystrctvar有三個(gè)元素,下標(biāo)分別為field1、field2、field3,各元素初始值均為空串。對(duì)各元素的訪問和賦值通過指定下標(biāo)來進(jìn)行,如:
$mystructvar{"field1"} = 17;
3、樹
另一個(gè)經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)是樹。樹與鏈表類似,但每個(gè)節(jié)點(diǎn)指向的元素多于一個(gè)。最簡(jiǎn)單的樹是二叉樹,每個(gè)節(jié)點(diǎn)指向另外兩個(gè)元素,稱為左子節(jié)點(diǎn)和右子節(jié)點(diǎn)(或稱孩子),每個(gè)子節(jié)點(diǎn)又指向兩個(gè)孫子節(jié)點(diǎn),依此類推。
注:此處所說的樹像上述鏈表一樣是單向的,每個(gè)節(jié)點(diǎn)指向其子節(jié)點(diǎn),但子節(jié)點(diǎn)并不指向父節(jié)點(diǎn)。
樹的概念可以如下描述:
因?yàn)槊總(gè)子節(jié)點(diǎn)均為一個(gè)樹,所以左/右子節(jié)點(diǎn)也稱為左/右子樹。(有時(shí)稱左/右分支)
第一個(gè)節(jié)點(diǎn)(不是任何節(jié)點(diǎn)的子節(jié)點(diǎn)的節(jié)點(diǎn))稱為樹的根。
沒有孩子(子節(jié)點(diǎn))的節(jié)點(diǎn)稱為葉節(jié)點(diǎn)。
有多種使用關(guān)聯(lián)數(shù)組實(shí)現(xiàn)樹結(jié)構(gòu)的方法,最好的一種應(yīng)該是:給子節(jié)點(diǎn)分別加上left和right以訪問之。例如,alphaleft和alpharight指向alpha的左右子節(jié)點(diǎn)。下面是用此方法創(chuàng)建二叉樹并遍歷的例程:
1 : #!/usr/local/bin/perl
2 :
3 : $rootname = "parent";
4 : %tree = ("parentleft", "child1",
5 : "parentright", "child2",
6 : "child1left", "grandchild1",
7 : "child1right", "grandchild2",
8 : "child2left", "grandchild3",
9 : "child2right", "grandchild4");
10: # traverse tree, printing its elements
11: &print_tree($rootname);
12:
13: sub print_tree {
14: local ($nodename) = @_;
15: local ($leftchildname, $rightchildname);
16:
17: $leftchildname = $nodename . "left";
18: $rightchildname = $nodename . "right";
19: if ($tree{$leftchildname} ne "") {
20: &print_tree($tree{$leftchildname});
21: }
22: print ("$nodenamen");
23: if ($tree{$rightchildname} ne "") {
24: &print_tree($tree{$rightchildname});
25: }
26: }
結(jié)果輸出如下:
grandchild1
child1
grandchild2
parent
grandchild3
child2
grandchild4