C程序的結(jié)構(gòu)實(shí)用_第1頁(yè)
C程序的結(jié)構(gòu)實(shí)用_第2頁(yè)
C程序的結(jié)構(gòu)實(shí)用_第3頁(yè)
C程序的結(jié)構(gòu)實(shí)用_第4頁(yè)
C程序的結(jié)構(gòu)實(shí)用_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1C程序的結(jié)構(gòu)實(shí)用

塊作用域又稱(chēng)局部作用域。由一對(duì)花括號(hào)“{}”所括起來(lái)的塊中聲明的標(biāo)識(shí)符的作用域從聲明處開(kāi)始,一直到塊結(jié)束的花括號(hào)為止。例如:

#include<iostream.h> voidmain(){ voidfun1(); intn; for(inti=0;i<5;i++)

{ intm; if(i%2)n++; } m=n/2; //錯(cuò)誤,m未定義

n=i; fun1(); //fun1()函數(shù)調(diào)用

}2)塊作用域第1頁(yè)/共47頁(yè)voidfun1(){cout<<"i="<<i<<endl; //錯(cuò)誤,i未定義

}編譯時(shí),函數(shù)fun1()中的語(yǔ)句:

cout<<"i="<<i<<endl;將出現(xiàn)一個(gè)未定義錯(cuò)誤,這是因?yàn)閴K作用域不能延伸到子函數(shù)中。第2頁(yè)/共47頁(yè)3)文件作用域#include<iostream.h>

intk;

voidmain() { k=5;{k++;} {intk=7;k++;cout<<"k="<<k;} cout<<“,k="<<k<<endl; }

程序運(yùn)行結(jié)果為:k=8,k=6可見(jiàn)性遵循的一般規(guī)則:(1)標(biāo)識(shí)符在引用前必須先聲明。(2)在互相沒(méi)有包含關(guān)系的不同作用域中聲明同名的標(biāo)識(shí)符時(shí),兩標(biāo)識(shí)符互不影響。(3)如果在兩個(gè)或多個(gè)具有包含關(guān)系的作用域中聲明了同名標(biāo)識(shí)符,則外層標(biāo)識(shí)符在內(nèi)層不可見(jiàn)。第3頁(yè)/共47頁(yè)1)靜態(tài)生存期 靜態(tài)生存期與程序的運(yùn)行期相同。具有文件作用域的變量具有靜態(tài)生存期。如果要在函數(shù)內(nèi)部的塊作用域中聲明具有靜態(tài)生存期的變量,則要使用關(guān)鍵字static。例如:staticintk;

具有靜態(tài)生存期的變量,也稱(chēng)為靜態(tài)變量。2)局部生存期 在塊作用域中聲明的變量具有局部生存期。此生存期誕生于聲明點(diǎn),而終止于其作用域的結(jié)束處。具有局部生存期的變量都具有塊作用域。但當(dāng)在塊作用域內(nèi)將變量說(shuō)明為靜態(tài)變量時(shí),該變量則具有靜態(tài)生存期。3)動(dòng)態(tài)生存期 動(dòng)態(tài)生存期由程序中特定的函數(shù)(malloc()和free())調(diào)用或由操作符(new和delete)創(chuàng)建和釋放。具有動(dòng)態(tài)生存期的變量在內(nèi)存的堆區(qū)分配空間。2.生存期第4頁(yè)/共47頁(yè)3.局部變量和全局變量1)局部變量 局部變量包括自動(dòng)(auto)變量、內(nèi)部靜態(tài)(static)變量和函數(shù)參數(shù)。2)全局變量 全局變量具有文件作用域。

第5頁(yè)/共47頁(yè)//EX5_1.cpp:演示局部變量和全局變量#include<iostream.h>inti=1; //全局變量i:靜態(tài)生存期voidmain(){staticinta; //聲明局部靜態(tài)變量a:靜態(tài)生存期

intb=-10; //聲明局部變量b:局部生存期

intc=0; //聲明局部變量c:局部生存期

voidother(void); //聲明函數(shù)other()cout<<“main:"<<"i="<<i<<"a="<<a<<"b="<<b<<"c="<<c<<endl;c=c+8;

