Perl教學(xué) 第9篇 關(guān)聯(lián)數(shù)組之4
發(fā)表時(shí)間:2024-06-11 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]2、結(jié)構(gòu)許多編程語(yǔ)言可以定義結(jié)構(gòu)(structure),即一組數(shù)據(jù)的集合。結(jié)構(gòu)中的每個(gè)元素有其自己的名字,并通過(guò)該名字來(lái)訪問(wèn)。Perl不直接提供結(jié)構(gòu)這種數(shù)據(jù)結(jié)構(gòu),但可以用關(guān)聯(lián)數(shù)組來(lái)模擬。例如模擬C語(yǔ)言中如下的結(jié)構(gòu):struce{int field1;int field2;int field3; }...
2、結(jié)構(gòu)
許多編程語(yǔ)言可以定義結(jié)構(gòu)(structure),即一組數(shù)據(jù)的集合。結(jié)構(gòu)中的每個(gè)元素有其自己的名字,并通過(guò)該名字來(lái)訪問(wèn)。
Perl不直接提供結(jié)構(gòu)這種數(shù)據(jù)結(jié)構(gòu),但可以用關(guān)聯(lián)數(shù)組來(lái)模擬。例如模擬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ì)各元素的訪問(wèn)和賦值通過(guò)指定下標(biāo)來(lái)進(jìn)行,如:
$mystructvar{"field1"} = 17;
3、樹(shù)
另一個(gè)經(jīng)常使用的數(shù)據(jù)結(jié)構(gòu)是樹(shù)。樹(shù)與鏈表類(lèi)似,但每個(gè)節(jié)點(diǎn)指向的元素多于一個(gè)。最簡(jiǎn)單的樹(shù)是二叉樹(shù),每個(gè)節(jié)點(diǎn)指向另外兩個(gè)元素,稱(chēng)為左子節(jié)點(diǎn)和右子節(jié)點(diǎn)(或稱(chēng)孩子),每個(gè)子節(jié)點(diǎn)又指向兩個(gè)孫子節(jié)點(diǎn),依此類(lèi)推。
注:此處所說(shuō)的樹(shù)像上述鏈表一樣是單向的,每個(gè)節(jié)點(diǎn)指向其子節(jié)點(diǎn),但子節(jié)點(diǎn)并不指向父節(jié)點(diǎn)。
樹(shù)的概念可以如下描述:
·因?yàn)槊總(gè)子節(jié)點(diǎn)均為一個(gè)樹(shù),所以左/右子節(jié)點(diǎn)也稱(chēng)為左/右子樹(shù)。(有時(shí)稱(chēng)左/右分支)
·第一個(gè)節(jié)點(diǎn)(不是任何節(jié)點(diǎn)的子節(jié)點(diǎn)的節(jié)點(diǎn))稱(chēng)為樹(shù)的根。
·沒(méi)有孩子(子節(jié)點(diǎn))的節(jié)點(diǎn)稱(chēng)為葉節(jié)點(diǎn)。
有多種使用關(guān)聯(lián)數(shù)組實(shí)現(xiàn)樹(shù)結(jié)構(gòu)的方法,最好的一種應(yīng)該是:給子節(jié)點(diǎn)分別加上left和right以訪問(wèn)之。例如,alphaleft和alpharight指向alpha的左右子節(jié)點(diǎn)。下面是用此方法創(chuàng)建二叉樹(shù)并遍歷的例程:
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 ("$nodename\n");
23: if ($tree{$rightchildname} ne "") {
24: &print_tree($tree{$rightchildname});
25: }
26: }
結(jié)果輸出如下:
grandchild1
child1
grandchild2
parent
grandchild3
child2
grandchild4
注意函數(shù)print_tree()以次序“左子樹(shù)、節(jié)點(diǎn)、右子樹(shù)”來(lái)輸出各節(jié)點(diǎn)的名字,這種遍歷次序稱(chēng)為“左序遍歷”。如果把第22行移到19行前,先輸出節(jié)點(diǎn)明,再輸出左子樹(shù)、右子樹(shù),則為“中序遍歷”,如果把第22行移到25行后,輸出次序?yàn)樽笞訕?shù)、右子樹(shù)、節(jié)點(diǎn),則為“右序遍歷”。
可以用同樣的方法,即連接字符串構(gòu)成下標(biāo),來(lái)創(chuàng)建其它的數(shù)據(jù)結(jié)構(gòu),如數(shù)據(jù)庫(kù)等。