strUCt test
{
char name[10];
float socre;
test *next;
};//這樣是正確的!
struct test
{
char name[10];
float socre;
test next;
};//這樣是錯(cuò)誤的!
//程序作者:管寧
//站點(diǎn):www.cndev-lab.com
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必聞名出處和作者
#include <iostream>
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//創(chuàng)建一個(gè)全局的引導(dǎo)進(jìn)入鏈表的指針
test *create()
{
test *ls;//節(jié)點(diǎn)指針
test *le;//鏈尾指針
ls = new test;//把ls指向動(dòng)態(tài)開辟的堆內(nèi)存地址
cin>>ls->name>>ls->socre;
head=NULL;//進(jìn)入的時(shí)候先不設(shè)置head指針指向任何地址,因?yàn)椴恢朗欠褚簧蟻砭洼斎雗ull跳出程序
le=ls;//把鏈尾指針設(shè)置成剛剛動(dòng)態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個(gè)節(jié)點(diǎn)的位置
while(strcmp(ls->name,"null")!=0)//創(chuàng)建循環(huán)條件為ls->name的值不是null,用于循環(huán)添加節(jié)點(diǎn)
{
if(head==NULL)//判定是否是第一次進(jìn)入循環(huán)
{
head=ls;//假如是第一次進(jìn)入循環(huán),那么把引導(dǎo)進(jìn)入鏈表的指針指向第一次動(dòng)態(tài)開辟的堆內(nèi)存地址
}
else
{
le->next=ls;//假如不是第一次進(jìn)入那么就把上一次的鏈尾指針的le->next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
}
le=ls;//設(shè)置鏈尾指針為當(dāng)前循環(huán)中的節(jié)點(diǎn)指針,用于下一次進(jìn)入循環(huán)的時(shí)候把上一次的節(jié)點(diǎn)的next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
ls=new test;//為下一個(gè)節(jié)點(diǎn)在堆內(nèi)存中動(dòng)態(tài)開辟空間
cin>>ls->name>>ls->socre;
}
le->next=NULL;//把鏈尾指針的next設(shè)置為空,因?yàn)椴还苋绾窝h(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時(shí)候不至于死循環(huán)
delete ls;//當(dāng)結(jié)束的時(shí)候最后一個(gè)動(dòng)態(tài)開辟的內(nèi)存是無效的,所以必須清除掉
return head;//返回鏈?zhǔn)字羔?
}
void showl(test *head)
{
cout<<"鏈?zhǔn)字羔?"<<head<<endl;
while(head)//以內(nèi)存指向?yàn)閚ull為條件循環(huán)顯示先前輸入的內(nèi)容
{
cout<<head->name<<""<<head->socre<<endl;
head=head->next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
test *head;//創(chuàng)建一個(gè)全局的引導(dǎo)進(jìn)入鏈表的指針
//程序作者:管寧
//站點(diǎn):www.cndev-lab.com
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必聞名出處和作者
#include <iostream>
using namespace std;
struct test
{
char name[10];
float socre;
test *next;
};
test *head;//創(chuàng)建一個(gè)全局的引導(dǎo)進(jìn)入鏈表的指針
test *create()
{
return head;//返回鏈?zhǔn)字羔?
}
void showl(test *head)
{
cout<<"鏈?zhǔn)字羔?"<<head<<endl;
while(head)//以內(nèi)存指向?yàn)閚ull為條件循環(huán)顯示先前輸入的內(nèi)容
{
cout<<head->name<<""<<head->socre<<endl;
head=head->next;
}
}
void main()
{
showl(create());
cin.get();
cin.get();
}
test *create()
{
test *ls;//節(jié)點(diǎn)指針
test *le;//鏈尾指針
ls = new test;//把ls指向動(dòng)態(tài)開辟的堆內(nèi)存地址
cin>>ls->name>>ls->socre;
head=NULL;//進(jìn)入的時(shí)候先不設(shè)置head指針指向任何地址,因?yàn)椴恢朗欠褚簧蟻砭洼斎雗ull跳出程序
le=ls;//把鏈尾指針設(shè)置成剛剛動(dòng)態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個(gè)節(jié)點(diǎn)的位置
le->next=NULL;//把鏈尾指針的next設(shè)置為空,因?yàn)椴还苋绾窝h(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時(shí)候不至于死循環(huán)
delete ls;//當(dāng)結(jié)束的時(shí)候最后一個(gè)動(dòng)態(tài)開辟的內(nèi)存是無效的,所以必須清除掉
return head;//返回鏈?zhǔn)字羔?
}
//程序作者:管寧
//站點(diǎn):www.cndev-lab.com
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必聞名出處和作者
#include <iostream>
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//創(chuàng)建一個(gè)全局的引導(dǎo)進(jìn)入鏈表的指針
test *create()
{
test *ls;//節(jié)點(diǎn)指針
test *le;//鏈尾指針
ls = new test;//把ls指向動(dòng)態(tài)開辟的堆內(nèi)存地址
cin>>ls->number>>ls->socre;
head=NULL;//進(jìn)入的時(shí)候先不設(shè)置head指針指向任何地址,因?yàn)椴恢朗欠褚簧蟻砭洼斎雗ull跳出程序
le=ls;//把鏈尾指針設(shè)置成剛剛動(dòng)態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個(gè)節(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)入鏈表的指針指向第一次動(dòng)態(tài)開辟的堆內(nèi)存地址
}
else
{
le->next=ls;//假如不是第一次進(jìn)入那么就把上一次的鏈尾指針的le->next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
}
le=ls;//設(shè)置鏈尾指針為當(dāng)前循環(huán)中的節(jié)點(diǎn)指針,用于下一次進(jìn)入循環(huán)的時(shí)候把上一次的節(jié)點(diǎn)的next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
ls=new test;//為下一個(gè)節(jié)點(diǎn)在堆內(nèi)存中動(dòng)態(tài)開辟空間
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把鏈尾指針的next設(shè)置為空,因?yàn)椴还苋绾窝h(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時(shí)候不至于死循環(huán)
delete ls;//當(dāng)結(jié)束的時(shí)候最后一個(gè)動(dòng)態(tài)開辟的內(nèi)存是無效的,所以必須清除掉
return head;//返回鏈?zhǔn)字羔?
}
void showl(test *head)
{
cout<<"鏈?zhǔn)字羔?"<<head<<endl;
while(head)//以內(nèi)存指向?yàn)閚ull為條件循環(huán)顯示先前輸入的內(nèi)容
{
cout<<head->number<<""<<head->socre<<endl;
head=head->next;
}
}
void deletel(test *&head,int number)//這里假如參數(shù)換成test *head,意義就完全不同了,head變成了復(fù)制而不是原有鏈上操作了,非凡注重,很多書上都不對(duì)這里
{
test *point;//判定鏈表是否為空
if(head==NULL)
{
cout<<"鏈表為空,不能進(jìn)行刪除工作!";
return;
}
if(head->number==number)//判刪除的節(jié)點(diǎn)是否為首節(jié)點(diǎn)
{
point=head;
cout<<"刪除點(diǎn)是鏈表第一個(gè)節(jié)點(diǎn)位置!";
head=head->next;//重新設(shè)置引導(dǎo)指針
delete point;
return;
}
test *fp=head;//保存連首指針
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;//由于head的不斷移動(dòng)丟失了head,把進(jìn)入循環(huán)前的head指針恢復(fù)!
return;
}
}
}
void main()
{
head=create();//調(diào)用創(chuàng)建
showl(head);
int dp;
cin>>dp;
deletel(head,dp);//調(diào)用刪除
showl(head);
cin.get();
cin.get();
}
//程序作者:管寧
//站點(diǎn):www.cndev-lab.com
//所有稿件均有版權(quán),如要轉(zhuǎn)載,請(qǐng)務(wù)必聞名出處和作者
#include <iostream>
using namespace std;
struct test
{
int number;
float socre;
test *next;
};
test *head;//創(chuàng)建一個(gè)全局的引導(dǎo)進(jìn)入鏈表的指針
test *create()
{
test *ls;//節(jié)點(diǎn)指針
test *le;//鏈尾指針
ls = new test;//把ls指向動(dòng)態(tài)開辟的堆內(nèi)存地址
cout<<"請(qǐng)輸入第一個(gè)節(jié)點(diǎn)number和節(jié)點(diǎn)score,輸入0.0跳出函數(shù)"<<endl;
cin>>ls->number>>ls->socre;
head=NULL;//進(jìn)入的時(shí)候先不設(shè)置head指針指向任何地址,因?yàn)椴恢朗欠褚簧蟻砭洼斎雗ull跳出程序
le=ls;//把鏈尾指針設(shè)置成剛剛動(dòng)態(tài)開辟的堆內(nèi)存地址,用于等下設(shè)置le->next,也就是下一個(gè)節(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)入鏈表的指針指向第一次動(dòng)態(tài)開辟的堆內(nèi)存地址
}
else
{
le->next=ls;//假如不是第一次進(jìn)入那么就把上一次的鏈尾指針的le->next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
}
le=ls;//設(shè)置鏈尾指針為當(dāng)前循環(huán)中的節(jié)點(diǎn)指針,用于下一次進(jìn)入循環(huán)的時(shí)候把上一次的節(jié)點(diǎn)的next指向上一次循環(huán)結(jié)束前動(dòng)態(tài)創(chuàng)建的堆內(nèi)存地址
ls=new test;//為下一個(gè)節(jié)點(diǎn)在堆內(nèi)存中動(dòng)態(tài)開辟空間
cout<<"請(qǐng)下一個(gè)節(jié)點(diǎn)number和節(jié)點(diǎn)score,輸入0.0跳出函數(shù)"<<endl;
cin>>ls->number>>ls->socre;
}
le->next=NULL;//把鏈尾指針的next設(shè)置為空,因?yàn)椴还苋绾窝h(huán)總是要結(jié)束的,設(shè)置為空才能夠在循環(huán)顯鏈表的時(shí)候不至于死循環(huán)
delete ls;//當(dāng)結(jié)束的時(shí)候最后一個(gè)動(dòng)態(tài)開辟的內(nèi)存是無效的,所以必須清除掉
return head;//返回鏈?zhǔn)字羔?
}
void showl(test *head)
{
cout<<"鏈?zhǔn)字羔?"<<head<<endl;
while(head)//以內(nèi)存指向?yàn)閚ull為條件循環(huán)顯示先前輸入的內(nèi)容
{
cout<<head->number<<""<<head->socre<<endl;
head=head->next;
}
}
void deletel(test *&head,int number)//這里假如參數(shù)換成test *head,意義就完全不同了,head變成了復(fù)制而不是原有鏈上操作了,非凡注重,很多書上都不對(duì)這里
{
test *point;//判定鏈表是否為空
if(head==NULL)
{
cout<<"鏈表為空,不能進(jìn)行刪除工作!";
return;
}
int derror=1;//設(shè)置找不到的情況的條件,預(yù)先設(shè)置為真
test *check=head;
while(check)//利用循環(huán)進(jìn)行查找
{
if (check->number==number)
{
derror=0;//條件轉(zhuǎn)為假
}
check=check->next;
}
if(derror)//假如為假就跳出函數(shù)
{
return;
}
if(head->number==number)//判刪除的節(jié)點(diǎn)是否為首節(jié)點(diǎn)
{
point=head;
cout<<"刪除點(diǎn)是鏈表第一個(gè)節(jié)點(diǎn)位置!";
head=head->next;//重新設(shè)置引導(dǎo)指針
delete point;
return;
}
test *fp=head;//保存連首指針
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;//由于head的不斷移動(dòng)丟失了head,把進(jìn)入循環(huán)前的head指針恢復(fù)!
return;
}
}
}
void insterl(int number)
{
test *point=new test;
cout<<"請(qǐng)輸入節(jié)點(diǎn)number和節(jié)點(diǎn)score"<<endl;
cin>>point->number>>point->socre;
if(head==NULL)//鏈表為空的情況下插入
{
head=point;
point->next=NULL;
return;
}
int ierror=1;//設(shè)置找不到的情況的條件,預(yù)先設(shè)置為真
test *le;
test *check=head;
while(check)//利用循環(huán)進(jìn)行查找
{
if (check->number==number)
{
ierror=0;//條件轉(zhuǎn)為假
}
le=check;
check=check->next;
}
if(ierror)
{
cout<<le->number;
le->next=point;
point->next=NULL;
return;
}
if(head->number==number)//檢測是否是在第一個(gè)節(jié)點(diǎn)處插入
{
point->next=head;
head=point;
return;
}
for(test *&mp=head;mp->next;mp=mp->next)//在鏈表中間插入
{
if(mp->next->number==number)
{
point->next=mp->next;
mp->next=point;
return;
}
}
}
void main()
{
head=create();//調(diào)用創(chuàng)建
showl(head);
int dp;
cout<<"請(qǐng)輸入刪除點(diǎn)假如找不到就跳出函數(shù)"<<endl;
cin>>dp;
deletel(head,dp);//調(diào)用刪除
showl(head);
int ip;
cout<<"請(qǐng)輸入插入點(diǎn)假如找不到就在鏈尾添加"<<endl;
cin>>ip;
insterl(ip);
showl(head);
cin.get();
cin.get();
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注