other(); //調(diào)用函數(shù)other()cout<<“main:"<<"i="<<i<<"a="<<a<<"b="<<b<<"c="<<c<<endl;

other(); //調(diào)用函數(shù)other()}第6頁(yè)/共47頁(yè)voidother(void){staticinta=1; //局部靜態(tài)變量a:靜態(tài)生存期

staticintb; //局部靜態(tài)變量b:靜態(tài)生存期

intc=5; //局部變量c:局部生存期

i=i+2;a=a+3;c=c+5;cout<<"other:"<<"i="<<i<<"a="<<a<<"b="<<b<<"c="<<c<<endl;b=a;}

程序運(yùn)行結(jié)果為:

main:i=1a=0b=-10c=0 other:i=3a=4b=0c=10 main:i=3a=0b=-10c=8 other:i=5a=7b=4c=10第7頁(yè)/共47頁(yè)

靜態(tài)成員為同類(lèi)的所有對(duì)象共同擁有,用于解決同類(lèi)對(duì)象之間數(shù)據(jù)和函數(shù)的共享問(wèn)題。靜態(tài)成員分為靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員。

(1)靜態(tài)數(shù)據(jù)成員聲明:staticintn(2)靜態(tài)數(shù)據(jù)成員必須要在類(lèi)外進(jìn)行初始化,初始化的形式為:

<類(lèi)型標(biāo)識(shí)符><類(lèi)名>::<靜態(tài)數(shù)據(jù)成員名>=<值>

例如:intPoint::n=0;(3)靜態(tài)成員屬于類(lèi),而不屬于任何一個(gè)對(duì)象;

(4)靜態(tài)成員一樣要服從訪問(wèn)控制限制;

(5)私有靜態(tài)數(shù)據(jù)成員只能在類(lèi)內(nèi)引用,公有或保護(hù)靜態(tài)數(shù)據(jù)成員可以在類(lèi)外通過(guò)類(lèi)名引用。

(6)靜態(tài)函數(shù)成員可以直接引用該類(lèi)的靜態(tài)成員,但不能直接引用非靜態(tài)數(shù)據(jù)成員;

(7)公有靜態(tài)函數(shù)成員可以通過(guò)類(lèi)名或?qū)ο竺麃?lái)調(diào)用。5.1.2靜態(tài)成員第8頁(yè)/共47頁(yè)//EX5_2.cpp:演示使用靜態(tài)成員#include<iostream.h>classpoint{private:intx,y; staticintcountP; //聲明私有靜態(tài)數(shù)據(jù)成員

public:point(intxx=0,intyy=0) //定義構(gòu)造函數(shù)

{x=xx;y=yy;countP++;}point(point&p); //聲明拷貝構(gòu)造函數(shù)

intget_x(){returnx;}intget_y(){returny;}staticvoidget_c()

//定義公有靜態(tài)函數(shù)成員

{cout<<“Objectid=”<<countP<<endl;}//私有靜態(tài)數(shù)據(jù)成};//員在類(lèi)內(nèi)引用第9頁(yè)/共47頁(yè)point::point(point&p) //定義拷貝構(gòu)造函數(shù){x=p.x; y=p.y;

countP++; //私有靜態(tài)數(shù)據(jù)成員在類(lèi)內(nèi)引用}intpoint::countP=0; //靜態(tài)數(shù)據(jù)成員必須要在類(lèi)外初始化voidmain(){point::get_c(); //第1次通過(guò)類(lèi)名調(diào)用靜態(tài)函數(shù)成員

pointa(4,5); //聲明類(lèi)的對(duì)象acout<<"pointa,"<<a.get_x()<<","<<a.get_y();a.get_c(); //第2次通過(guò)對(duì)象名調(diào)用靜態(tài)函數(shù)成員

pointb(a);cout<<"pointb,"<<b.get_x()<<","<<b.get_y();point::get_c(); //第3次通過(guò)類(lèi)名調(diào)用靜態(tài)函數(shù)成員}第10頁(yè)/共47頁(yè)

