我們以上面的程序?yàn)榛A(chǔ),但為了我們方便學(xué)習(xí)刪除我們休整結(jié)構(gòu)體為
struct test
{
int number;
float socre;
test *next;
};
number為的編號每一個節(jié)點(diǎn)的。
刪除的我就不多說了,里面重要部分有注解。
特別注意deletel函數(shù)的參數(shù)意義,指針的引用在這里很重要,如果只是指針,或者只是應(yīng)用都是不行的,為什么仔細(xì)思考,很多知名的教材在這一問題上都很模糊,而且很多書還有錯誤,程序不錯,但思路是錯的,我這里特別不說,請大家仔細(xì)閱讀程序,如果還是有問題,可以回此帖,我會回答的。 來源:www.examda.com
完整代碼如下:
#include
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//創(chuàng)建一個全局的引導(dǎo)進(jìn)入鏈表的指針
test *create()
{
test *ls;//節(jié)點(diǎn)指針
test *le;//鏈尾指針
ls = new test;//把ls指向動態(tài)開辟的堆內(nèi)存地址
cin>>ls->number>>ls->socre;
head=NULL;//進(jìn)入的時候先不設(shè)置head指針指向任何地址,因?yàn)椴恢朗欠褚簧蟻砭洼斎雗ull跳出程序
le=ls;//把鏈尾指針設(shè)置成剛剛動態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個節(jié)點(diǎn)的位置
while(ls->number!=0)//創(chuàng)建循環(huán)條件為ls->number的值不是null,用于循環(huán)添加節(jié)點(diǎn)
{
if(head==NULL)//判斷是否是第一次進(jìn)入循環(huán)
{
head=ls;//如果是第一次進(jìn)入循環(huán),那么把引導(dǎo)進(jìn)入鏈表的指針指向第一次動態(tài)開辟的堆內(nèi)存地址
}
else
{
le->next=ls;//如果不是第一次進(jìn)入那么就把上一次的鏈尾指針的le->next指向上一次循環(huán)結(jié)束前動態(tài)創(chuàng)建的堆內(nèi)存地址
}
le=ls;//設(shè)置鏈尾指針為當(dāng)前循環(huán)中的節(jié)點(diǎn)指針,用于下一次進(jìn)入循環(huán)的時候把上一次的節(jié)點(diǎn)的next指向上一次循環(huán)結(jié)束前動態(tài)創(chuàng)建的堆內(nèi)存地址
ls=new test;//為下一個節(jié)點(diǎn)在堆內(nèi)存中動態(tài)開辟空間
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把鏈尾指針的next設(shè)置為空,因?yàn)椴还苋绾窝h(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時候不至于死循環(huán)
delete ls;//當(dāng)結(jié)束的時候最后一個動態(tài)開辟的內(nèi)存是無效的,所以必須清除掉
return head;//返回鏈?zhǔn)字羔?
}
void showl(test *head)
{
cout<<"鏈?zhǔn)字羔?"< <
while(head)//以內(nèi)存指向?yàn)閚ull為條件循環(huán)顯示先前輸入的內(nèi)容 來源:www.examda.com
{
cout< number<<"|"< socre<
head=head->next;
}
}