本文为【C/C++中结构体(struct)知识点强化】的汉字拼音对照版显示拼音
在zai上shang一yi个ge教jiao程cheng中zhong我wo们men已yi经jing简jian单dan的de阐chan述shu了le什shen么me是shi结jie构gou体ti了le,为wei了le进jin一yi部bu的de学xue习xi结jie构gou体ti这zhe一yi重chong要yao的de知zhi识shi点dian,我wo们men今jin天tian来lai学xue习xi一yi下xia链lian表biao结jie构gou。 结jie构gou体ti可ke以yi看kan做zuo是shi一yi种zhong自zi定ding义yi的de数shu据ju类lei型xing,它ta还huan有you一yi个ge很hen重chong要yao的de特te性xing,就jiu是shi结jie构gou体ti可ke以yi相xiang互hu嵌qian套tao使shi用yong,但dan也ye是shi有you条tiao件jian的de,结jie构gou体ti可ke以yi包bao含han结jie构gou体ti指zhi针zhen,但dan绝jue对dui不bu能neng在zai结jie构gou体ti中zhong包bao含han结jie构gou体ti变bian量liang。strUCt test
{
char name[10];
float socre;
test *next;
};//这zhe样yang是shi正zheng确que的de!
struct test
{
char name[10];
float socre;
test next;
};//这zhe样yang是shi错cuo误wu的de!
利li用yong结jie构gou体ti的de这zhe点dian非fei凡fan特te性xing,我wo们men就jiu可ke以yi自zi己ji生sheng成cheng一yi个ge环huan环huan相xiang套tao的de一yi种zhong射she线xian结jie构gou,一yi个ge指zhi向xiang另ling一yi个ge。
链lian表biao的de学xue习xi不bu像xiang想xiang象xiang的de那na么me那na么me轻qing易yi,很hen多duo人ren学xue习xi到dao这zhe里li的de时shi候hou都dou会hui碰peng到dao困kun难nan,很hen多duo人ren也ye因yin此ci而er放fang弃qi了le学xue习xi,在zai这zhe里li我wo说shuo,一yi定ding不bu能neng放fang弃qi,对dui应ying它ta的de学xue习xi我wo们men要yao进jin行xing分fen解jie式shi学xue习xi,方fang法fa很hen重chong要yao,理li解jie需xu要yao时shi间jian,不bu必bi要yao把ba自zi己ji逼bi迫po的de那na么me紧jin,学xue习xi前qian你ni也ye得de做zuo一yi些xie最zui基ji本ben的de预yu备bei工gong作zuo,你ni必bi须xu具ju备bei对dui堆dui内nei存cun的de基ji本ben知zhi识shi的de了le解jie,还huan有you就jiu是shi对dui结jie构gou体ti的de基ji本ben熟shu悉xi,有you了le这zhe两liang个ge重chong要yao的de条tiao件jian,再zai进jin行xing分fen解jie式shi学xue习xi就jiu可ke以yi比bi较jiao轻qing松song的de把ba握wo这zhe一yi节jie内nei容rong的de难nan点dian。
下xia面mian我wo们men给gei出chu一yi个ge完wan整zheng的de创chuang建jian链lian表biao的de程cheng序xu,不bu管guan看kan的de懂dong看kan不bu懂dong希xi望wang读du者zhe先xian认ren真zhen看kan一yi下xia,想xiang一yi想xiang,看kan不bu懂dong没mei有you关guan系xi,因yin为wei我wo下xia面mian会hui有you分fen解jie式shi的de教jiao程cheng,但dan之zhi前qian的de基ji本ben思si考kao一yi定ding要yao做zuo,要yao不bu即ji使shi我wo分fen解jie了le你ni也ye是shi无wu从cong理li解jie的de。
代dai码ma如ru下xia,我wo在zai重chong要yao部bu分fen做zuo了le注zhu解jie:
#include <iostream>
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//创chuang建jian一yi个ge全quan局ju的de引yin导dao进jin入ru链lian表biao的de指zhi针zhen
test *create()
{
test *ls;//节jie点dian指zhi针zhen
test *le;//链lian尾yi指zhi针zhen
ls = new test;//把bals指zhi向xiang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
cin>>ls->name>>ls->socre;
head=NULL;//进jin入ru的de时shi候hou先xian不bu设she置zhihead指zhi针zhen指zhi向xiang任ren何he地di址zhi,因yin为wei不bu知zhi道dao是shi否fou一yi上shang来lai就jiu输shu入runull跳tiao出chu程cheng序xu
le=ls;//把ba链lian尾yi指zhi针zhen设she置zhi成cheng刚gang刚gang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi,用yong于yu等deng下xia设she置zhile->next,也ye就jiu是shi下xia一yi个ge节jie点dian的de位wei置zhi
while(strcmp(ls->name,"null")!=0)//创chuang建jian循xun环huan条tiao件jian为weils->name的de值zhi不bu是shinull,用yong于yu循xun环huan添tian加jia节jie点dian
{
if(head==NULL)//判pan定ding是shi否fou是shi第di一yi次ci进jin入ru循xun环huan
{
head=ls;//假jia如ru是shi第di一yi次ci进jin入ru循xun环huan,那na么me把ba引yin导dao进jin入ru链lian表biao的de指zhi针zhen指zhi向xiang第di一yi次ci动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
}
else
{
le->next=ls;//假jia如ru不bu是shi第di一yi次ci进jin入ru那na么me就jiu把ba上shang一yi次ci的de链lian尾yi指zhi针zhen的dele->next指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
}
le=ls;//设she置zhi链lian尾yi指zhi针zhen为wei当dang前qian循xun环huan中zhong的de节jie点dian指zhi针zhen,用yong于yu下xia一yi次ci进jin入ru循xun环huan的de时shi候hou把ba上shang一yi次ci的de节jie点dian的denext指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
ls=new test;//为wei下xia一yi个ge节jie点dian在zai堆dui内nei存cun中zhong动dong态tai开kai辟pi空kong间jian
cin>>ls->name>>ls->socre;
}
le->next=NULL;//把ba链lian尾yi指zhi针zhen的denext设she置zhi为wei空kong,因yin为wei不bu管guan如ru何he循xun环huan总zong是shi要yao结jie束shu的de,设she置zhi为wei空kong才cai能neng够gou在zai循xun环huan显xian链lian表biao的de时shi候hou不bu至zhi于yu死si循xun环huan
delete ls;//当dang结jie束shu的de时shi候hou最zui后hou一yi个ge动dong态tai开kai辟pi的de内nei存cun是shi无wu效xiao的de,所suo以yi必bi须xu清qing除chu掉diao
return head;//返fan回hui链lian首shou指zhi针zhen
}
void showl(test *head)
{
cout<<"链lian首shou指zhi针zhen:"<<head<<endl;
while(head)//以yi内nei存cun指zhi向xiang为weinull为wei条tiao件jian循xun环huan显xian示shi先xian前qian输shu入ru的de内nei容rong
{
cout<<head->name<<""<<head->socre<<endl;
head=head->next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
上shang面mian的de代dai码ma我wo们men是shi要yao达da到dao一yi个ge目mu的de:就jiu是shi要yao存cun储chu你ni输shu入ru的de人ren名ming和he他ta们men的de得de分fen,并bing且qie以yi链lian状zhuang结jie构gou把ba它ta们men组zu合he成cheng一yi个ge链lian状zhuang结jie构gou。
程cheng序xu种zhong有you两liang个ge组zu成cheng部bu分fen
test *create() 和he
void showl(test *head)
这zhe两liang个ge函han数shu,create是shi用yong来lai创chuang建jian链lian表biao的de ,showl是shi用yong来lai显xian示shi链lian表biao的de。
create函han数shu的de返fan回hui类lei型xing是shi一yi个ge结jie构gou体ti指zhi针zhen,在zai程cheng序xu调tiao用yong的de时shi候hou我wo们men用yong了leshowl(create());,而er不bu用yong引yin用yong的de目mu的de原yuan因yin是shi引yin导dao指zhi针zhen是shi一yi个ge全quan局ju指zhi针zhen变bian量liang,我wo们men不bu能neng在zaishowl()内nei改gai变bian它ta,因yin为weishowl()函han数shu内nei有you一yi个ge移yi动dong操cao作zuohead=head->next;,假jia如ru是shi引yin用yong的de话hua我wo们men就jiu破po坏huai了lehead指zhi针zhen的de位wei置zhi,以yi至zhi于yu我wo们men再zai也ye无wu法fa找zhao会hui首shou地di址zhi的de位wei置zhi了le。
下xia面mian我wo们men来lai分fen解jie整zheng个ge程cheng序xu,以yi一yi个ge初chu学xue者zhe的de思si想xiang来lai思si考kao整zheng个ge程cheng序xu,由you浅qian入ru深shen的de逐zhu步bu解jie释shi。
首shou先xian,我wo们men写xie这zhe个ge程cheng序xu,要yao考kao虑lv到dao由you于yu是shi一yi个ge链lian表biao结jie构gou,我wo们men不bu可ke能neng知zhi道dao它ta的de大da小xiao到dao底di是shi多duo大da,这zhe个ge问wen题ti我wo们men可ke以yi用yong动dong态tai开kai辟pi堆dui内nei存cun来lai解jie决jue,因yin为wei堆dui内nei存cun在zai程cheng序xu结jie束shu前qian始shi终zhong是shi有you效xiao的de,不bu受shou函han数shu栈zhan空kong间jian生sheng命ming期qi的de限xian制zhi,但dan要yao注zhu重chong的de是shi我wo们men必bi须xu有you一yi个ge指zhi针zhen变bian量liang来lai存cun储chu这zhe一yi链lian状zhuang结jie构gou的de进jin入ru地di址zhi,而er在zai函han数shu内nei部bu来lai建jian立li这zhe一yi指zhi针zhen变bian量liang显xian然ran是shi不bu合he适shi的de,因yin为wei函han数shu一yi旦dan退tui出chu,这zhe个ge指zhi针zhen变bian量liang也ye随sui之zhi失shi效xiao,所suo以yi我wo们men在zai程cheng序xu的de开kai始shi声sheng明ming了le一yi个ge全quan局ju指zhi针zhen变bian量liang。
test *head;//创chuang建jian一yi个ge全quan局ju的de引yin导dao进jin入ru链lian表biao的de指zhi针zhen
好hao解jie决jue了le这zhe两liang个ge问wen题ti,我wo们men接jie下xia去qu思si考kao
有you输shu入ru就jiu必bi然ran有you输shu出chu,由you于yu输shu出chu函han数shu和he输shu入ru函han数shu是shi相xiang对dui独du立li的de,为wei了le不bu断duan测ce试shi程cheng序xu的de正zheng确que性xing好hao调tiao试shi我wo们men先xian写xie好hao输shu出chu函han数shu和hemain函han数shu捏nie的de调tiao用yong,创chuang建jian函han数shu我wo们men先xian约yue定ding好hao名ming为weicreate。
我wo们men先xian写xie出chu如ru下xia的de代dai码ma:
#include <iostream>
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//创chuang建jian一yi个ge全quan局ju的de引yin导dao进jin入ru链lian表biao的de指zhi针zhen
test *create()
{
return head;//返fan回hui链lian首shou指zhi针zhen
}
void showl(test *head)
{
cout<<"链lian首shou指zhi针zhen:"<<head<<endl;
while(head)//以yi内nei存cun指zhi向xiang为weinull为wei条tiao件jian循xun环huan显xian示shi先xian前qian输shu入ru的de内nei容rong
{
cout<<head->name<<""<<head->socre<<endl;
head=head->next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
程cheng序xu写xie到dao这zhe里li,基ji本ben形xing态tai已yi经jing出chu来lai,输shu入ru和he调tiao用yong我wo们men已yi经jing有you了le。
下xia面mian我wo们men来lai解jie决jue输shu入ru问wen题ti,链lian表biao的de实shi现xian我wo们men是shi通tong过guo循xun环huan输shu入ru来lai实shi现xian的de,既ji然ran是shi循xun环huan我wo们men就jiu一yi定ding得de考kao虑lv终zhong止zhi循xun环huan的de条tiao件jian,避bi免mian死si循xun环huan和he无wu效xiao循xun环huan的de发fa生sheng。
在zaicreate()函han数shu内nei部bu我wo们men先xian写xie成cheng这zhe样yang:
test *create()
{
test *ls;//节jie点dian指zhi针zhen
test *le;//链lian尾yi指zhi针zhen
ls = new test;//把bals指zhi向xiang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
cin>>ls->name>>ls->socre;
head=NULL;//进jin入ru的de时shi候hou先xian不bu设she置zhihead指zhi针zhen指zhi向xiang任ren何he地di址zhi,因yin为wei不bu知zhi道dao是shi否fou一yi上shang来lai就jiu输shu入runull跳tiao出chu程cheng序xu
le=ls;//把ba链lian尾yi指zhi针zhen设she置zhi成cheng刚gang刚gang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi,用yong于yu等deng下xia设she置zhile->next,也ye就jiu是shi下xia一yi个ge节jie点dian的de位wei置zhi
le->next=NULL;//把ba链lian尾yi指zhi针zhen的denext设she置zhi为wei空kong,因yin为wei不bu管guan如ru何he循xun环huan总zong是shi要yao结jie束shu的de,设she置zhi为wei空kong才cai能neng够gou在zai循xun环huan显xian链lian表biao的de时shi候hou不bu至zhi于yu死si循xun环huan
delete ls;//当dang结jie束shu的de时shi候hou最zui后hou一yi个ge动dong态tai开kai辟pi的de内nei存cun是shi无wu效xiao的de,所suo以yi必bi须xu清qing除chu掉diao
return head;//返fan回hui链lian首shou指zhi针zhen
}
在zai循xun环huan创chuang建jian之zhi前qian我wo们men必bi须xu考kao虑lv一yi个ge都dou不bu输shu入ru的de情qing况kuang。
程cheng序xu一yi单dan进jin入rucreate函han数shu我wo们men首shou先xian必bi然ran要yao创chuang建jian一yi个ge节jie点dian,我wo们men先xian创chuang建jian一yi个ge节jie点dian指zhi针zhen,后hou把ba者zhe个ge节jie点dian指zhi针zhen指zhi向xiang到dao动dong态tai开kai辟pi的detest类lei型xing的de动dong态tai内nei存cun地di址zhi位wei置zhi上shang。
所suo以yi我wo们men有you了le
test *ls;
ls = new test;
程cheng序xu既ji然ran是shi循xun环huan输shu入ru,而er结jie构gou成cheng员yuantest *next又you是shi用yong来lai存cun储chu下xia一yi个ge接jie点dian的de内nei存cun地di址zhi的de,每mei次ci循xun环huan我wo们men又you要yao动dong态tai创chuang建jian一yi个ge新xin的de内nei存cun空kong间jian,所suo以yi我wo们men必bi须xu要yao有you一yi个ge指zhi针zhen来lai存cun储chu上shang一yi次ci循xun环huan动dong态tai开kai辟pi的de内nei存cun地di址zhi,于yu是shi就jiu有you了le
test *le;
接jie下xia来lai在zai进jin入ru循xun环huan前qian我wo们men要yao创chuang建jian链lian表biao的de第di一yi个ge节jie点dian,第di一yi个ge节jie点dian必bi然ran是shi在zai循xun环huan外wai创chuang建jian,于yu是shi就jiu有you了le
cin>>ls->name>>ls->socre;
程cheng序xu执zhi行xing者zhe的de情qing况kuang是shi位wei置zhi的de,所suo以yi我wo们men必bi然ran要yao考kao虑lv,一yi上shang来lai就jiu不bu想xiang继ji续xu运yun行xing程cheng序xu的de情qing况kuang,所suo以yi我wo们men一yi开kai始shi先xian把bahead引yin导dao指zhi针zhen设she置zhi为wei不bu指zhi向xiang任ren何he地di址zhi也ye就jiu是shi
head=NULL;
为wei了le符fu合hele也ye就jiu是shi链lian尾yi指zhi针zhen的de设she计ji思si路lu,我wo们men在zai循xun环huan前qian一yi定ding要yao保bao存cun刚gang刚gang动dong态tai开kai辟pi的de内nei存cun地di址zhi,好hao在zai下xia一yi次ci循xun环huan的de时shi候hou设she置zhi上shang一yi个ge节jie点dian中zhong的denext成cheng员yuan指zhi向xiang,于yu是shi我wo们men便bian有you了le:
le=ls;
为wei了le实shi现xian循xun环huan输shu入ru我wo们men又you了le下xia面mian的de代dai码ma:
while(strcmp(ls->name,"null")!=0)
{
if(head==NULL)
{
head=ls;
}
else
{
le->next=ls;
}
le=ls;
ls=new test;
cin>>ls->name>>ls->socre;
}
程cheng序xu是shi循xun环huan必bi然ran要yao有you终zhong止zhi循xun环huan的de条tiao件jian,所suo以yi我wo们men的de循xun环huan条tiao件jian是shi:
while(strcmp(ls->name,"null")!=0)
输shu入ru的de名ming字zi是shinull的de时shi候hou就jiu停ting止zhi循xun环huan。
为wei了le保bao证zheng第di一yi次ci进jin入ru循xun环huan,也ye就jiu是shi在zai循xun环huan内nei预yu备bei创chuang建jian第di二er个ge节jie点dian前qian,设she置zhi引yin导dao指zhi针zhen的de指zhi向xiang我wo们men有you了le如ru下xia的de判pan定ding代dai码ma:
if(head==NULL)
{
head=ls;
}
else
{
le->next=ls;
}
代dai码ma中zhong的deelse条tiao件jian是shi为wei了le设she置zhi前qian一yi个ge节jie点diannext指zhi向xiang而er写xie的de,这zhe点dian我wo们men记ji住zhu先xian看kan下xia面mian的de代dai码ma,稍shao后hou大da家jia回hui过guo头tou想xiang就jiu明ming白bai了le
le=ls;
ls=new test;
cin>>ls->name>>ls->socre;
le=ls;这zhe么me写xie就jiu是shi为wei了le保bao存cun上shang一yi次ci循xun环huan指zhi针zhen的de位wei置zhi而er设she的de,正zheng是shi为wei了le上shang面mian的deelse代dai码ma而er做zuo的de预yu先xian保bao留liu
ls=new test;
cin>>ls->name>>ls->socre;
这zhe两liang行xing代dai码ma的de意yi思si就jiu是shi继ji续xu开kai辟pi下xia一yi个ge节jie点dian空kong间jian,和he输shu入ru节jie点dian内nei容rong!
循xun环huan一yi旦dan结jie束shu也ye就jiu结jie束shu了le程cheng序xu,为wei了le保bao持chi程cheng序xu不bu出chu错cuo,也ye就jiu是shi最zui后hou一yi个ge节jie点dian的denext成cheng员yuan指zhi向xiang为wei空kong我wo们men有you了le下xia面mian的de代dai码ma
le->next=NULL;
程cheng序xu的de思si路lu始shi终zhong是shi以yi先xian开kai辟pi后hou判pan定ding为wei思si路lu的de,所suo以yi到dao最zui后hou一yi个ge不bu成cheng立li的de时shi候hou总zong会hui有you一yi个ge多duo开kai辟pi的de内nei存cun空kong间jian,为wei了le删shan除chu掉diao它ta,我wo们men有you了le下xia面mian的de代dai码ma
delete ls;
程cheng序xu到dao最zui后hou由you于yu返fan回huihead指zhi针zhen
return head;
显xian示shi链lian表biao的de函han数shu没mei有you什shen么me太tai多duo非fei凡fan的de也ye只zhi需xu要yao注zhu重chong下xia面mian这zhe样yang就jiu可ke以yi了le!
head=head->next;
我wo们men之zhi所suo以yi不bu用yonghead+=1;来lai写xie就jiu是shi因yin为wei链lian表biao是shi我wo们men动dong态tai开kai辟pi的de,而er每mei一yi个ge节jie点dian的de位wei置zhi并bing不bu是shi相xiang连lian的de,next成cheng员yuan指zhi针zhen的de意yi义yi也ye就jiu是shi下xia一yi个ge节jie点dian的de内nei存cun地di址zhi。
到dao这zhe里li整zheng个ge创chuang建jian函han数shu的de设she计ji思si路lu也ye都dou说shuo完wan了le,笔bi者zhe不bu一yi定ding说shuo的de很hen好hao,但dan基ji本ben思si路lu是shi这zhe样yang的de,希xi望wang读du者zhe多duo思si考kao,多duo对dui比bi,相xiang信xin此ci教jiao程cheng还huan是shi对dui大da家jia有you帮bang助zhu的de,程cheng序xu设she计ji就jiu是shi利li用yong逐zhu步bu思si考kao的de方fang式shi进jin行xing的de,写xie好hao的de代dai码ma往wang往wang直zhi接jie看kan看kan不bu懂dong就jiu是shi因yin为wei中zhong间jian的de细xi节jie并bing不bu是shi一yi次ci都dou能neng够gou想xiang到dao的de。
下xia面mian我wo们men来lai说shuo一yi下xia链lian表biao节jie点dian的de删shan除chu!
我wo们men以yi上shang面mian的de程cheng序xu为wei基ji础chu,但dan为wei了le我wo们men方fang便bian学xue习xi删shan除chu我wo们men休xiu整zheng结jie构gou体ti为wei
struct test
{
int number;
float socre;
test *next;
};
number为wei唯wei一yi的de编bian号hao每mei一yi个ge节jie点dian的de。
删shan除chu的de我wo就jiu不bu多duo说shuo了le,里li面mian重chong要yao部bu分fen有you注zhu解jie。
非fei凡fan注zhu重chongdeletel函han数shu的de参shen数shu意yi义yi,指zhi针zhen的de引yin用yong在zai这zhe里li很hen重chong要yao,假jia如ru只zhi是shi指zhi针zhen,或huo者zhe只zhi是shi应ying用yong都dou是shi不bu行xing的de,为wei什shen么me仔zai细xi思si考kao,很hen多duo知zhi名ming的de教jiao材cai在zai这zhe一yi问wen题ti上shang都dou很hen模mo糊hu,而er且qie很hen多duo书shu还huan有you错cuo误wu,程cheng序xu不bu错cuo,但dan思si路lu是shi错cuo的de,我wo这zhe里li非fei凡fan不bu说shuo,请qing大da家jia仔zai细xi阅yue读du程cheng序xu,假jia如ru还huan是shi有you问wen题ti,可ke以yi回hui此ci帖tie,我wo会hui回hui答da的de。
完wan整zheng代dai码ma如ru下xia:
#include <iostream>
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//创chuang建jian一yi个ge全quan局ju的de引yin导dao进jin入ru链lian表biao的de指zhi针zhen
test *create()
{
test *ls;//节jie点dian指zhi针zhen
test *le;//链lian尾yi指zhi针zhen
ls = new test;//把bals指zhi向xiang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
cin>>ls->number>>ls->socre;
head=NULL;//进jin入ru的de时shi候hou先xian不bu设she置zhihead指zhi针zhen指zhi向xiang任ren何he地di址zhi,因yin为wei不bu知zhi道dao是shi否fou一yi上shang来lai就jiu输shu入runull跳tiao出chu程cheng序xu
le=ls;//把ba链lian尾yi指zhi针zhen设she置zhi成cheng刚gang刚gang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi,用yong于yu等deng下xia设she置zhile->next,也ye就jiu是shi下xia一yi个ge节jie点dian的de位wei置zhi
while(ls->number!=0)//创chuang建jian循xun环huan条tiao件jian为weils->number的de值zhi不bu是shinull,用yong于yu循xun环huan添tian加jia节jie点dian
{
if(head==NULL)//判pan定ding是shi否fou是shi第di一yi次ci进jin入ru循xun环huan
{
head=ls;//假jia如ru是shi第di一yi次ci进jin入ru循xun环huan,那na么me把ba引yin导dao进jin入ru链lian表biao的de指zhi针zhen指zhi向xiang第di一yi次ci动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
}
else
{
le->next=ls;//假jia如ru不bu是shi第di一yi次ci进jin入ru那na么me就jiu把ba上shang一yi次ci的de链lian尾yi指zhi针zhen的dele->next指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
}
le=ls;//设she置zhi链lian尾yi指zhi针zhen为wei当dang前qian循xun环huan中zhong的de节jie点dian指zhi针zhen,用yong于yu下xia一yi次ci进jin入ru循xun环huan的de时shi候hou把ba上shang一yi次ci的de节jie点dian的denext指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
ls=new test;//为wei下xia一yi个ge节jie点dian在zai堆dui内nei存cun中zhong动dong态tai开kai辟pi空kong间jian
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把ba链lian尾yi指zhi针zhen的denext设she置zhi为wei空kong,因yin为wei不bu管guan如ru何he循xun环huan总zong是shi要yao结jie束shu的de,设she置zhi为wei空kong才cai能neng够gou在zai循xun环huan显xian链lian表biao的de时shi候hou不bu至zhi于yu死si循xun环huan
delete ls;//当dang结jie束shu的de时shi候hou最zui后hou一yi个ge动dong态tai开kai辟pi的de内nei存cun是shi无wu效xiao的de,所suo以yi必bi须xu清qing除chu掉diao
return head;//返fan回hui链lian首shou指zhi针zhen
}
void showl(test *head)
{
cout<<"链lian首shou指zhi针zhen:"<<head<<endl;
while(head)//以yi内nei存cun指zhi向xiang为weinull为wei条tiao件jian循xun环huan显xian示shi先xian前qian输shu入ru的de内nei容rong
{
cout<<head->number<<""<<head->socre<<endl;
head=head->next;
}
}
void deletel(test *&head,int number)//这zhe里li假jia如ru参shen数shu换huan成chengtest *head,意yi义yi就jiu完wan全quan不bu同tong了le,head变bian成cheng了le复fu制zhi而er不bu是shi原yuan有you链lian上shang操cao作zuo了le,非fei凡fan注zhu重chong,很hen多duo书shu上shang都dou不bu对dui这zhe里li
{
test *point;//判pan定ding链lian表biao是shi否fou为wei空kong
if(head==NULL)
{
cout<<"链lian表biao为wei空kong,不bu能neng进jin行xing删shan除chu工gong作zuo!";
return;
}
if(head->number==number)//判pan删shan除chu的de节jie点dian是shi否fou为wei首shou节jie点dian
{
point=head;
cout<<"删shan除chu点dian是shi链lian表biao第di一yi个ge节jie点dian位wei置zhi!";
head=head->next;//重chong新xin设she置zhi引yin导dao指zhi针zhen
delete point;
return;
}
test *fp=head;//保bao存cun连lian首shou指zhi针zhen
for(test *&mp=head;mp->next;mp=mp->next)
{
if(mp->next->number==number)
{
point=mp->next;
mp->next=point->next;
delete point;
head=fp;//由you于yuhead的de不bu断duan移yi动dong丢diu失shi了lehead,把ba进jin入ru循xun环huan前qian的dehead指zhi针zhen恢hui复fu!
return;
}
}
}
void main()
{
head=create();//调tiao用yong创chuang建jian
showl(head);
int dp;
cin>>dp;
deletel(head,dp);//调tiao用yong删shan除chu
showl(head);
cin.get();
cin.get();
}
最zui后hou我wo学xue习xi一yi下xia如ru何he在zai已yi有you的de链lian表biao上shang插cha入ru节jie点dian
我wo们men要yao考kao虑lv四si中zhong情qing况kuang,
1.链lian表biao为wei空kong!
2.插cha入ru点dian在zai首shou节jie点dian前qian
3.插cha入ru点dian找zhao不bu到dao的de情qing况kuang我wo们men设she置zhi放fang在zai最zui后hou!
4.插cha入ru点dian在zai中zhong间jian的de情qing况kuang!
今jin天tian的de程cheng序xu在zai昨zuo天tian的de基ji础chu上shang做zuo了le进jin一yi步bu的de修xiu改gai,可ke以yi避bi免mian删shan除chu点dian找zhao不bu到dao的de情qing况kuang,假jia如ru找zhao不bu到dao删shan除chu点dian就jiu退tui出chu函han数shu!
#include <iostream>
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//创chuang建jian一yi个ge全quan局ju的de引yin导dao进jin入ru链lian表biao的de指zhi针zhen
test *create()
{
test *ls;//节jie点dian指zhi针zhen
test *le;//链lian尾yi指zhi针zhen
ls = new test;//把bals指zhi向xiang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
cout<<"请qing输shu入ru第di一yi个ge节jie点diannumber和he节jie点dianscore,输shu入ru0.0跳tiao出chu函han数shu"<<endl;
cin>>ls->number>>ls->socre;
head=NULL;//进jin入ru的de时shi候hou先xian不bu设she置zhihead指zhi针zhen指zhi向xiang任ren何he地di址zhi,因yin为wei不bu知zhi道dao是shi否fou一yi上shang来lai就jiu输shu入runull跳tiao出chu程cheng序xu
le=ls;//把ba链lian尾yi指zhi针zhen设she置zhi成cheng刚gang刚gang动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi,用yong于yu等deng下xia设she置zhile->next,也ye就jiu是shi下xia一yi个ge节jie点dian的de位wei置zhi
while(ls->number!=0)//创chuang建jian循xun环huan条tiao件jian为weils->number的de值zhi不bu是shinull,用yong于yu循xun环huan添tian加jia节jie点dian
{
if(head==NULL)//判pan定ding是shi否fou是shi第di一yi次ci进jin入ru循xun环huan
{
head=ls;//假jia如ru是shi第di一yi次ci进jin入ru循xun环huan,那na么me把ba引yin导dao进jin入ru链lian表biao的de指zhi针zhen指zhi向xiang第di一yi次ci动dong态tai开kai辟pi的de堆dui内nei存cun地di址zhi
}
else
{
le->next=ls;//假jia如ru不bu是shi第di一yi次ci进jin入ru那na么me就jiu把ba上shang一yi次ci的de链lian尾yi指zhi针zhen的dele->next指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
}
le=ls;//设she置zhi链lian尾yi指zhi针zhen为wei当dang前qian循xun环huan中zhong的de节jie点dian指zhi针zhen,用yong于yu下xia一yi次ci进jin入ru循xun环huan的de时shi候hou把ba上shang一yi次ci的de节jie点dian的denext指zhi向xiang上shang一yi次ci循xun环huan结jie束shu前qian动dong态tai创chuang建jian的de堆dui内nei存cun地di址zhi
ls=new test;//为wei下xia一yi个ge节jie点dian在zai堆dui内nei存cun中zhong动dong态tai开kai辟pi空kong间jian
cout<<"请qing下xia一yi个ge节jie点diannumber和he节jie点dianscore,输shu入ru0.0跳tiao出chu函han数shu"<<endl;
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把ba链lian尾yi指zhi针zhen的denext设she置zhi为wei空kong,因yin为wei不bu管guan如ru何he循xun环huan总zong是shi要yao结jie束shu的de,设she置zhi为wei空kong才cai能neng够gou在zai循xun环huan显xian链lian表biao的de时shi候hou不bu至zhi于yu死si循xun环huan
delete ls;//当dang结jie束shu的de时shi候hou最zui后hou一yi个ge动dong态tai开kai辟pi的de内nei存cun是shi无wu效xiao的de,所suo以yi必bi须xu清qing除chu掉diao
return head;//返fan回hui链lian首shou指zhi针zhen
}
void showl(test *head)
{
cout<<"链lian首shou指zhi针zhen:"<<head<<endl;
while(head)//以yi内nei存cun指zhi向xiang为weinull为wei条tiao件jian循xun环huan显xian示shi先xian前qian输shu入ru的de内nei容rong
{
cout<<head->number<<""<<head->socre<<endl;
head=head->next;
}
}
void deletel(test *&head,int number)//这zhe里li假jia如ru参shen数shu换huan成chengtest *head,意yi义yi就jiu完wan全quan不bu同tong了le,head变bian成cheng了le复fu制zhi而er不bu是shi原yuan有you链lian上shang操cao作zuo了le,非fei凡fan注zhu重chong,很hen多duo书shu上shang都dou不bu对dui这zhe里li
{
test *point;//判pan定ding链lian表biao是shi否fou为wei空kong
if(head==NULL)
{
cout<<"链lian表biao为wei空kong,不bu能neng进jin行xing删shan除chu工gong作zuo!";
return;
}
int derror=1;//设she置zhi找zhao不bu到dao的de情qing况kuang的de条tiao件jian,预yu先xian设she置zhi为wei真zhen
test *check=head;
while(check)//利li用yong循xun环huan进jin行xing查cha找zhao
{
if (check->number==number)
{
derror=0;//条tiao件jian转zhuan为wei假jia
}
check=check->next;
}
if(derror)//假jia如ru为wei假jia就jiu跳tiao出chu函han数shu
{
return;
}
if(head->number==number)//判pan删shan除chu的de节jie点dian是shi否fou为wei首shou节jie点dian
{
point=head;
cout<<"删shan除chu点dian是shi链lian表biao第di一yi个ge节jie点dian位wei置zhi!";
head=head->next;//重chong新xin设she置zhi引yin导dao指zhi针zhen
delete point;
return;
}
test *fp=head;//保bao存cun连lian首shou指zhi针zhen
for(test *&mp=head;mp->next;mp=mp->next)
{
if(mp->next->number==number)
{
point=mp->next;
mp->next=point->next;
delete point;
head=fp;//由you于yuhead的de不bu断duan移yi动dong丢diu失shi了lehead,把ba进jin入ru循xun环huan前qian的dehead指zhi针zhen恢hui复fu!
return;
}
}
}
void insterl(int number)
{
test *point=new test;
cout<<"请qing输shu入ru节jie点diannumber和he节jie点dianscore"<<endl;
cin>>point->number>>point->socre;
if(head==NULL)//链lian表biao为wei空kong的de情qing况kuang下xia插cha入ru
{
head=point;
point->next=NULL;
return;
}
int ierror=1;//设she置zhi找zhao不bu到dao的de情qing况kuang的de条tiao件jian,预yu先xian设she置zhi为wei真zhen
test *le;
test *check=head;
while(check)//利li用yong循xun环huan进jin行xing查cha找zhao
{
if (check->number==number)
{
ierror=0;//条tiao件jian转zhuan为wei假jia
}
le=check;
check=check->next;
}
if(ierror)
{
cout<<le->number;
le->next=point;
point->next=NULL;
return;
}
if(head->number==number)//检jian测ce是shi否fou是shi在zai第di一yi个ge节jie点dian处chu插cha入ru
{
point->next=head;
head=point;
return;
}
for(test *&mp=head;mp->next;mp=mp->next)//在zai链lian表biao中zhong间jian插cha入ru
{
if(mp->next->number==number)
{
point->next=mp->next;
mp->next=point;
return;
}
}
}
void main()
{
head=create();//调tiao用yong创chuang建jian
showl(head);
int dp;
cout<<"请qing输shu入ru删shan除chu点dian假jia如ru找zhao不bu到dao就jiu跳tiao出chu函han数shu"<<endl;
cin>>dp;
deletel(head,dp);//调tiao用yong删shan除chu
showl(head);
int ip;
cout<<"请qing输shu入ru插cha入ru点dian假jia如ru找zhao不bu到dao就jiu在zai链lian尾yi添tian加jia"<<endl;
cin>>ip;
insterl(ip);
showl(head);
cin.get();
cin.get();
}
到dao此ci关guan于yu结jie构gou体ti的de内nei容rong已yi经jing全quan部bu讨tao论lun结jie束shu,链lian表biao的de建jian立li删shan除chu插cha入ru操cao作zuo可ke以yi很hen好hao的de对dui前qian面mian所suo学xue知zhi识shi进jin行xing一yi个ge总zong结jie,它ta既ji考kao察cha了le程cheng序xu员yuan对dui内nei存cun大da理li解jie(堆dui内nei存cun操cao作zuo、指zhi针zhen操cao作zuo)也ye考kao察cha了le对dui结jie构gou化hua编bian程cheng把ba握wo的de熟shu悉xi程cheng序xu。
以yi后hou的de教jiao程cheng我wo们men将jiang着zhe重chong练lian习xi面mian向xiang对dui象xiang的de编bian程cheng的de相xiang关guan知zhi识shi点dian。