正在閱讀:C/C++中結(jié)構(gòu)體(struct)知識點強化C/C++中結(jié)構(gòu)體(struct)知識點強化

2005-03-07 15:12 出處:PConline 作者:管寧 責(zé)任編輯:xietaoming

  在上一個教程中我們已經(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)。

鍵盤也能翻頁,試試“← →”鍵
302 Found

302 Found


Powered by Tengine
tengine