在主函數(shù)中,分別采用類(lèi)名和對(duì)象名來(lái)調(diào)用get_c()。第1次調(diào)用get_c()時(shí)由于還沒(méi)有任何對(duì)象生成,只能采用類(lèi)名的形式。由此可見(jiàn),通過(guò)類(lèi)名調(diào)用靜態(tài)函數(shù)成員可以輸出靜態(tài)數(shù)據(jù)成員的初始值。后面的2次get_c()的調(diào)用既可以采用類(lèi)名的形式,也可以采用對(duì)象名的形式。

程序運(yùn)行結(jié)果為:

Objectid=0 pointa,4,5Objectid=1 pointb,4,5Objectid=2第11頁(yè)/共47頁(yè)//演示使用靜態(tài)成員#include"iostream.h"#include"string.h"classstu{private:char*name,*num; staticinttotal; public: stu(char*,char*); ~stu(); voidprint(); staticintgettotal(){returntotal;}};第12頁(yè)/共47頁(yè)intstu::total=0;stu::stu(char*n1,char*n2)/*拷貝構(gòu)造函數(shù)怎么設(shè)計(jì)?*/{name=newchar[strlen(n1)+1];num=newchar[strlen(n2)+1];strcpy(name,n1);strcpy(num,n2);++total;}voidstu::print(){ cout<<"\nname:"<<name <<"\nnum:"<<num <<"\ntotal:"<<total<<endl;}第13頁(yè)/共47頁(yè)stu::~stu(){ delete[]name; delete[]num; --total;}intmain(intargc,char*argv[]){stua("wang","000001"); stub("yang","000002"); stuc("tang","000003"); a.print();

cout<<endl<<"total:"<<a.gettotal()<<endl; b.print(); cout<<endl<<"total:"<<stu::gettotal()<<endl; return0;}第14頁(yè)/共47頁(yè)

聲明友元函數(shù)是為了使普通函數(shù)或其它類(lèi)的成員函數(shù)能訪問(wèn)本類(lèi)的成員,友元函數(shù)在類(lèi)聲明中由關(guān)鍵字friend修飾。 普通函數(shù)聲明為友元函數(shù)的形式:

friend<類(lèi)型標(biāo)識(shí)符><友元函數(shù)名>(參數(shù)表)

其它類(lèi)的成員函數(shù)聲明為友元函數(shù)的形式:

friend<類(lèi)型標(biāo)識(shí)符><類(lèi)名>::<友元函數(shù)名>(參數(shù)表)

說(shuō)明:

(1)友元函數(shù)的聲明可以在類(lèi)聲明中的任何位置,既可在public區(qū),也可在protected區(qū),意義完全一樣。

(2)友元函數(shù)的定義一般放在類(lèi)的外部,最好與類(lèi)的其他成員函數(shù)定義放在一起。5.1.3友元

1.友元函數(shù)第15頁(yè)/共47頁(yè)//EX5_3.cpp:演示使用普通函數(shù)作友元函數(shù)計(jì)算兩點(diǎn)距離

#include<iostream.h>#include<math.h>

