版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
DepartmentofComputerQinghaiUniversityofChina
2010年3月
o第二章基本數(shù)據(jù)結(jié)構(gòu)及其運(yùn)算
2.1數(shù)據(jù)結(jié)構(gòu)的基本概念
2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
2.3線性鏈表及其運(yùn)算
2.4樹(shù)與二叉樹(shù)
O2.1數(shù)據(jù)結(jié)構(gòu)的基本概念
L數(shù)據(jù)結(jié)構(gòu)研究的三個(gè)方面的問(wèn)題:
(1)數(shù)據(jù)集合中數(shù)據(jù)元素間固有的邏輯結(jié)構(gòu);
(2)對(duì)數(shù)據(jù)處理時(shí),各數(shù)據(jù)元素在計(jì)算機(jī)中的存儲(chǔ)關(guān)系
(3)對(duì)各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行的運(yùn)算;
2.目的:
(1)提高數(shù)據(jù)處理的效率
(2)提高數(shù)據(jù)處理的速度
(3)盡量節(jié)省計(jì)算機(jī)存儲(chǔ)空間
o2.1.1兩個(gè)例子
2.1.1兩個(gè)例子
【例】
■無(wú)序表的順序查找46
35167885432933215446
■有序表的對(duì)分查找46
16212933354346547885
【結(jié)論】
數(shù)據(jù)元素在表中的排列順序?qū)Σ檎倚适怯泻艽笥绊憽?/p>
【例】學(xué)生情況登記表以學(xué)號(hào)為順序排列
學(xué)生情況登■
學(xué)號(hào)姓名性別年齡成績(jī)
970156張小明男2086
970157李小W女1983
970158趙凱男1970
970159李啟明男2191
970160劉華寮1878
970161曾小波女1990
970162張軍男1880
9T0163王偉里2065
970164胡濤男1995
970165周敏女2087
970166楊雪輝男2289
970167呂永華男1861
970168梅玲女1793
970169劉健男2075
o2.1.1兩個(gè)例子
成績(jī)?cè)?0分以上的學(xué)生情況登記表
學(xué)號(hào)姓名性別年齡成績(jī)
970159李啟明男2191
970161曾小波女.1990
970164胡濤男1995
970168誨玲女1793
成績(jī)?cè)?0?89分之間的學(xué)生情況登記表
學(xué)號(hào)姓名性別年齡成績(jī)
970156張小明男2086
970157李小W女1983
970162張軍男1880
970165周敏女2087
970166楊雪輝男2289
O2.1.1兩個(gè)例子
成繳在70~79分之間的學(xué)生,痔況登記表
學(xué)號(hào)姓名性別年齡成績(jī)
970158趙凱男1970
970160劉華女1878
970169劉健男2075
成繳在60~69分之間的學(xué)生,皆況登記表
學(xué)號(hào)姓名性別年齡成績(jī)
970163王偉男2065
970167呂永華男1861
【結(jié)論】在對(duì)數(shù)據(jù)進(jìn)行處理時(shí),可以根據(jù)所做的運(yùn)算不
同,將數(shù)據(jù)組織成不同的形式,以便于做該種運(yùn)算,
從而提高數(shù)據(jù)處理的效率。
*數(shù)據(jù)結(jié)構(gòu):是指相互有關(guān)聯(lián)的數(shù)據(jù)元素集合。
*數(shù)據(jù)元素:現(xiàn)實(shí)世界中客觀存在的一切個(gè)體;
*數(shù)據(jù)元素之間的任何關(guān)系都可以用前后件關(guān)系來(lái)描述;
?前后件關(guān)系:是數(shù)據(jù)元素之間的一個(gè)基本關(guān)系;
描述一年四季的季節(jié)名:
春,夏,秋,冬可以作為季節(jié)的數(shù)據(jù)元素;
表示數(shù)值的各個(gè)數(shù):
18,11,35,23,16,…可以作為數(shù)值的數(shù)據(jù)元素;
O2.1.2什么是數(shù)據(jù)結(jié)構(gòu)
1.數(shù)據(jù)的邏輯結(jié)構(gòu)
(1)定義:指反映數(shù)據(jù)元素之間邏輯關(guān)系的數(shù)據(jù)
結(jié)構(gòu)。
①表示數(shù)據(jù)元素的信息;
②表示各數(shù)據(jù)元素之間的前后件關(guān)系。
(2)兩個(gè)要素:
①數(shù)據(jù)元素的集合D;
②反映D中各數(shù)據(jù)元素之間的前后件關(guān)系R。
D二元關(guān)系來(lái)表示
B=(D,R)其中:B表示數(shù)據(jù)結(jié)構(gòu)。
【例】B=(D,R)
D—{春,夏,秋,冬}
R={(春,夏),(夏,秋),(秋,冬)}
說(shuō)明:設(shè)a與b是D中的兩個(gè)數(shù)據(jù),則二元組(a,b)表示a是b
的前件,b是a的后件。
B=(D,R)
D={父親,兒子,女兒}
R={(父親,兒子),(父親,女兒)}
n維向量X=(xpx2,???,xn)也是一種數(shù)據(jù)結(jié)構(gòu)。即
X=(D,R)
D—{xpx2,xj
R={(xjx2),x/}
O2.1.2什么是數(shù)據(jù)結(jié)構(gòu)
②數(shù)據(jù)結(jié)構(gòu)的圖形表示
?數(shù)據(jù)集合D中的每一個(gè)數(shù)據(jù)元素:
用中間標(biāo)有元素值的方框表示(數(shù)據(jù)結(jié)點(diǎn),結(jié)點(diǎn))
*用一條有向線段從前件結(jié)點(diǎn)指向后件結(jié)點(diǎn)。
【例】一年四季數(shù)據(jù)結(jié)構(gòu)的圖形表示
O2.1.2什么是數(shù)據(jù)結(jié)構(gòu)
▼r初】家庭成員間輩份關(guān)系
O2.1.2什么是數(shù)據(jù)結(jié)構(gòu)
【例】用圖形表示數(shù)據(jù)結(jié)構(gòu)B=(D,R),其中:
D=|l<i<7}={dpd2,d3,d4,d5,d6,d7}
R={(dPd3),(d1,d7),(d2,d4),(d3,d6)
O2.1.3什么是數(shù)據(jù)結(jié)構(gòu)
2.數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)(數(shù)據(jù)的物理結(jié)構(gòu))
?數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)空間中的存放形式。
?常用的存儲(chǔ)結(jié)構(gòu)有:
■順序、鏈接、索引等存儲(chǔ)結(jié)構(gòu)。
采用不同的存儲(chǔ)結(jié)構(gòu),其數(shù)據(jù)處理的效率是不同的。
順序存儲(chǔ)結(jié)構(gòu)
鏈接存儲(chǔ)結(jié)構(gòu)
0-2.1.-4線性數(shù)據(jù)結(jié)構(gòu)與非線性數(shù)據(jù)結(jié)構(gòu)一一」
線性結(jié)構(gòu)又稱線性表:
(1)有且只有一個(gè)根結(jié)點(diǎn);
(2)每一個(gè)結(jié)點(diǎn)最多有一個(gè)前件,也最多有一個(gè)后件
非線性結(jié)構(gòu):
如果一個(gè)數(shù)據(jù)結(jié)構(gòu)不是線性結(jié)構(gòu)
不是線性結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)特例
2.2.1線性表及其運(yùn)算
2.2.2棧及其應(yīng)用
2.2.3隊(duì)列及其應(yīng)用
1.什么是線性表(LinearList)
?n維向量(xjx2,…,x)是一個(gè)長(zhǎng)度為n的線性表;
?英文小寫字母表(a,b,c,…,z)是一個(gè)長(zhǎng)度為26的
線性表;
?:.一年中的四個(gè)季節(jié)(春,夏,秋,冬)是一個(gè)長(zhǎng)度為4
的線性表;
矩陣是一個(gè)比較復(fù)雜的線性表;
學(xué)生情況登記表是一個(gè)復(fù)雜的線性表
由若干數(shù)據(jù)項(xiàng)組成的數(shù)據(jù)元素稱為記錄(record)
由多個(gè)記錄構(gòu)成的線性表又稱為文件(file)
學(xué)生情況登記表
姓名學(xué)號(hào)性別年齡健康狀況
王強(qiáng)80035619良好
劉建平80035720
趙軍80036119良好
葛文華800367;21較差
?■?*.*
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
尸11)線性表的定義:
是由n(n》0)個(gè)數(shù)據(jù)元素a:a2,???,組成的一
個(gè)
有限序列,表中的每一個(gè)數(shù)據(jù)元素,除了第一個(gè)外,
有且只有一個(gè)前件,除了最后一個(gè)外,有且只有一個(gè)
后件。即線性表或是一個(gè)空表,或可以表示為:
(a],a?’%,???,a/
?其中:%(i=l,2,…,n)是屬于數(shù)據(jù)對(duì)象的元
素,通常也稱其為線性表中的一個(gè)結(jié)點(diǎn)。
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
(2)非空線性表結(jié)構(gòu)特征:
①有且只有一個(gè)根結(jié)點(diǎn)a1,它無(wú)前件;
②有且只有一個(gè)終端結(jié)點(diǎn)a”,它無(wú)后件;
③除根結(jié)點(diǎn)與終端結(jié)點(diǎn)外,其它所有結(jié)點(diǎn)有且
只有一個(gè)前件,也有且只有一個(gè)后件。
?線性表中結(jié)點(diǎn)的個(gè)數(shù)n稱為線性表的長(zhǎng)度。當(dāng)n
=0時(shí),稱為空表。
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
12.線性表的順序存儲(chǔ)結(jié)構(gòu)
(1)線性表的順序存儲(chǔ)結(jié)構(gòu)基本特點(diǎn):
①所有元素所占的存儲(chǔ)空間是連續(xù)的;
②各數(shù)據(jù)元素在存儲(chǔ)空間中是按邏輯順序依次存
放的。
?線性表中第i個(gè)元素aj在計(jì)算機(jī)存儲(chǔ)空間中的存儲(chǔ)
地址為:ADR(a)=ADR(at)+(i—1)k
?K表示每個(gè)數(shù)據(jù)元素占K個(gè)字節(jié)
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
長(zhǎng)度為n的線性表整型一維數(shù)組
(a1,@2,a,a/存放長(zhǎng)度為8
?一,?一,V(1:12)
順序存儲(chǔ)結(jié)構(gòu)129的線性表
218
?(29,18,56,63,3
存儲(chǔ)地址*
■356
4635,24,31,47)
ADR(ajai占k個(gè)字節(jié)
535
ADR(ax)+k%
占k個(gè)字節(jié)624
■?
??
?■731
847
ADR(aJ?11-l)kax占k個(gè)字力
■■9
*■
■?
10
一
ADR(aJ*6l)ka.占k個(gè)字拈11
■
*
■12
o2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
2)建立空線性表的順序存儲(chǔ)空間(即初始化線
性表的順序存儲(chǔ)空間)
#includenstdlib.hn
voidinitsl(v,m,n)
ET*v;intm,*n;
{v=malloc(m*sizeof(ET));
*n=0;
return;
}
釋放線性表的順序存儲(chǔ)空間free(v);
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
(3)線性表順序存儲(chǔ)結(jié)構(gòu)下的主要運(yùn)算:
①插入②刪除③查找④排序
⑤分解⑥合并⑦復(fù)制⑧逆轉(zhuǎn)
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
V(1:10)V(1:10)V(1:10)
1291.29129
國(guó)一2182;87287
356318318
463456456
535563563
624635635
131724724
847831831
9回f9147914
10101047
(a)長(zhǎng)度為8的線t線(b)插入元素87后(c)又插入元素14后
)2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
輸入:線性表的存儲(chǔ)空---------------------------
PROCEDUREINSL(V,m,n,i,b)
間V(Lm);線性表的
IF(n=m)THEN
長(zhǎng)度n(nCm);插入{OVERFLOW;RETURN}
的位置i(i表示在第iIF(i>n)THENi=n+l
個(gè)元素之前插入);IF(i<l)THENi=l
FORj=nTOiBY-1DOV(j+l)=V(j)
插入的新元素b。
V(i)=b
輸出:插入后的線性表n=n+1
存儲(chǔ)空間V(Lm)及線RETURN
性表的長(zhǎng)度n。
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
voidinsl(v,m,n,i,b)
ETv[],b;intm,*n,i;
{if(*n==m)
{printf(noverflow\nn);return;}
if(i〉*n—1)i=*n+l;
if(i<l)i=l;
for(j=*n;j<=i;j—)v[j]=v[j-l];
v[i—l]=b;
*n=*n+l;
return;
}
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
4.線性表在順序存儲(chǔ)下的刪除運(yùn)算
V(1:10)V(1:10)V(1:10)
129118118
218256256
356;363363
463435435
535524524
624631647
7317477
84788
999
101010
Q)長(zhǎng)度為8的線嫁(b)刪除元素29后⑹又刪除元素31后
O2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
輸入:線性表的存儲(chǔ)空間V(l:m);線性表的長(zhǎng)度n(nWm);
刪除的位置i(表示刪除第i個(gè)元素)。
輸出:刪除后的線性表存儲(chǔ)空間V(Lm)及線性表的長(zhǎng)度n。
PROCEDUREDESL(V,m,n,i)
l.IF(n=0)THEN{UNDERFLOW;RETURN}
2.IF(i<l)or(i>n)THEN
{“Notthiselementinthelist";RETURN)
3.FORj=iTOn-1DOV(j尸V(j+1)
4.n=n—1
5.RETURN
2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
voiddesl(v,m,n,i)
ETv[];intm,*n,i;
{if(*n==0){printf(nunderflow\n'');return;}
if((i<l)11(i>*n))
{printf(nNotthiselementinthelist\nn);return;}
for(j=i;j<=*n-l;j++)v[j-l]=v[j];
*n=*nT;
return;
2.2.2棧及其應(yīng)用
1.什么是棧(stack)
主程序與子程序之間的調(diào)用關(guān)系
MAINSUB1SUB2SUB3SUB4
CALLSUB1CALLSUB2CALLSUB3CALLSUB4...
A:11,111B:……C:……D:…………
ENDRETURNRETURNRETURNRETURN
棧與遞歸.swf
2.2.2棧及其應(yīng)用
棧:限定在一端進(jìn)行插入與刪除的線性表;棧也
被稱為先進(jìn)后出表或后進(jìn)先出表。
棧頂:允許插入與刪除的一端稱為;
棧底:不允許插入與刪除的另一端稱為;
指針top:指示棧頂位置;
指針bottom:指示棧底位置;
2.2.2棧及其應(yīng)用
入棧退棧
1t1
1順序棧(4個(gè)存儲(chǔ)空間).swf
極頂topT
,1
棧底bottomT順序棧(8個(gè)存儲(chǔ)空間).swf
)2.2.2棧及其應(yīng)用
top=0表示??眨籺op=m表示棧滿;
建立空棧的順序存儲(chǔ)空間(即初始化棧的順序
存儲(chǔ)空間);
釋放棧的順序存儲(chǔ)空間時(shí)free(s);
#includenstdlib.hn
voidinit_stack(s,m,top)
ET*s;intm,*top;
{s=malloc(m*sizeof(ET));*top=0;
return;
}
o2.2.2棧及其應(yīng)用
2.棧的順序存儲(chǔ)及其運(yùn)算
S(1:10)S(1:10)S(1:10)
101010
99'9
8topf8Y汨
77Xtopf7X
topf6F6F6F
5E5E5E
4D4D;4D
3C3CC
2B2B<2B
bottomflAbottomflAbottom->1A
Q)有6個(gè)元素的棧G)插入X與丫后的棧(c)退出一個(gè)元素后的棧
PROCEDUREPUSH(S,m,top,x)
IF(top=m)THEN{Stack-OVERFLOW;RETURN}
top=top+1
S(top)=x
RETURN
voidpush(s,m,top,x)
ETs[],x;intm,*top;
{if(*top==m){printf(nStack—overflow\nn);return;}
*top=*top+l;s[*top—l]=x;return;
PROCEDUREPOP(S,m,top,y)
IF(top=0)THEN{Stack-UNDERFLOW;RETURN}
y=S(top)
top=top—1
RETURN
voidpop(s,m,top,y)
ETs[],*y;intm,*top;
{if(*top==0){printf(nStack—underflow\nn);
return;}
*y=s[*top—1];*top=*top—1;return;
}
PROCEDURETOP(S,m,top,y)
IF(top=0)THEN{“Stackempty”;RETURN}
y=S(top)
RETURN
voidtop(s,m,top,y)
ETs[],*y;intm,*top;
{if(*top==0)
{printf(nStackempty\nn);return;}
*y=s[*top—1];return;
)
2.2.3隊(duì)列及其應(yīng)用
“Or什么是隊(duì)列(equeue)
但是指允許在隊(duì)尾進(jìn)行插入、在隊(duì)頭進(jìn)行刪除的線性表;
隊(duì)列又稱為“先進(jìn)先出”(FIFO)或“后進(jìn)后出”
(LILO)的線性表;
front_>
退隊(duì)運(yùn)算(a)Afront_>■front_*-
BBB
CCC
入隊(duì)運(yùn)算(b)rear-0■Drear->DD
—rear_>E
(a)一個(gè)隊(duì)列(b)刪除一個(gè)元素后Q)插入元素E后
⑨隊(duì)列的順序循環(huán)結(jié)構(gòu)采用循
rear-*
環(huán)隊(duì)列形式;
◎■循環(huán)隊(duì)列的初始狀態(tài)為空,
即rear=front=m;
八
O2.2.3隊(duì)列及其應(yīng)用
舊1^環(huán)隊(duì)列及其運(yùn)算
QQ:8)QU:8)Q(1:8)
88X8X
rear_*7FTF7F
6E6E6E
5D5D5D
4C4C4C
3B3B3B
2A2Afront-*-2
front-*-1£ront-*■1Yrear—1Y
rear-*
[a)具有6個(gè)元素的循環(huán)隊(duì)列(b)加入X、Y后(Q退出一個(gè)元素后
o2.2.3隊(duì)列及其應(yīng)用
①當(dāng)front=rear時(shí),兩種情況:
循環(huán)隊(duì)列滿或循環(huán)隊(duì)列空
增加一個(gè)標(biāo)識(shí)S區(qū)別隊(duì)列滿或空
,隊(duì)列空的條件為s=0
隊(duì)列滿的條件為(s=1)且front=rear
o2.2.3隊(duì)列及其應(yīng)用
②建立(初始化)循環(huán)隊(duì)列順序存儲(chǔ)空間
#includenstdlib.hn
voidinit_queue(q,m,front,rear,s)
ET*q;intm,"front,*rear,*s;
{q=malloc(m*sizeof(ET));
*front=m;*rear=m;*s=0;
return;
釋放循環(huán)隊(duì)列的順序存儲(chǔ)空間free(q);
PROCEDUREADDCQ(Q,m,rear,front,s,x)
1.IF(s=l)and(rear=front)THEN
{Queue-OVERFLOW;RETURN}
2.rear=rear+1
3.IF(rear=m+l)THENrear=l
4.Q(rear)=x
5.s=l
6.RETURN
o2.2.3隊(duì)列及其應(yīng)用
voidaddcq(q,m,rear,front,s,x)
ETq[],x;intm,*rear,*front,*s;
(
if((*s==1)&&(*rear==^front))
{printf(^Queue-OVERFLOW\n");return;}
*rear=*rear+1;
if("rear==m+1)^rear=1;
q[^rear-1]=x;*s=1;return;
}
PROCEDUREDELCQ(Q,m,rear,front,s,y)
l.IF(s=0)THEN
{Queue-UNDERFLOW;RETURN)
2.front=front+1
3.IF(front=m+1)THENfront=1
4.y=Q(front)
5.IF(front=rear)THENs=0
6.RETURN
o2.2.3隊(duì)列及其應(yīng)用
voiddelcq(q,m,rear,front,s,y)
ETq[],*y;intm,*rear,"front,*s;
{if(*s==0)
{printf(nQueue-UNDERFLOW\nu);return;}
*front="front+1;
if(*front==m+1)/front=1;
*y=q[*front-1];
if("front==^rear)*s=0;
return;
}
2.2線性表及其順序存儲(chǔ)結(jié)構(gòu)
0一―一―
線性表順序存儲(chǔ)結(jié)構(gòu)的優(yōu)點(diǎn):
>簡(jiǎn)單、運(yùn)算方便,尤其適合小線性表或長(zhǎng)度固定的線
性表;
線性表順序存儲(chǔ)結(jié)構(gòu)的缺點(diǎn):
>插入或刪除一個(gè)元素時(shí),需要移動(dòng)大量的數(shù)據(jù)元素;
>線性表的存儲(chǔ)空間不便于擴(kuò)充;
>不便于隊(duì)存儲(chǔ)空間動(dòng)態(tài)分配;
2.3.1線性鏈表的基本概念
2.3.2線性鏈表的基本運(yùn)算
2.3.3循環(huán)鏈表
存儲(chǔ)序號(hào)數(shù)據(jù)域指針域
2
1V(i)NEXT(i)
線性捱表的一個(gè)存儲(chǔ)結(jié)點(diǎn)
線性鏈表的存儲(chǔ)空間
例如
structnode
{charname[10];/*數(shù)據(jù)域*/
charsex;/*數(shù)據(jù)域*/
structnode*next;/*指針域*/
}
線性捱表的邏輯結(jié)構(gòu)
HEAD_^W1?數(shù)據(jù)2>???_?數(shù)據(jù)n皿
當(dāng)HEAD=NULL(或0)時(shí)為空表
線性捱表的物理狀態(tài)
線性鏈表的邏輯岫
o2.3.1線性鏈表的基本概念
【算法】依次輸出線性鏈表中的各結(jié)點(diǎn)值
輸入:線性鏈表的存儲(chǔ)空間V(Lm)、NEXT(1:m);
線性鏈表的頭指針HEAD。
輸出:依次輸出線性鏈表中各結(jié)點(diǎn)的值。
PROCEDUREPRTLL(HEAD)
j=HEAD
WHILE(j#0)DO
{OUTPUTV(j);j=NEXT(j)}
RETURN
o2.3.1線性鏈表的基本概念
#include"stdlib.h"/*malloc函數(shù)需要*/
structnode/*定義結(jié)點(diǎn)類型列
intd;/*數(shù)據(jù)域*/
structnode/next;/*指針域*/
main()
{structnode*p;/*定義該類型的指針變量P*/
p=(structnode*)malloc(sizeof(structnode));
free(p);
2.3.1線性鏈表的基本概念
#includenstdlib.hnif(head==NULL)head=p
#includenstdio.hnelseq->next=p;q=p;
structnodescanf(n%dn,&x);
{intd;structnode*next;
main()p=head;
{structnode*p,*head,*q;while(p!=NULL)
intx;head=NULL;q=NULL;{printf(i6%5d5\p->d);
scanf(“%d”,&x);q=p;p=p->next;
while(x>0)free(q);
p=(structnode*)malloc
(sizeof(structnode));printf(“\n”);
p->d=x;p->next=NULL;)
(3)單鏈表的缺點(diǎn):每個(gè)結(jié)點(diǎn)只有一個(gè)指向后件的
指針,如果需要找到它的前件必須從指針開(kāi)始重新
尋找;
2.雙向鏈表
O2.3.1線
3.帶鏈的棧
topa。
可利用棧及其運(yùn)算
TOP
t
在從可利用棧取得一個(gè)結(jié)點(diǎn)p
>輸入:可利用棧棧頂指針TOP(默認(rèn));送回可
利用棧的結(jié)點(diǎn)序號(hào)P。
>輸出:結(jié)點(diǎn)P入棧后的可利用棧棧頂指針TOP(默
認(rèn))。
PROCEDUREDISPOSE(p)
NEXT(p)=TOP;TOP=p
RETURN
>輸入:可利用棧的棧頂指針TOP(默認(rèn))。
>輸出:退棧后的可利用棧棧頂指針TOP(默認(rèn));
存放取得結(jié)點(diǎn)序號(hào)的變量P。
PROCEDURENEW(p)
p=TOP;TOP=NEXT(TOP)
RETURN
o2.3.1線性鏈表的基本概念
⑶帶鏈棧的入棧運(yùn)算
輸入:帶鏈棧的棧頂指針top;入棧的元素值X。
輸出:元素X入棧后的帶鏈棧棧頂指針top。
PROCEDUREPUSHLL(top,x)
NEW(p)[從可利用棧取得一個(gè)新結(jié)點(diǎn)]
V(p)=x[置新結(jié)點(diǎn)數(shù)據(jù)域]
NEXT(p)=top[置新結(jié)點(diǎn)指針域]
top=p[改變棧頂指針]
RETURN
o2.3.1線性鏈表的基本概念
#include''stdlib.h''
structnode
{ETd;structnode*next;};
pushll(top,x)
ETx;structnode**top;
{structnode*p;
p=(structnode*)malloc(sizeof(structnode));
p->d=x;p->next=*top;
*top=p;/*改變棧頂指針*/
return;
o2.3.1線性鏈表的基本概念
⑷帶鏈棧的退棧運(yùn)算
>輸入:帶鏈棧的棧頂指針top。
>輸出:退棧后的帶鏈棧棧頂指針top;存放退
出結(jié)點(diǎn)元素值的變量y。
PROCEDUREPOPLL(top,y)
y=V(top)[取出標(biāo)頂元未值]
p=top
top=NEXT(p)[改變棧頂指針]
DISPOSE(p)[被刪除結(jié)點(diǎn)送回可利用棧]
RETURN
2.3.1
#includenstdlib.hn
structnode
{ETd;structnode*next;
popll(top,y)
ETy;structnode**top;
{structnode*p;
y=*top->d;/*取出棧頂元素值刃
p=*top;
*top=p->next;/*改變棧頂指針*/
free(p);return;/*釋放被刪除結(jié)點(diǎn)后返回*/
a2
(b)在帶鏈的隊(duì)列中插入一個(gè)新結(jié)點(diǎn)
aI—aZ
八
rear
front
(c)在帶鏈的隊(duì)列中冊(cè)賒一個(gè)結(jié)點(diǎn)
o2.3.1線性鏈表的基本概念
(1)帶鏈隊(duì)列的入隊(duì)運(yùn)算
?輸入:帶鏈隊(duì)列的隊(duì)尾指針rear;入隊(duì)的新元素x。
A輸出:元素x入隊(duì)后的帶鏈隊(duì)列隊(duì)尾指針rear。
PROCEDUREADDLL(rear,x)
NEW(p)[從可利用棧取得一個(gè)新結(jié)點(diǎn)p]
V(p)=x[置新結(jié)點(diǎn)的數(shù)據(jù)域]
NEXT(p)=0[置新結(jié)點(diǎn)的指針為空]
NEXT(rear)=p[最后一個(gè)結(jié)點(diǎn)的指針指向新結(jié)點(diǎn)]
rear=p[改變隊(duì)尾指針]
RETURN
o2.3.1線性鏈表的基本概念
#include''stdlib.h''
structnode
{ETd;structnode*next;
addll(rear,x)
ETx;structnode**rear;
{structnode*p;
p=(structnode^)malloc(sizeof(structnode));
p->d=x;p->next=NULL;/*置新結(jié)點(diǎn)的數(shù)據(jù)域與指針域*/
^rear->next=p;/*置最后一個(gè)結(jié)點(diǎn)的指針指向新結(jié)點(diǎn)*/
*rear=p;/*改變隊(duì)尾指針*/
return;
o2.3.1線性鏈表的基本概念
⑵帶鏈隊(duì)列的退隊(duì)運(yùn)算
輸入:帶鏈隊(duì)列的排頭指針fronto
?輸出:退隊(duì)后的帶鏈隊(duì)列排頭指針丘ont;存放
退出結(jié)點(diǎn)值的變量y。
PROCEDUREDELLL(front,y)
y=V(front)[取出排頭元素值]
p=front
front=NEXT(front)[改變排頭指針]
DISPOSE(p)[釋放刪除的結(jié)點(diǎn)]
RETURN
。
2.3.1線性鏈表的基本概念
#includenstdlib.hn
structnode
{ETd;structnode*next;};
delll(front,y)
ETy;structnode**front;
{structnode*p;
y=^front->d;/*取出排頭元素值*/
p=*front;
"front=p—>next;/*改變排頭指針*/
free(p);/*釋放被刪除結(jié)點(diǎn)*/
return;
O2.3.2線性鏈表的基本運(yùn)算
⑴在線性鏈表中包含指定元素的結(jié)點(diǎn)之前插入
一個(gè)新元素。
⑵在線性鏈表中刪除包含指定元素的結(jié)點(diǎn)。
(3)將兩個(gè)線性鏈表按要求合并成一個(gè)線性鏈表。
(4)將一個(gè)線性鏈表按要求進(jìn)行分解。
(5)逆轉(zhuǎn)線性鏈表。
(6)復(fù)制線性鏈表。
⑺線性鏈表的排序。
⑻線性鏈表的查找。
o2.3.2線性鏈表的基本運(yùn)算
i.在線性鏈表中查找指定元素
在非空線性鏈表中尋找包含元素X的前一個(gè)結(jié)點(diǎn)p
輸入:非空線性鏈表頭指針HEAD;被尋找元素X。
輸出:非空線性鏈表中包含元素x的前一個(gè)結(jié)點(diǎn)p。
PROCEDURELOOKST(HEAD,x,p)
p=HEAD
WHILE(NEXT(p)^O)and(V(NEXT(p))#)DO
p=NEXT(p)
RETURN
o2.3.2線性鏈表的基本運(yùn)算
structnode
{ETd;structnode*next;};
structnode^lookst(head,x)
ETx;structnode*head;
{structnode*p;
p=head;
while((p—>next!=NULL)&&(((p->next)—>d)!=x))
p=p—>next;
return(p);
}
O2.3.2線性健表的基本運(yùn)算
2.線性鏈表的插入
在鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)下的線性表中
插入一個(gè)新元素。
O2.3.2線性健表的基本運(yùn)算
可利用棧與線性鏈表
HEAD0
(a)原來(lái)的可利用棧與線性鏈表
o2.3.2線性鏈表的基本運(yùn)算
(1)從可利用棧取得一個(gè)結(jié)點(diǎn),設(shè)該結(jié)點(diǎn)號(hào)為P。
并置結(jié)點(diǎn)P的數(shù)據(jù)域?yàn)椴迦氲脑刂礲,即V(p)=b。
⑵在線性鏈表中尋找包含元素x的前一個(gè)結(jié)點(diǎn)q。
(b)從可利用棧取得結(jié)點(diǎn)p,在線性瞰中找到包含元素X的前一個(gè)結(jié)點(diǎn)q
o2.3.2線性鏈表的基本運(yùn)算
(3)將結(jié)點(diǎn)p插入到結(jié)點(diǎn)q之后:
①使結(jié)點(diǎn)P指向包含元素x的結(jié)點(diǎn),即
NEXT(p)=NEXT(q)
②使結(jié)點(diǎn)q的指針域內(nèi)容改為指向結(jié)點(diǎn)P,即
NEXT(q)=p
(c)p插入到q之后
2.3.2線性鏈表的基本運(yùn)算
線性鏈表的插入
輸入:線性鏈表的頭指針HEAD;插入位置處的前
一個(gè)結(jié)點(diǎn)值x;插入的新元素b。
輸出:插入后的線性鏈表。
o2.3.2線性鏈表的基本運(yùn)算
PROCEDUREINSLST(HEAD,x,b)
1.NEW(p)
2.V(p)=b
3.IF(HEAD=0)THEN{HEAD=p;NEXT(p)=0;
RETURN}
4.IF(V(HEAD)=x)THEN
{NEXT(p)=HEAD;HEAD=p;RETURN}
5.LOOKST(HEAD,x,q)
6.NEXT(p)=NEXT(q);NEXT(q)=p
7.RETURN
#includenstdlib.hn
structnode
(
ETd;
structnode*next;
};
o2.3.2線性鏈表的基本運(yùn)算
inslst(head,x,b)
ETx,b;structnode**head;
{structnode*p,*q;
p=(structnode^)malloc(sizeof(structnode));
p—>d=b;
if(^head==NULL)
{*head=p;p->next=NULL;return;}
if((^head—>d)==x)
{p->next=*head;*head=p;return;}
q=lookst(^head,x);
p->next=q->next;q->next=p;return;
O2.3.2線性鏈表的基本運(yùn)算
3.線性鏈表的刪除
在鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)下的線性表中
刪除包含指定元素的結(jié)點(diǎn)。
O2.3.2線性健表的基本運(yùn)算
可利用棧與線性鏈表
Q)原來(lái)的可利用棧與線性鏈表
O2.3.2線性鏈表的基本運(yùn)笄
(1)尋找包含元素X的前一個(gè)結(jié)點(diǎn)q。
則包含元素x的結(jié)點(diǎn)序號(hào)p=NEXT(q)o
(2)將結(jié)點(diǎn)q后的結(jié)點(diǎn)P刪除,即NEXT(q)=NEXT(p)o
(b)從線性鏈表中刪除包含元素x的結(jié)點(diǎn)p后
O2.3.2線性鏈表的基本運(yùn)算
(3)將包含元素x的結(jié)點(diǎn)p送回可利用棧。
(C)將被刪除的結(jié)點(diǎn)P送回可利用棧后
O2.3.2線性鏈表的基本運(yùn)算
線性鏈表的刪除
A輸入:線性鏈表的頭指針HEAD;需刪除的
7E素X?
?輸出:刪除后的線性鏈表。
。
2.3.2線性鏈表的基本運(yùn)算
PROCEDUREDELST(HEAD,x)
l.IF(HEAD=0)THEN
{“Thisisaemptylist!”;RETURN}
2.IF(V(HEAD)=x)THEN
{p=NEXT(HEAD);DISPOSE(HEAD);HEAD=p;
RETURN}
3.LOOKST(HEAD,x,q)
4.IF(NEXT(q)=0)THEN
{uNothisnodeinthelist!99;RETURN}
5.p=NEXT(q);NEXT(q)=NEXT(p)
6.DISPOSE(p)
7.RETURN
2.3.2線性鏈表的基本運(yùn)算
Qude"stdlib.h''
structnode
{ETd;structnode*next;};
delst(head,x)
ETx;structnode**head;
{structnode*p,*q;
if(*head==NULL){printf(nThisisaemptylist!\nn);return;
if((*head->d)==x)
{p=*head->next;free(*head);*head=p;return;}
q=lookst(*head,x);
if(q->next==NULL)
{printf(nNothisnodeinthelist!\nn);return;}
p=q—>next;q—>next=p—>next;/*刪除結(jié)點(diǎn)p*/
free(p);/*釋版結(jié)點(diǎn)p*/return;
⑴在循環(huán)鏈表中增加
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)地埋式噴頭行業(yè)應(yīng)用前景與需求趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)固色劑行業(yè)競(jìng)爭(zhēng)格局及發(fā)展風(fēng)險(xiǎn)分析報(bào)告
- 2024-2030年中國(guó)原煤行業(yè)當(dāng)前經(jīng)濟(jì)形勢(shì)及投資建議研究報(bào)告
- 2024年度醫(yī)療耗材集中采購(gòu)合同細(xì)則3篇
- 2024年度土地征收補(bǔ)償協(xié)議范本3篇
- 眉山職業(yè)技術(shù)學(xué)院《機(jī)械系統(tǒng)設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 茅臺(tái)學(xué)院《陶瓷工藝原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年汽車銷售團(tuán)隊(duì)績(jī)效考核合同范本3篇
- 2024年度智慧城市建設(shè)綜合解決方案投標(biāo)書實(shí)例3篇
- 茅臺(tái)學(xué)院《電工測(cè)試技術(shù)(上)》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東省高等醫(yī)學(xué)院校臨床教學(xué)基地水平評(píng)估指標(biāo)體系與標(biāo)準(zhǔn)(修訂)
- 大孔吸附樹(shù)脂技術(shù)課件
- 空白貨品簽收單
- 建筑電氣施工圖(1)課件
- 質(zhì)量管理體系運(yùn)行獎(jiǎng)懲考核辦法課案
- 泰康人壽養(yǎng)老社區(qū)介紹課件
- T∕CSTM 00584-2022 建筑用晶體硅光伏屋面瓦
- 2020春國(guó)家開(kāi)放大學(xué)《應(yīng)用寫作》形考任務(wù)1-6參考答案
- 國(guó)家開(kāi)放大學(xué)實(shí)驗(yàn)學(xué)院生活中的法律第二單元測(cè)驗(yàn)答案
- CAMDS操作方法及使用技巧
- Zarit照顧者負(fù)擔(dān)量表
評(píng)論
0/150
提交評(píng)論