摘要:本文說(shuō)明了數(shù)據(jù)結(jié)構(gòu)教學(xué)中如何注重承前啟后,文中以單鏈表插入算法教學(xué)為實(shí)例具體說(shuō)明了在教學(xué)中同一章的內(nèi)容之間如何注重承前啟后,同時(shí)說(shuō)明了在講授單鏈表、有序表的歸并、查找等內(nèi)容時(shí),如何注重各章內(nèi)容之間的承前啟后。
關(guān)鍵詞:?jiǎn)捂湵?;插入;承前啟?/p>
中圖分類號(hào):G642
文獻(xiàn)標(biāo)識(shí)碼:B
1引言
“數(shù)據(jù)結(jié)構(gòu)”是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的一門(mén)核心專業(yè)基礎(chǔ)課,是我校計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)的學(xué)位課程以及報(bào)考該專業(yè)研究生必考課程,因此學(xué)生對(duì)“數(shù)據(jù)結(jié)構(gòu)”這門(mén)課普遍比較重視。但由于“數(shù)據(jù)結(jié)構(gòu)”課程的特點(diǎn)是概念多、綜合性強(qiáng)、技巧性強(qiáng),往往學(xué)生感到花了不少時(shí)間和精力,學(xué)習(xí)效果不象有些課程那么明顯,特別是感到理解書(shū)上的內(nèi)容并不難,課上也都聽(tīng)得懂,可是一做算法設(shè)計(jì)題就無(wú)從下手,寫(xiě)出的算法結(jié)構(gòu)不清晰、效率低下,根據(jù)課程內(nèi)容編寫(xiě)上機(jī)題更是困難重重。部分同學(xué)進(jìn)而感到“數(shù)據(jù)結(jié)構(gòu)”難學(xué),甚至少數(shù)同學(xué)對(duì)學(xué)好該課程喪失信心。究其原因,主要是學(xué)生對(duì)所學(xué)知識(shí)的掌握是片面的、支離破碎的,沒(méi)有能將所學(xué)知識(shí)融會(huì)貫通,靈活應(yīng)用。
筆者在多年的“數(shù)據(jù)結(jié)構(gòu)”教學(xué)中不斷探索、吸取和總結(jié)教學(xué)理論和教學(xué)經(jīng)驗(yàn),在教學(xué)過(guò)程中注意承前啟后,善于總結(jié),把課程中各章之間的內(nèi)容、每章各小節(jié)之間的內(nèi)容串起來(lái),從而利于學(xué)生的理解和掌握,取得了良好的教學(xué)效果。
2教學(xué)中注重同一章的內(nèi)容之間承前啟后
在進(jìn)行每一章教學(xué)時(shí),注重內(nèi)容的前后聯(lián)系,承前啟后。在學(xué)習(xí)一個(gè)新的知識(shí)點(diǎn)時(shí),盡量由學(xué)生已經(jīng)熟悉的內(nèi)容引入,過(guò)渡到新的知識(shí)點(diǎn)。就像一個(gè)人挑擔(dān)子一樣,一下子挑很重的擔(dān)子是不行的,每天增加一點(diǎn),天長(zhǎng)日久,可挑的擔(dān)子就會(huì)越來(lái)越重而不會(huì)感到吃力。同樣在教學(xué)中也應(yīng)該是讓學(xué)生總是在已學(xué)知識(shí)的基礎(chǔ)上認(rèn)識(shí)學(xué)習(xí)新知識(shí),這樣學(xué)生學(xué)習(xí)就不會(huì)感到吃力,同時(shí)通過(guò)已學(xué)知識(shí)引入新知識(shí),更加深了學(xué)生對(duì)前面知識(shí)的理解,使原來(lái)可能模糊的概念變得清晰。在學(xué)完每個(gè)新的知識(shí)點(diǎn)后,盡量介紹一下它和后面的聯(lián)系,以后那些地方我們會(huì)用到它,這樣,學(xué)生覺(jué)得這些內(nèi)容以后需要用,就學(xué)得格外認(rèn)真,同時(shí)也對(duì)將來(lái)要學(xué)的內(nèi)容作了預(yù)習(xí)。
下面以單鏈表中插入算法的教學(xué)為例,談?wù)劰P者的具體做法。
2.1單鏈表的存儲(chǔ)結(jié)構(gòu)
typedefstructLnode {
ElemTypedata;
Struct Lnode*next;
}Lnode,*Linklist;
2.2在單鏈表中插入一個(gè)結(jié)點(diǎn)
在單鏈表中某結(jié)點(diǎn)p后面插入結(jié)點(diǎn)s,如圖1所示。
插入算法為:
new(s); s->data=x;
s->next=p->next; p->next=s;
一般教材往往只介紹向單鏈表中插入一個(gè)結(jié)點(diǎn)的算法,學(xué)生一般都能把插入算法搞得很清楚,但是他們不能把所學(xué)的內(nèi)容前后聯(lián)系起來(lái),做習(xí)題時(shí)不善于用已學(xué)的知識(shí)來(lái)解決問(wèn)題。產(chǎn)生這種問(wèn)題的原因是學(xué)生沒(méi)吃透書(shū)中的內(nèi)容。在教學(xué)時(shí)為了拓寬學(xué)生的思路,筆者接下來(lái)介紹在單鏈表的頭結(jié)點(diǎn)后面插入一個(gè)結(jié)點(diǎn)s,如果從一個(gè)空鏈表開(kāi)始反復(fù)地在頭結(jié)點(diǎn)后向單鏈表中插入結(jié)點(diǎn),就用前插法建立了一個(gè)鏈表;筆者還介紹了在單鏈表的尾上插入一個(gè)結(jié)點(diǎn)s,如果從只有一個(gè)頭結(jié)點(diǎn)的空鏈表開(kāi)始,反復(fù)地向單鏈表的表尾插入結(jié)點(diǎn),也就用尾插法建立了一個(gè)鏈表;在后面講解建立單鏈表的兩種方法前插法和尾插法時(shí)就很自然地由已學(xué)的知識(shí)過(guò)渡到新的知識(shí)點(diǎn)。
2.3建立單鏈表
建立單鏈表有前插法和尾插法兩種方法。
對(duì)于前插法,先建立一個(gè)帶頭結(jié)點(diǎn)的空鏈表,然后依次反復(fù)生成新結(jié)點(diǎn)并插入到頭結(jié)點(diǎn)后,如圖2所示。
前插法的算法為:
Void Create_List_Front(Linklist head,int n){
//前插法建立單鏈表
new ( head);p=head;
head->next=NULL;
For (i=n; i>0;--i){
new(s);
s->data=x;// 生成新結(jié)點(diǎn)
s->next=p->next; p->next=s; // 插入到表頭
}
}// Create_List_Front
對(duì)于尾插法,首先生成一個(gè)頭結(jié)點(diǎn),然后依次反復(fù)生成新結(jié)點(diǎn)并插入到表尾,最后把表尾的指針域置空,如圖3所示。
后插法的算法為:
void Create_List_Back(Linklist head,int n){
//尾插法建立單鏈表
new ( head); p=head;
For (i=0; i new(s); s->data=x;// 生成新結(jié)點(diǎn) p->next=s;// 插入到表尾 p=s;// 修改尾指針 } p->next=NULL; }// Create_List_Back 由單鏈表的建立引申出單鏈表的逆置,單鏈表的逆置方法就是利用單鏈表的建立的前插法,只不過(guò)表中的結(jié)點(diǎn)已經(jīng)存在無(wú)需再生成,引導(dǎo)學(xué)生由已知的知識(shí)過(guò)渡到新的知識(shí),把所學(xué)知識(shí)學(xué)通、學(xué)活,題目就會(huì)做。 2.4單鏈表的逆置 void inverse(linklist head) //單鏈表的逆置算法 { p=head->next;//指針p指向單鏈表的第一個(gè)結(jié)點(diǎn), head->next=1;//先置表為帶頭結(jié)點(diǎn)head的空表 while p do { s=p; // 指針s指向待插入的結(jié)點(diǎn) p=p->next;//指針p后移 s->next=head->next; head->next=s;//把s所指的結(jié)點(diǎn)插入到head后 } } 以上幾點(diǎn)掌握后,引導(dǎo)學(xué)生在做習(xí)題時(shí)盡量利用已學(xué)的內(nèi)容來(lái)解決問(wèn)題,一些單鏈表的經(jīng)典習(xí)題就很容易解了。例如,在學(xué)了單鏈表的逆置算法和兩個(gè)單鏈表的歸并算法后,可以解決這樣一個(gè)習(xí)題:把兩個(gè)遞增有序表歸并為一個(gè)遞減有序表,要求利用原表結(jié)點(diǎn)的空間構(gòu)造新表。這個(gè)習(xí)題的難度系數(shù)為4,同學(xué)初看這個(gè)題目感到無(wú)從下手,仔細(xì)分析一下就會(huì)發(fā)現(xiàn)只需將前面所學(xué)內(nèi)容綜合起來(lái)就可以了。 通過(guò)講解單鏈表的插入算法,引申出單鏈表的建立、逆置、兩個(gè)單鏈表的歸并等問(wèn)題,從而使學(xué)生對(duì)在單鏈表中插入結(jié)點(diǎn)這個(gè)知識(shí)點(diǎn)能夠融會(huì)貫通,從而解決與插入結(jié)點(diǎn)算法有關(guān)的一類問(wèn)題。 在講解了單鏈表中結(jié)點(diǎn)的插入和刪除后,進(jìn)一步啟發(fā)學(xué)生,如果插入和刪除都在鏈表頭結(jié)點(diǎn)處,也就是下一章要學(xué)習(xí)的鏈?zhǔn)綏5娜霔:统鰲A?。如果插入結(jié)點(diǎn)總是在鏈表的尾結(jié)點(diǎn)處,刪除結(jié)點(diǎn)總在鏈表頭結(jié)點(diǎn)處,也就是下一章要學(xué)習(xí)的鏈?zhǔn)疥?duì)列的入隊(duì)和出隊(duì)。把在單鏈表中插入和刪除結(jié)點(diǎn)的知識(shí)和鏈?zhǔn)綏<版準(zhǔn)疥?duì)列相聯(lián)系,對(duì)后一章棧和隊(duì)列的內(nèi)容進(jìn)行了預(yù)習(xí)。在后面講到棧和隊(duì)列時(shí)學(xué)生很自然會(huì)將前面學(xué)習(xí)的知識(shí)應(yīng)用到新知識(shí)中。 3教學(xué)中注重各章內(nèi)容之間的承前啟后 “數(shù)據(jù)結(jié)構(gòu)”的內(nèi)容,粗看看就是介紹幾種典型的數(shù)據(jù)結(jié)構(gòu),學(xué)生往往很難把各章之間的內(nèi)在聯(lián)系吃透。在教學(xué)中如果注重內(nèi)容的前后聯(lián)系,把各章前后內(nèi)容盡量聯(lián)系起來(lái),學(xué)生對(duì)“數(shù)據(jù)結(jié)構(gòu)”內(nèi)容的理解就會(huì)全面、深刻。 例如,以單鏈表為主線將各個(gè)知識(shí)點(diǎn)串起來(lái),單鏈表應(yīng)該是全書(shū)的重點(diǎn),在許多地方都用到。從不帶頭結(jié)點(diǎn)的單鏈表、帶頭結(jié)點(diǎn)的單鏈表,到單向循環(huán)鏈表、雙向循環(huán)鏈表,以及棧和隊(duì)列的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),其中的變化都是漸漸的。而數(shù)組的十字鏈表、樹(shù)的孩子鏈表、圖的鄰接表、有向圖的十字鏈表、無(wú)向圖的鄰接多重表、哈希表處理沖突的鏈地址法都是多個(gè)單鏈表的應(yīng)用。在講解前面單鏈表的內(nèi)容時(shí)注意簡(jiǎn)要介紹后面的內(nèi)容,使學(xué)生感到這部分內(nèi)容是很重要的,后面都要用的,學(xué)生就會(huì)很重視,同時(shí)讓學(xué)生在學(xué)習(xí)前面內(nèi)容時(shí)先初步了解后面的內(nèi)容,在后面學(xué)到有關(guān)知識(shí)時(shí)發(fā)現(xiàn)只是在已學(xué)的知識(shí)基礎(chǔ)上再加一點(diǎn),學(xué)生就不會(huì)感到很難。而在學(xué)習(xí)數(shù)組的十字鏈表、樹(shù)的孩子鏈表、圖的鄰接表表示法、有向圖的十字鏈表、無(wú)向圖的鄰接多重表、哈希表處理沖突的鏈地址法時(shí),不時(shí)地用前面熟悉的結(jié)構(gòu)來(lái)類比,指出其異同點(diǎn),從而把看起來(lái)聯(lián)系不緊密的內(nèi)容串起來(lái),形成一個(gè)完整的概念,這樣學(xué)生對(duì)基本內(nèi)容的內(nèi)在聯(lián)系就能深刻理解。 又如,兩個(gè)有序表的歸并,從兩個(gè)有序線性表的歸并的算法思想開(kāi)始,教材中許多問(wèn)題都可以用兩個(gè)有序表的歸并的算法思想來(lái)解決。比如,兩個(gè)順序有序表的歸并、兩個(gè)有序單鏈表的歸并,集合的交和并運(yùn)算、多項(xiàng)式的加與減、壓縮矩陣的三元組表示的矩陣加和減運(yùn)算、歸并排序等。在講解這一系列問(wèn)題時(shí)注重前后聯(lián)系、預(yù)習(xí)和總結(jié),取得良好的教學(xué)效果。 再如,講解查找這一章內(nèi)容的過(guò)程,事實(shí)上是對(duì)前面幾章的總復(fù)習(xí),例如從順序查找復(fù)習(xí)線性表,包括兩種存儲(chǔ)結(jié)構(gòu)、線性表的基本操作、時(shí)間復(fù)雜度等內(nèi)容;從折半查找復(fù)習(xí)遞歸算法、二叉樹(shù);從哈希查找的學(xué)習(xí)加深多個(gè)單鏈表的應(yīng)用。查找既是一種操作又是一種數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)的組織采用不同的數(shù)據(jù)結(jié)構(gòu),可以用不同的查找方法進(jìn)行查找。通過(guò)這樣方式的講解,學(xué)生就明白查找這個(gè)數(shù)據(jù)結(jié)構(gòu)為什么是最后講的一個(gè)數(shù)據(jù)結(jié)構(gòu),一方面它綜合了前幾章的內(nèi)容,另一方面,它又是對(duì)前幾章的總結(jié)與提高,至此學(xué)生對(duì)全書(shū)的內(nèi)容有了比較全面、深刻的理解,一些原來(lái)有些模糊的概念變得清晰。 4結(jié)束語(yǔ) 筆者通過(guò)在“數(shù)據(jù)結(jié)構(gòu)”課程的教學(xué)過(guò)程中注意承前啟后,不斷總結(jié),把課程中各章內(nèi)容、每章節(jié)之間的內(nèi)容串起來(lái),教會(huì)學(xué)生的不僅是課程的具體內(nèi)容,更是讓學(xué)生學(xué)會(huì)一種學(xué)習(xí)和思考的方法,善于利用自己已經(jīng)掌握的知識(shí)來(lái)解決新問(wèn)題,學(xué)生學(xué)習(xí)“數(shù)據(jù)結(jié)構(gòu)”不再覺(jué)得難。同樣在學(xué)習(xí)其他課程時(shí)也可以借鑒此方法。 參考文獻(xiàn): [1] 嚴(yán)蔚敏, 吳偉民. 數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)[M]. 北京:清華大學(xué)出版社,2001. [2] 嚴(yán)蔚敏, 吳偉民. 數(shù)據(jù)結(jié)構(gòu)題集[M]. 北京:清華大學(xué)出版社,2001. [3] 唐策善, 李龍澍, 黃劉生. 數(shù)據(jù)結(jié)構(gòu)—用C語(yǔ)言描述[M]. 北京:高等教育出版社,1995. [4] 揭安全, 李云清, 楊慶紅等. “數(shù)據(jù)結(jié)構(gòu)”課程教學(xué)改革與創(chuàng)新[J]. 計(jì)算機(jī)教育,2008,(10):132-133.