classpoint{private: doublex,y;public:point(doublexx=0,doubleyy=0){x=xx;y=yy;}doubleget_x(){returnx;}doubleget_y(){returny;}

frienddoubledistance(pointp1,pointp2);//普通函數(shù)作}; //point的友元第16頁(yè)/共47頁(yè)doubledistance(pointp1,pointp2)//定義point類(lèi)的友元函數(shù){return(sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));}voidmain(){pointmyp1(1,1),myp2(4,5);//聲明point類(lèi)對(duì)象myp1和myp2cout<<"Thedistanceis:"<<distance(myp1,myp2)<<endl;}友元函數(shù)必須先接收對(duì)應(yīng)類(lèi)的對(duì)象,然后通過(guò)接收到的對(duì)象訪問(wèn)其所以成員第17頁(yè)/共47頁(yè)

如果友元是一個(gè)類(lèi),則稱(chēng)為友元類(lèi)。友元類(lèi)的聲明形式為:

friendclass<友元類(lèi)名>說(shuō)明:

(1)友元類(lèi)的聲明同樣可以在類(lèi)聲明中的任何位置;

(2)友元類(lèi)的所有成員函數(shù)都成為友元函數(shù)。

例如,若A類(lèi)為B類(lèi)的友元類(lèi),即在B類(lèi)中聲明:

friendclassA;則A類(lèi)的所有成員函數(shù)都成為B類(lèi)的友元函數(shù),都可以訪問(wèn)B類(lèi)的私有和保護(hù)成員。2.友元類(lèi)第18頁(yè)/共47頁(yè)

友元類(lèi)的成員函數(shù)可以通過(guò)對(duì)象名直接訪問(wèn)到隱藏的數(shù)據(jù),達(dá)到高效協(xié)調(diào)工作的目的。但在使用友元時(shí)還有兩點(diǎn)需要注意:(1)

友元關(guān)系不能傳遞。B類(lèi)是A類(lèi)的友元,C類(lèi)是B類(lèi)的友元,C類(lèi)和A類(lèi)之間如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。

(2)友元關(guān)系是單向的。如果聲明B類(lèi)是A類(lèi)的友元,B類(lèi)的成員函數(shù)就可以訪問(wèn)A類(lèi)的私有和保護(hù)數(shù)據(jù),但A類(lèi)的成員函數(shù)卻不能訪問(wèn)B類(lèi)的私有和保護(hù)數(shù)據(jù)。第19頁(yè)/共47頁(yè)例:友元成員函數(shù)#include"string.h"#include"iostream.h"classst_n;classsco{private:intmat,eng;public: sco(inti1,inti2):mat(i1),eng(i2){} voidshow() {cout<<"\nmath:"<<mat; cout<<"\neng:"<<eng; } voidshow(st_n&st);//st_n還沒(méi)具體定義,

//函數(shù)show()在后面實(shí)現(xiàn)};第20頁(yè)/共47頁(yè)classst_n{private:char*name,*num;public:

friendvoidsco::show(st_n&); st_n(char*n1,char*n2) {name=newchar[strlen(n1)+1]; num=newchar[strlen(n2)+1]; strcpy(name,n1); strcpy(num,n2); }};第21頁(yè)/共47頁(yè)voidsco::show(st_n&st){ cout<<"\nname:"<<; cout<<"\nnum:"<<st.num; show();}intmain(intargc,char*argv[]){ st_na("wang","123456"); scob(72,82); b.show(a); return0;}第22頁(yè)/共47頁(yè)

使用const關(guān)鍵字聲明的引用稱(chēng)為常引用,常引用所引用的對(duì)象不能被更新。用常引用做形參,不會(huì)發(fā)生對(duì)實(shí)參意外的更改。常引用的聲明形式為

const<類(lèi)型標(biāo)識(shí)符>&<引用名>

注意:常引用的值不能被更新,所以常引用聲明時(shí),必須同時(shí)進(jìn)行初始化。5.1.4常類(lèi)型

1.常引用第23頁(yè)/共47頁(yè)//EX5_4.cpp:演示常引用做形參

#include<iostream.h>voiddisplay(constdouble&r);//常引用做形參{cout<<“r=”<<++r<<endl;}//錯(cuò)誤:更改常引用的對(duì)象rvoidmain(){doubled(6.5);display(d);}

這段程序編譯時(shí)有一個(gè)錯(cuò)誤:

errorC2166:1-valuespecifiesconstobject。如果將display函數(shù)的定義語(yǔ)句改為:cout<<"r="<<r<<endl;

則得程序運(yùn)行結(jié)果為:r=6.5第24頁(yè)/共47頁(yè)

使用const關(guān)鍵字聲明的對(duì)象稱(chēng)為常對(duì)象。常對(duì)象的聲明形式為const<類(lèi)名><對(duì)象名>

或<類(lèi)名>const<對(duì)象名>

聲明常對(duì)象的同時(shí),也要進(jìn)行初始化,而且該對(duì)象以后不能再被更新。3.常成員函數(shù) 使用const關(guān)鍵字聲明的函數(shù)稱(chēng)為常成員函數(shù),常成員函數(shù)聲明的形式為

<類(lèi)型標(biāo)識(shí)符><函數(shù)名>(參數(shù)表)const;2.常對(duì)象第25頁(yè)/共47頁(yè)

說(shuō)明:

(1)const是加在函數(shù)聲明后面的類(lèi)型修飾符,它是函數(shù)類(lèi)型的一個(gè)組成部分,因此在實(shí)現(xiàn)部分也要帶const關(guān)鍵字。

