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