在上一個教程中我們已經(jīng)簡單的闡述了什么是結(jié)構(gòu)體了,為了進一部的學(xué)習(xí)結(jié)構(gòu)體這一重要的知識點,我們今天來學(xué)習(xí)一下鏈表結(jié)構(gòu)。
結(jié)構(gòu)體可以看做是一種自定義的數(shù)據(jù)類型,它還有一個很重要的特性,就是結(jié)構(gòu)體可以相互嵌套使用,但也是有條件的,結(jié)構(gòu)體可以包含結(jié)構(gòu)體指針,但絕對不能在結(jié)構(gòu)體中包含結(jié)構(gòu)體變量。 struct test { char name[10]; float socre; test *next; };//這樣是正確的! struct test { char name[10]; float socre; test next; };//這樣是錯誤的! 利用結(jié)構(gòu)體的這點特殊特性,我們就可以自己生成一個環(huán)環(huán)相套的一種射線結(jié)構(gòu),一個指向另一個。
鏈表的學(xué)習(xí)不像想象的那么那么容易,很多人學(xué)習(xí)到這里的時候都會碰到困難,很多人也因此而放棄了學(xué)習(xí),在這里我說,一定不能放棄,對應(yīng)它的學(xué)習(xí)我們要進行分解式學(xué)習(xí),方法很重要,理解需要時間,不必要把自己逼迫的那么緊,學(xué)習(xí)前你也得做一些最基本的準(zhǔn)備工作,你必須具備對堆內(nèi)存的基本知識的了解,還有就是對結(jié)構(gòu)體的基本認(rèn)識,有了這兩個重要的條件,再進行分解式學(xué)習(xí)就可以比較輕松的掌握這一節(jié)內(nèi)容的難點。
下面我們給出一個完整的創(chuàng)建鏈表的程序,不管看的懂看不懂希望讀者先認(rèn)真看一下,想一想,看不懂沒有關(guān)系,因為我下面會有分解式的教程,但之前的基本思考一定要做,要不即使我分解了你也是無從理解的。
代碼如下,我在重要部分做了注解: #include <iostream> using namespace std; struct test { char name[10]; float socre; test *next; }; test *head;//創(chuàng)建一個全局的引導(dǎo)進入鏈表的指針 test *create() { test *ls;//節(jié)點指針 test *le;//鏈尾指針 ls = new test;//把ls指向動態(tài)開辟的堆內(nèi)存地址 cin>>ls->name>>ls->socre; head=NULL;//進入的時候先不設(shè)置head指針指向任何地址,因為不知道是否一上來就輸入null跳出程序 le=ls;//把鏈尾指針設(shè)置成剛剛動態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個節(jié)點的位置 while(strcmp(ls->name,"null")!=0)//創(chuàng)建循環(huán)條件為ls->name的值不是null,用于循環(huán)添加節(jié)點 { if(head==NULL)//判斷是否是第一次進入循環(huán) { head=ls;//如果是第一次進入循環(huán),那么把引導(dǎo)進入鏈表的指針指向第一次動態(tài)開辟的堆內(nèi)存地址 } else { le->next=ls;//如果不是第一次進入那么就把上一次的鏈尾指針的le->next指向上一次循環(huán)結(jié)束前動態(tài)創(chuàng)建的堆內(nèi)存地址 } le=ls;//設(shè)置鏈尾指針為當(dāng)前循環(huán)中的節(jié)點指針,用于下一次進入循環(huán)的時候把上一次的節(jié)點的next指向上一次循環(huán)結(jié)束前動態(tài)創(chuàng)建的堆內(nèi)存地址 ls=new test;//為下一個節(jié)點在堆內(nèi)存中動態(tài)開辟空間 cin>>ls->name>>ls->socre; } le->next=NULL;//把鏈尾指針的next設(shè)置為空,因為不管如何循環(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時候不至于死循環(huán) delete ls;//當(dāng)結(jié)束的時候最后一個動態(tài)開辟的內(nèi)存是無效的,所以必須清除掉 return head;//返回鏈?zhǔn)字羔?nbsp; } void showl(test *head) { cout<<"鏈?zhǔn)字羔?"<<head<<endl; while(head)//以內(nèi)存指向為null為條件循環(huán)顯示先前輸入的內(nèi)容 { cout<<head->name<<"|"<<head->socre<<endl; head=head->next; } } void main() { showl(create()); cin.get(); cin.get(); } 上面的代碼我們是要達到一個目的:就是要存儲你輸入的人名和他們的得分,并且以鏈狀結(jié)構(gòu)把它們組合成一個鏈狀結(jié)構(gòu)。
|