(2)const關(guān)鍵字可以被用于對(duì)重載函數(shù)的區(qū)分,例如,可以在類(lèi)中這樣聲明:

voidfun(); voidfun()const;

(3)常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類(lèi)中沒(méi)有用const修飾的成員函數(shù)。

(4)常對(duì)象只用于調(diào)用它的常成員函數(shù),而不能調(diào)用其他成員函數(shù)。第26頁(yè)/共47頁(yè)//EX5_5.cpp:演示常成員函數(shù)#include<iostream.h>classA{private: intx,y;public: A(inti=0,intj=0){x=i;y=j;}

voidfun() //定義普通成員函數(shù)

{cout<<"成員函數(shù):x="<<x<<",y="<<y<<endl;}

voidfun()

const

//定義常成員函數(shù)

{cout<<"常成員函數(shù):x="<<x<<",y="<<y<<endl;}};voidmain(){Aobj1(1,2); //聲明普通對(duì)象obj1

obj1.fun(); //調(diào)用普通成員函數(shù)

constAobj2(3,4); //聲明常對(duì)象obj2

obj2.fun();

//調(diào)用常成員函數(shù)}第27頁(yè)/共47頁(yè)

程序運(yùn)行結(jié)果為: 成員函數(shù):x=1,y=2

常成員函數(shù):x=3,y=44.常數(shù)據(jù)成員常數(shù)據(jù)成員也用關(guān)鍵字const說(shuō)明,常數(shù)據(jù)成員(包括常引用、常對(duì)象)由于不能被更新,因此只能用成員初始化列表的方式通過(guò)構(gòu)造函數(shù)進(jìn)行初始化。第28頁(yè)/共47頁(yè)//EX5_6.cpp:演示常數(shù)據(jù)成員#include<iostream.h>classA{private:

constintx; //常數(shù)據(jù)成員x

staticconstinty; //靜態(tài)常數(shù)據(jù)成員ypublic:

constint&r; //常引用rA(inti):x(i),r(x){} //x和r用初始化列表獲得初值

voidfun() {cout<<"x="<<x<<",y="<<y<<",r="<<r<<endl;}};constintA::y=5; //y的初始化在類(lèi)外進(jìn)行第29頁(yè)/共47頁(yè)voidmain(){Aobj1(1),obj2(2);obj1.fun();obj2.fun();}程序運(yùn)行結(jié)果為:x=1,y=5,r=1x=2,y=5,r=2第30頁(yè)/共47頁(yè)

大型程序通常由多個(gè)文件組成一個(gè)項(xiàng)目(Project),理由是:1.將相關(guān)類(lèi)和函數(shù)放在一個(gè)特定的文件中,對(duì)不同的文件進(jìn)行單獨(dú)編寫(xiě)、編譯,最后再鏈接,避免重復(fù)勞動(dòng),提高工作效益。2.便于團(tuán)隊(duì)開(kāi)發(fā)。按邏輯功能將程序分解成多個(gè)源文件,使程序容易管理,便于程序員的任務(wù)安排。大型程序基本上由三個(gè)部分構(gòu)成:類(lèi)的聲明:通常做成.h文件(HeaderFiles)類(lèi)成員的實(shí)現(xiàn):通常做成.cpp文件(SourceFiles)主函數(shù):通常做成.cpp文件(SourceFiles)5.1.5多文件結(jié)構(gòu)第31頁(yè)/共47頁(yè)5.2動(dòng)態(tài)內(nèi)存分配5.2.1new運(yùn)算符

new運(yùn)算符用于動(dòng)態(tài)分配一塊內(nèi)存空間。使用形式為:

指針變量=new<數(shù)據(jù)類(lèi)型>[長(zhǎng)度]例如分配一個(gè)可以容納256個(gè)char型數(shù)據(jù)的空間:

char*Cbuffer=newchar[256];

使用new運(yùn)算符時(shí),需要注意:(1)如果分配的空間長(zhǎng)度為1個(gè)單位,則可以省略[]和其中的整數(shù),例如:

float*pNum=newfloat;與

float*pNum=newfloat[1];等價(jià)。第32頁(yè)/共47頁(yè)(2)使用new運(yùn)算符分配內(nèi)存空間時(shí),其空間長(zhǎng)度可以是變量,也可以是數(shù)值表達(dá)式,例如分配一個(gè)可以容納10個(gè)int型數(shù)據(jù)的空間:

intnSize=5; int*nPInt=newint[nSize+5];

(3)由new分配的內(nèi)存空間是連續(xù)的,可以通過(guò)指針的變化訪問(wèn)所分配空間的每一個(gè)元素,例如:

int*nPInt=newint[10]; nPInt[5]=100;

或 *(nPInt+5)=100;(4)如果當(dāng)前存儲(chǔ)器無(wú)足夠的內(nèi)存空間可分配,則new運(yùn)算符返回0(NULL)。第33頁(yè)/共47頁(yè)

由new運(yùn)算符分配的內(nèi)存空間在使用完畢后應(yīng)該使用delete運(yùn)算符釋放。delete運(yùn)算符的使用有兩種形式:

delete指針或

delete[]指針例如:int*pInt=newint; deletepInt; int*pManyInt=newint[10]; delete[]pManyInt;使用delete運(yùn)算符時(shí),需要注意:(1)用new運(yùn)算符獲得的內(nèi)存空間,只許使用一次delete,不允許多次對(duì)同一塊空間進(jìn)行多次釋放,否則將會(huì)產(chǎn)生嚴(yán)重錯(cuò)誤。(2)delete只能用來(lái)釋放由new運(yùn)算符分配的動(dòng)態(tài)內(nèi)存空間,不得使用delete運(yùn)算符去釋放程序中的變量、數(shù)組的存儲(chǔ)空間。5.2.2delete運(yùn)算符第34頁(yè)/共47頁(yè)1.鏈表概述 鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它的特點(diǎn)是用一組任意的存儲(chǔ)單元(可以是連續(xù)的,也可以是不連續(xù)的)存放數(shù)據(jù)元素。一個(gè)簡(jiǎn)單的鏈表具有下圖所示的結(jié)構(gòu)形式。5.2.3動(dòng)態(tài)內(nèi)存分配的應(yīng)用實(shí)例

定義單鏈表結(jié)構(gòu)的最簡(jiǎn)單形式為:

structNode

{intdata;Node*next;

};第35頁(yè)/共47頁(yè)

定義一個(gè)鏈表類(lèi)List,其中包含鏈表結(jié)點(diǎn)的插入、刪除、訪問(wèn)等功能的成員函數(shù),以便對(duì)鏈表進(jìn)行操作。classList{Node*head; //聲明一個(gè)鏈表結(jié)構(gòu)指針

public:List(){head=NULL;} voidInsertList(intaData,intbData);//鏈表結(jié)點(diǎn)的插入

voidDeleteList(intaData); //鏈表結(jié)點(diǎn)的刪除

voidOutputList(); //鏈表結(jié)點(diǎn)的訪問(wèn)

Node*Gethead(){returnhead;}};第36頁(yè)/共47頁(yè)voidList::OutputList() //鏈表結(jié)點(diǎn)的訪問(wèn){Node*current=head; //建立鏈表頭指針

while(current!=NULL) //如果鏈表存在,

{cout<<current->data<<“”; //顯示鏈表結(jié)點(diǎn)的數(shù)據(jù)

current=current->next; //指向下一個(gè)結(jié)點(diǎn)

}cout<<endl;}3.鏈表結(jié)點(diǎn)的插入 如果要將新結(jié)點(diǎn)b插入到鏈表的結(jié)點(diǎn)a之前,則需要考慮下列幾種情況:2.鏈表結(jié)點(diǎn)的訪問(wèn)第37頁(yè)/共47頁(yè)(1)插入前鏈表是一個(gè)空表,插入新結(jié)點(diǎn)b后,鏈表如圖(a)所示。(2)若a是鏈表的第一個(gè)結(jié)點(diǎn),插入新結(jié)點(diǎn)b后成為第一個(gè)結(jié)點(diǎn),如圖

(b)所示。(3)若a不是鏈表的第一個(gè)結(jié)點(diǎn),則要先找出a的上一個(gè)結(jié)點(diǎn)ak,然后新結(jié)點(diǎn)b插到結(jié)點(diǎn)ak

與a之間,如圖(c)所示。(4)若鏈表中不存在a,則新結(jié)點(diǎn)b插在最后,如圖

(d)所示。

第38頁(yè)/共47頁(yè)//設(shè)aData是結(jié)點(diǎn)a中的數(shù)據(jù),bData是新結(jié)點(diǎn)b中的數(shù)據(jù)voidList::InsertList(intaData,intbData){Node*p,*q,*s;s=(Node*)newNode;//動(dòng)態(tài)分配一個(gè)新結(jié)點(diǎn)存儲(chǔ)區(qū)

s->data=bData; //將新結(jié)點(diǎn)b的數(shù)據(jù)放入新存儲(chǔ)區(qū)

p=head; //結(jié)點(diǎn)指針p指向鏈表頭

if(head==NULL) //若是空表,

{ head=s; //將新存儲(chǔ)區(qū)的地址賦給表頭,即使

s->next=NULL; //新結(jié)點(diǎn)b作為第一個(gè)結(jié)點(diǎn)

} else //若不是空表

if(p->data==aData)

//若a是第一個(gè)結(jié)點(diǎn)

{

head=s;

//使新結(jié)點(diǎn)b作為第一個(gè)結(jié)點(diǎn)

s->next=p;

//將結(jié)點(diǎn)a接到新結(jié)點(diǎn)b的后面

}第39頁(yè)/共47頁(yè)

else //若a不是第一個(gè)結(jié)點(diǎn)

{

while(p->data!=aData&&p->next!=NULL)//找結(jié)點(diǎn)a { q=p; //使q指向p所指的結(jié)點(diǎn)

p=p->next; //

p本身指向下一個(gè)結(jié)點(diǎn)

}

if(p->data==aData) //若有結(jié)點(diǎn)a,則q指向的是ak { q->next=s; //將新結(jié)點(diǎn)b插入結(jié)點(diǎn)ak之后

s->next=p; //將結(jié)點(diǎn)a排在新結(jié)點(diǎn)b之后

}else //若沒(méi)有結(jié)點(diǎn)a { p->next=s; //將新結(jié)點(diǎn)b排在鏈表末尾,即

s->next=NULL; //將新存儲(chǔ)區(qū)排在鏈表末尾。

}

}}第40頁(yè)/共47頁(yè)

要在鏈表中刪除結(jié)點(diǎn)a,并釋放被刪除的結(jié)點(diǎn)所占的存儲(chǔ)空間,需要考慮下列幾種情況:(1)若要?jiǎng)h除的結(jié)點(diǎn)a是第一個(gè)結(jié)點(diǎn),則把head指向a的下一個(gè)結(jié)點(diǎn),如圖

(a)所示。(2)若要?jiǎng)h除的結(jié)點(diǎn)a不是第一個(gè)結(jié)點(diǎn),則應(yīng)使a的上一結(jié)點(diǎn)ak-1的指針域指向a的下一個(gè)結(jié)點(diǎn)ak+1,如圖

(b)所示。(3)若空表或要?jiǎng)h除的結(jié)點(diǎn)a不存在,則不作任何改變。4.鏈表結(jié)點(diǎn)的刪除第41頁(yè)/共47頁(yè)//設(shè)aData是要被刪除結(jié)點(diǎn)a中的數(shù)據(jù)成員voidList::DeleteList(intaData){Node*p,*q;p=head;if(p==NULL)return; //若p為空,則返回

if(p->data==aData) //若a是第一個(gè)結(jié)點(diǎn)

{head=p->next; //鏈表頭指向下一個(gè)結(jié)點(diǎn)

deletep; //刪除結(jié)點(diǎn)a

}

else //若a不是第一個(gè)結(jié)點(diǎn)

{第42頁(yè)/共47頁(yè)

while(p->data!=aData&&p->next!=NULL)//找結(jié)點(diǎn)a

{q=p; //使q指向p所指的結(jié)點(diǎn)

p=p->next; //

p本身指向下一個(gè)結(jié)點(diǎn)

}

if(p->data==a

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論