2023年華中科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告_第1頁
2023年華中科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告_第2頁
2023年華中科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告_第3頁
2023年華中科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告_第4頁
2023年華中科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩134頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

課程實(shí)驗(yàn)報(bào)告

課程名稱:數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)

專業(yè)班級:計(jì)算機(jī)___________________

學(xué)號:___________________________

姓名:___________________________

指導(dǎo)教師:___________________________

報(bào)告日期:2023年1月6日

計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院

目錄

1基于順序存儲結(jié)構(gòu)實(shí)現(xiàn)線性表的基本運(yùn)算錯誤!未定義書簽。

1.1實(shí)驗(yàn)?zāi)康?。錯誤!未定義書簽。

1.2線性表演示系統(tǒng)設(shè)計(jì)。錯誤!未定義書簽。

1.2.1系統(tǒng)總體設(shè)計(jì)。錯誤!未定義書簽。

1.2.2有關(guān)常量和類型定義。錯誤!未定義書簽。

1.2.3算法設(shè)計(jì)錯誤!未定義書簽。

1.3線性表演示系統(tǒng)實(shí)現(xiàn)與測試。錯誤!未定義書簽。

1.3.1系統(tǒng)實(shí)現(xiàn)錯誤!未定義書簽。

1.3.2系統(tǒng)測試。錯誤!未定義書簽。

1.4實(shí)驗(yàn)小結(jié)。錯誤!未定義書簽。

2基于鏈?zhǔn)綄?shí)現(xiàn)線性表的基本運(yùn)算錯誤!未定義書簽。

2.1問題描述錯誤!未定義書簽。

2.2線性表演示系統(tǒng)設(shè)計(jì)。錯誤!未定義書簽。

2.2.1系統(tǒng)總體設(shè)計(jì)錯誤!未定義書簽。

2.2.2有關(guān)常量和類型定義。錯誤!未定義書簽。

2.2.3算法設(shè)計(jì)。錯誤!未定義書簽。

2.3線性表演示系統(tǒng)實(shí)現(xiàn)與測試。錯誤!未定義書簽。

2.3.1系統(tǒng)實(shí)現(xiàn)錯誤!未定義書簽。

2.3.2系統(tǒng)測試。錯誤!未定義書簽。

2.4實(shí)驗(yàn)小結(jié)。錯誤!未定義書簽。

3基于順序存儲結(jié)構(gòu)實(shí)現(xiàn)棧的基本運(yùn)算錯誤!未定義書簽。

3.1實(shí)驗(yàn)?zāi)康?。錯誤!未定義書簽。

3.2棧演示系統(tǒng)設(shè)計(jì)。錯誤!未定義書簽。

3.2.1系統(tǒng)總體設(shè)計(jì)。錯誤!未定義書簽。

3.2.2算法實(shí)現(xiàn)錯誤!未定義書簽。

3.3棧演示系統(tǒng)實(shí)現(xiàn)與測試。錯誤!未定義書簽。

3.3.1程序?qū)崿F(xiàn)。錯誤!未定義書簽。

3.3.2系統(tǒng)測試。錯誤!未定義書簽。

3.4實(shí)驗(yàn)小結(jié)錯誤!未定義書簽。

4基于循環(huán)隊(duì)列存儲結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列的基本運(yùn)算。錯誤!未定義書簽。

4.1問題描述。錯誤!未定義書簽。

4.2.1系統(tǒng)總體設(shè)計(jì)錯誤!未定義書簽。

4.2.2有關(guān)常量和類型定義。錯誤!未定義書簽。

4.2.3算法設(shè)計(jì)。錯誤!未定義書簽。

4.3隊(duì)列演示系統(tǒng)實(shí)現(xiàn)與測試。錯誤!未定義書簽。

4.3.1系統(tǒng)實(shí)現(xiàn)。錯誤!未定義書簽。

4.3.2系統(tǒng)測試。錯誤!未定義書簽。

4.4實(shí)驗(yàn)小結(jié)錯誤!未定義書簽。

5基于二叉鏈表實(shí)現(xiàn)二叉樹的基本運(yùn)算錯誤!未定義書簽。

5.1實(shí)驗(yàn)?zāi)康腻e誤!未定義書簽。

5.2.1系統(tǒng)總體設(shè)計(jì)。錯誤!未定義書簽。

5.2.2有關(guān)常量和類型定義。錯誤!未定義書簽。

5.2.3算法設(shè)計(jì)錯誤!未定義書簽。

5.3二叉樹演示系統(tǒng)實(shí)現(xiàn)與測試。錯誤!未定義書簽。

5.3.1系統(tǒng)實(shí)現(xiàn)錯誤!未定義書簽。

5.3.2系統(tǒng)測試錯誤!未定義書簽。

5.4實(shí)驗(yàn)小結(jié)。錯誤!未定義書簽。

6基于鄰接表實(shí)現(xiàn)圖的基本和常見運(yùn)算錯誤!未定義書簽。

6.1實(shí)驗(yàn)?zāi)康?。錯誤!未定義書簽。

6.2.1系統(tǒng)總體設(shè)計(jì)。錯誤!未定義書簽。

6.2.2有關(guān)常量和類型定義。錯誤!未定義書簽。

6.2.3算法設(shè)計(jì)。錯誤!未定義書簽。

6.3圖演示系統(tǒng)實(shí)現(xiàn)與測試錯誤!未定義書簽。

6.3.1系統(tǒng)實(shí)現(xiàn)錯誤!未定義書簽。

6.3.2系統(tǒng)測試錯誤!未定義書簽。

6.4實(shí)驗(yàn)小結(jié)。錯誤!未定義書簽。

參考文獻(xiàn)錯誤!未定義書簽。

0

1基于順序存儲結(jié)構(gòu)實(shí)現(xiàn)線性表的基本運(yùn)算

1.1實(shí)驗(yàn)?zāi)康?/p>

。通過實(shí)驗(yàn)達(dá)成:(1)加深對線性表的概念、基本運(yùn)算的理解;(2)純熟掌握線性

表的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)的關(guān)系;(3)物理結(jié)構(gòu)采用順序表,純熟掌握線性表的基

本運(yùn)算的實(shí)現(xiàn)。

1.2線性表演示系統(tǒng)設(shè)計(jì)

1.2.1系統(tǒng)總體設(shè)計(jì)

本系統(tǒng)提供一個順序存儲的線性表。

該演示系統(tǒng)提供的操作有:表的初始化、銷毀、清空、判空,求表長、獲取數(shù)

據(jù)元素、查找數(shù)據(jù)元素、獲得前驅(qū)、獲得后繼、創(chuàng)建線性表、插入數(shù)據(jù)元素、刪

除數(shù)據(jù)元素、表的遍歷。

在程序中實(shí)現(xiàn)消息解決,涉及數(shù)據(jù)的輸入和輸出,程序的退出。

1.2.2有關(guān)常量和類型定義

數(shù)據(jù)元素類型的定義:

typedefintstatus;

typedefintElemType;

有關(guān)常量的定義:

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERRORO

#defineINFEASTABLE-1

#defineOVERFLOW-2

#defineLISTINITSIZE100

#defineLISTINCREMENT10

1.2.3算法設(shè)計(jì)

(1)InitaList(&L)

操作結(jié)果:構(gòu)造一個空的線性表。

(2)DestroyList(&L)

初始條件:線性表L已存在。

。操作結(jié)果:銷毀線性表L。

⑶ClearList(&L)

。初始條件:線性表L已存在。

操作結(jié)果:將L重置為空表。

(4)ListEmpty(L)

。初始條件:線性表L已存在。

操作結(jié)果:若L為空表,則返回TRUE,否則返回FALSE。

(5)ListLength(L)

初始條件:線性表已存在。

操作結(jié)果:返回L中數(shù)據(jù)元素的個數(shù)。

(6)GetElem(L,i,&e)

初始條件:線性表已存在,1近iWListLength(L)。

操作結(jié)果:用e返回L中第i個數(shù)據(jù)元素的值。

(7)LocateElem(L,e,compare())

。初始條件:線性表已存在。

操作結(jié)果:返回L中第1個與e滿足關(guān)系compare()關(guān)系的數(shù)據(jù)元素的

。。。位序,若這樣的數(shù)據(jù)元素不存在,則返回值為0。

(8)PriorElem(L,cur_e,&pre_e)

。初始條件:線性表L已存在。

。操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的

。。前驅(qū),否則操作失敗,Pre_e無定義。

(9)NextE1em(L,cur_e,&next_e)

。初始條件:線性表L已存在。

操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回

。。的后繼,否則操作失敗,next_e無定義。

(10)Listinsert(&L,i,e)

。初始條件:線性表L已存在且非空,1WiWListLength(L)+l。

操作結(jié)果:在L的第i個位置之前插入新的數(shù)據(jù)元素e,L的長度加1

(11)ListDelete(&L,i,&e)

。初始條件:線性表L已存在且非空,iWiWListLength(L)。

操作結(jié)果:刪除L的第i個數(shù)據(jù)元素,用e返回其值,L的長度減1.

(12)ListTraverse(L,visit())

初始條件:線性表L已存在。

。操作結(jié)果:依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)visit。。一旦調(diào)用失敗,則操

作失敗。

1.3線性表演示系統(tǒng)實(shí)現(xiàn)與測試

1.3.1系統(tǒng)實(shí)現(xiàn)

編程環(huán)境為VisualStudio2023,程序清單如下:

#define_CRT_SECURE_N0_WARNINGS

/*LinearTable0nSequenceStructure*/

#inc1ude<stdio.h>

#include<ma11oc.h>

#include<stdlib.h>

/*--page10ontextbook-——*/

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASTABLE-1

#defineOVERFLOW-2

typedefintstatus;

typedefintElemType;//數(shù)據(jù)元素類型定義

ooo/*page22ontextbook--*/

#defineLISTJNIT_SIZE100

#defineLISTINCREMENT10

typedefstruct{//順序表(順序結(jié)構(gòu))的定義

。ElemType*e1em;

intlength;

intlistsize;

}SqList;

/*page19ontextbook*/

statusIntiaList(SqList&L);

statusDestroyList(SqList*L);

statusCiearList(SqList&L);

statusListEmpty(SqListL);

intListLength(SqListL);

statusGetElem(SqListL,inti,ElemType&e);

intLocateElem(SqListL,ElemTypee);〃簡化過

statusPriorElem(SqListL,ElemTypecue,E1emType*pre);

statusNextElem(SqListL,E1emTypecue,ElemType*next);

statusListlnsert(SqList*L,inti,ElemTypee);

statusListDelete(SqList*L,inti,E1emType*e);

statusListTrabverse(SqListL);〃簡化過

ElemTypee;

*/

voidmain(void){

SqListL;

“ntop=1,e,cue,pre,next,m;

while(op){

gsystem("cls");

。叩rintf(”\n\n");

。printf(nMenufbrLinearTableOnSequenceStructure

\n“);

6printf("-——————\n");

oprintf(M1%IntiaList7.LocateElem\nn);

printf(n2.DestroyList8.PriorElem\nn);

printf(u3.C1earList9.NextE1em\

nM);

ooprintf("4.ListEmpty10.ListInsert\nn);

eprintf(n5ListLength11.ListDelete\nn);

oprintf("6.GetElem12.ListTrabverse\n");

。printf("0?.Exit\n");

°printf(n———--―—---——\n");

叩rintf("請選擇你的操作[0-12]:");

。scanf(n%d”,&op);

?switch(op)

(

。。case1:

//printf("\n■一—IntiaList功能待實(shí)現(xiàn)!\nH);

一(IntiaList(L)==OK)printf("線性表創(chuàng)建成功!\n");

。elseprintf("線性表創(chuàng)建失敗!\n”);

o^getchar();getchar();

sbreak;

&case2:

^//printf(n\n——DestroyList功能待實(shí)現(xiàn)!\nn);

。if(DestroyList(&L)==OK)printf("線性表銷毀成功!\n”);

。eIseprintf("線性表銷毀失敗!'n");

ggetchar();getchar();

sbreak;

?case3:

W/printf("\n——C1earList功能待實(shí)現(xiàn)!\n”);

“if(C1earList(L)==OK)printf("線性表清空成功!\n”);

gelseprintf("線性表清空失??!\nn);

ooogetchar();getchar();

。?break;

case4:

00//printf(H\n——ListEmpty功能待實(shí)現(xiàn)!\n");

“if(ListEmpty(L)==OK)printf("線性表已清空!\n”);

“eelseprintf(M線性表未清空!\n“);

。?getchar();getchar();

o^break;

。case5:

o“/printf("\n--—?ListLength功能待實(shí)現(xiàn)!\nu);

printf("線性表長度為%d\nListLength(L));

。getchar();getchar();

break;

8case6:

”//printf("\n---GetElem功能待實(shí)現(xiàn)!\n”);

^inti;

?叩rintf("請輸入要查詢的序數(shù):");

“scanf("%d”,&i);

gif(GetElem(L,i,e)==0K)printf(”表中第%d個數(shù)據(jù)為%小口”,i,

e);

elseprintf("查詢失敗!\n");

getchar();getchar();

^break;

case7:

//printf(n\n-LocateElem功能待實(shí)現(xiàn)!\n”);

printf("請輸入要查詢的數(shù)據(jù):\n");

scanf(n%dH,&e);

8m=LocateE1em(L,e);

if(m!=ERROR)

000

叩rintf("L中第一個與查詢數(shù)據(jù)相等的數(shù)據(jù)的位序?yàn)椋\nm);

?<>else

。。printf(H這樣的數(shù)據(jù)元素不存在!\n”);

。getchar();getchar();

力reak;

。。case8:

叩rintf("請輸入要查詢的元素:”);

。scanf(H%d&cue);

Af(PriorElem(L,cue,&pre)==OK)printf("前驅(qū)為%d\n”,pre);

8elseprintf("無此前驅(qū)\nn);

8getchar();getchar();

。break;

case9:

printf("請輸入要查詢的元素:”);

空canf("%d",&cue);

。if(NextE1em(L,cue,&next)==OK)printf(n后驅(qū)為%d\n”,

next);

elseprin1」無此后驅(qū)\11");

80getchar();getchar();

由reak;

。case10:

。叩rintf("請輸入i:n);

。^scanfC'%d",&i);

egprintf("請輸入e:M);

“scanf("%d",&e);

。if(Listlnsert(&L,i,e)==OK)printf("線性表插入成功\n");

e1seprintf("線性表插入失敗\n");

。getchar();getchar();

3break;

。case11:

“printf("請輸入要刪除的元素的序列:”);

08scanf(n%d”,&i);

Mf(ListDelete(&L,i,&e)==OK)printf("元素刪除成功\n”);

eIseprintf(n元素刪除失敗\n”);

o唱etchar();getchar();

3dbreak;

gcase12:

e//printf(M\n-——ListTrabverse功能待實(shí)現(xiàn)!\n”);

if(!ListTrabverse(L))printf(”線性表是空表!\n");

?getchar();getchar();

ebreak;

8case0:

break;

g}〃endofswitch

}//endofwhile

oprintf("歡迎下次再使用本系統(tǒng)!\n");

}//endofmain()

/*--—page23ontextbook————*/

statusIntiaList(SqList&L)

L.e1em=(E1emType*)ma11oc(L1ST_INIT_SIZE*sizeof

(E1emType));

oif(!L.e1em)exit(OVERFLOW);

L.length=0;

oL.listsize=LIST_INIT_SIZE;

??returnOK;

)

statusDestroyList(SqList*L)

(

ofree(L—>e1em);

L->elem=NULL;

^returnOK;

)

statusC1earList(SqList&L)

(

1.length=0;

returnOK;

statusListEmpty(SqListL)

“f(L.1ength==0)

returnTRUE;

oeIse

<>returnERROR;

)

}//判斷表空

intListLength(SqListL)

(

returnL.1ength;

)

statusGetE1em(SqListL,inti,E1emType&e)

(

?e=*(L.elem+i-1);

?returne;

}

intLocateElem(SqListL,E1emTypee)

(

“ntk=1;

?while(*L.e1em!=e)

°(

。L.elem++;

k++;

if(k>L.length)

returnERROR;

returnk;

)

statusPriorElem(SqListL,ElemTypecue,ElemType*pre)

(

“nti;

for(i=1;i<L.1istsize;i++)

(

(L.elem[i]==cue)

6{

8*pre=(int)L.e1em[i-1];

6returnOK;

8}

)

returnFALSE;

}

statusNextElem(SqListL,ElemTypecue,E1emType*next)

(

。intm;

?for(m=0;m<L.listsize-1;m++)

。if(L.elem[m]==cue)

80*next=(int)L.elem[m+1];

8returnOK;

)

)

^returnFALSE;

)

statusListInsert(SqList*L,inti,E1emTypee)

(

oElemType*nw,*t,*p;

if(!L->elem)returnERROR;

oif(i<1||i>L->length+l)returnERR0R;

。if(L->length>=L->listsize)

。{

?nw=(ElemType*)realloc(L->elem,(L—>1istsize+LISTIN

CREMENT)*sizeof(ElemType));

。if(!nw)retumERROR;

0L->elem=nw;

oL->listsize+=LISTINCREMENT;

)

4=&(L->elemLi-1]);

?for(p=&(L—>elem[L->length-11);p>=t;p—)

(

b*(p+1)=*P;

0)

0*t=e;

++L—>length;

^returnOK;

}

statusListDelete(SqList*L,inti,ElemType*e)

(

?ElemType*t,*p;

if(i<1I|i>L—>1ength|I!L->e1em)returnERROR;

叩=&(L->e1em[i-1]);

e=p;

“二&(L—>e1em[L->length-1]);

ofor(p++;pv=t;++p)

8*(p-1)=*p;

--L->1ength;

returnOK;

)

statusListTrabverse(SqListL)

{

,inti;

printf(”\n——al1elements—■

—\n");

for(i=0;i<L.length;i++)printf("%d",L.elem[_i]);

printf(u\n——---end----\nH);

retumL.1ength;

)

1.3.2系統(tǒng)測試

表1一1線性表算法測試用例表

測試用例程序輸入理論結(jié)果運(yùn)行結(jié)果

用例11線性表創(chuàng)建成功線性懶器作皿

用例22線性表銷毀成功卜疆螂作

用例3線性表清空成功適選擇便的操作[歹12]:3

3怦性表清空成功!

F_______________________________1

用例44線性表已清空

遣選!至你的操作

線性袤已清空!

用例55線性表長度為0謂選擇你的操作[0~121:5

線性袤長度為。

用例66表中第1個數(shù)據(jù)為1

翻請翻選擇你球的操嬴作1

表中第一個與查詢數(shù)據(jù)相等的道選擇侵的盤作■12】:7

用例77,青輸入要查詢的數(shù)據(jù),

1中第一個與查詢數(shù)據(jù)檐的故據(jù)的位序?yàn)?

數(shù)據(jù)的位序?yàn)?

前驅(qū)為

用例885L4請選操你的操作]:8

館輸入要查曾的元素:2

單I為5

用例99后驅(qū)為1

請選擇你的提隹[0~12「9

道輸△要查詢的元象2

后驅(qū)為工

用例1010線性表插入成功清欠選擇你的操作[0~123:10

礴入e;9

線程表插入成功

用例1111元素刪除成功請選擇你的操作[。~12]:11

請輸人要劇除的元素的用如1

元差躺除成功

用例1212521請選擇你的操作【。~12]:12

allelenents

521

end

1.4實(shí)驗(yàn)小結(jié)

這是第一次數(shù)據(jù)結(jié)構(gòu)的實(shí)驗(yàn),實(shí)驗(yàn)完畢期間恰逢離散和復(fù)變的考試,復(fù)習(xí)與

實(shí)驗(yàn)一起進(jìn)行讓我壓力不小。好在老師有針對性的在課堂上指點(diǎn)了很多關(guān)鍵點(diǎn),

讓我的實(shí)驗(yàn)順利進(jìn)行。本次實(shí)驗(yàn)加深了我對*L和&L的理解,代碼中仍有不盡如

人意的地方,相信以后會做的越來越好。

2基于鏈?zhǔn)綄?shí)現(xiàn)線性表的基本運(yùn)算

2.1問題描述

。通過實(shí)驗(yàn)達(dá)成:(1)加深對線性表的概念、基本運(yùn)算的理解;(2)純熟掌握線性

表的邏輯結(jié)構(gòu)與物理結(jié)構(gòu)的關(guān)系;(3)物理結(jié)構(gòu)采用帶表頭結(jié)點(diǎn)的單鏈表,純熟

掌握線性表基本運(yùn)算的實(shí)現(xiàn)。

2.2線性表演示系統(tǒng)設(shè)計(jì)

2.2.1系統(tǒng)總體設(shè)計(jì)

本系統(tǒng)提供一個鏈?zhǔn)酱鎯Φ木€性表。

該演示系統(tǒng)提供的操作有:表的初始化、銷毀、清空、判空,求表長、獲取

數(shù)據(jù)元素、查找數(shù)據(jù)元素、獲得前驅(qū)、獲得后繼、創(chuàng)建線性表、插入數(shù)據(jù)元素、

刪除數(shù)據(jù)元素、表的遍歷。

在程序中實(shí)現(xiàn)消息解決,涉及數(shù)據(jù)的輸入和輸出,程序的退出。

2.2.2有關(guān)常量和類型定義

數(shù)據(jù)元素類型的定義:

typedefintstatus;

typedefintElemType;

有關(guān)常量的定義:

#defineTRUE1

#defineFALSE0

#defineOK1

#defineERROR0

#defineINFEASTABLE-1

#defineOVERFLOW-2

#defineLIST_INIT_SIZE100

#defineLISTINCREMENT10

2.2.3算法設(shè)計(jì)

(1)InitaList(&L)

。操作結(jié)果:構(gòu)造一個空的單鏈表。

(2)DestroyList(&L)

初始條件:單鏈表L已存在。

操作結(jié)果:銷毀單鏈表L。

(3)ClearList(&L)

初始條件:單鏈表L已存在。

操作結(jié)果:將L重置為空單鏈表。

(4)ListEmpty(L)

初始條件:單鏈表L已存在。

。操作結(jié)果:若L為空單鏈表,則返回TRUE,否則返回FALSE.

(5)ListLength(L)

初始條件:單鏈表已存在。

。操作結(jié)果:返回L中數(shù)據(jù)元素的個數(shù)。

(6)GetElem(L,i,&e)

。初始條件:單鏈表已存在,iWiWListLength(L)。

。操作結(jié)果:用e返回L中第i個結(jié)點(diǎn)的數(shù)據(jù)元素值。

(7)LocateElem(L,e,compare())

初始條件:單鏈表已存在。

。操作結(jié)果:返回L中第1個與e滿足關(guān)系compare()的數(shù)據(jù)元素結(jié)點(diǎn)的指

。。。針,若這樣的數(shù)據(jù)元素不存在,則返回值為NULL。

(8)PriorElem(L,cur_e,&pre_e)

初始條件:單鏈表L已存在。

。操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是第一個,則用pre_e返回它的

。前驅(qū),否則操作失敗,pre_e無定義。

(9)NextElem(L,cur_e,&next_e)

初始條件:單鏈表L已存在。

。操作結(jié)果:若cur_e是L的數(shù)據(jù)元素,且不是最后一個,則用next_e返回它

。。8的后繼,否則操作失敗,next_e無定義。

(10)ListInsert(&L,i,e)

。初始條件:單鏈表L已存在且非空,iWiWListLength(L)+lo

操作結(jié)果:在L的第i個結(jié)點(diǎn)之前插入新數(shù)據(jù)元素e的結(jié)點(diǎn)。

(ll)ListDe1ete(&L,i,&e)

初始條件:單鏈表L已存在且非空,1WiWListLength(L)。

。操作結(jié)果:刪除L第i個數(shù)據(jù)元素的結(jié)點(diǎn),用e返回其結(jié)點(diǎn)數(shù)據(jù)元素的值。

(12)ListTraverse(L,visit())

初始條件:單鏈表L已存在。

。操作結(jié)果:依次對L的每個數(shù)據(jù)元素調(diào)用函數(shù)visit()。一旦調(diào)用失敗,則操

88作失敗。

2.3線性表演示系統(tǒng)實(shí)現(xiàn)與測試

2.3.1系統(tǒng)實(shí)現(xiàn)

編程環(huán)境為VisualStudio2023,程序清單如下:

#define_CRT_SECURE_NO_WARNINGS

/*LinearTableOnSequeneeStructure*/

#inc1ude<stdio.h>

#include<malloc.h>

#include<stdlib.h>

/*--page10ontextbook——一一一*/

#defineTRUE1

#defineFALSEO

#defineOK1

#defineERROR0

#defineINFEASTABLE-1

#defineOVERFLOW-2

typedefintstatus;

typedefintElemType;//數(shù)據(jù)元素類型定義

oo/*——---page22ontextbook—*/

#defineLIST_INIT_SIZE100

#defineLISTINCREMENT10

typedefstructListNode{//順序表(順序結(jié)構(gòu))的定義

ElemTypedata;

structListNode*next;

}ListNode,*pListNode;

inte;

ListNodeL;

pListNodepL=&L;

statusIntiaList(pListNode&Lp){

eLp=(pListNode)ma11oc(sizeof(ListNode));

Lp->data=0;

?Lp->nextNULL;

pL=Lp;

returnOK;

}

statusDestroyList(pListNode&Lp){

if(!Lp)returnERROR;

Lp—>data=0;

if(Lp->next==NULL)

。{

ofree(Lp->next);

。free(Lp);

)

吒1se

。{

。DestroyList(Lp—>next);

Lp->next=NULL;

efree(Lp);

}

return0K;

)

statusC1earList(pListNode&Lp){

if(!Lp)returnERROR;

Lp—>data=0;

if(Lp->next==NULL)

近ee(Lp);

else

°(

eClearList(Lp—>next);

^free(Lp);

)

returnOK;

)

statusListEmpty(ListNodeL){

。if(L.data==0)

eturnTRUE;

吒Ise

8returnFALSE;

)

intListLength(ListNodeL){

returnL.data;

)

statusGetElem(ListNodeL,nti,ElemType*e)

if(i<l|Ii>L.data)

ereturnERROR;

叩ListNodep=L.next;

。while(-i)

p=p->next;

o}

°(*e)=p->data;

?returnOK;

statuscompare(ElemTypee,ElemTypef)

(

oif(f==e)returnTRUE;

oelsereturnFALSE;

)

statusLocateE1em(ListNodeL,ElemTypeestatus(*compa

rep)(E1emTypee,ElemTypef))

(

if(L.next==NULL)

greturnERROR;

pListNodep=L.next;

。inti=1;

while(p)

?if((*comparep)(e,p->data))

returni;

?else

°i++;

eP-p->next;

00|

°)

oreturn0;

)

statusPriorElem(ListNodeL,ElemTypecur_e,E1emType*pre

e)

(

^?if(L.data==0)

returnERROR;

if(L.next—>data=cur_e)

returnERROR;

叩ListNodepri_p=L.next,cur_p=L.next->next;

while((cur_p->data!=cur_e)&&cur_p)

b{

opri—p=cur_p;

8cur_p=cur_p->next;

)

if(cur_p->data==cur_e)

{

e*pre_e=pri_p->data;

returnOK;

0)

?elsereturnERROR;

statusNextE1em(ListNodeL,ElemTypecur_e,E1emType*next

e)

(

if(L.next==0)

oreturnERROR;

pListNodep=L.next;

while(p->data!=cur_e&&p->next)

。p=p->next;

if(!(P->next))returnERROR;

?else//if(p->data==cur_e)

{

g*next_e=p->next->data;

returnOK;

statusListlnsert(pListNodeLp,inti,E1emTypee){

“f(i<l||i>Lp->data+1)

。returnERROR;

叩ListNodep=(pListNode)malloc(sizeof(ListNode));

if(Lp->data==0){

Lp—>next=p;

p->data=e;

。叩―>next=NULL;

。Lp->data=1;

returnOK;

°)

pListNodepl=Lp->next;

whi1e(pl->next)pl=pl->next;

p1—>next=p;

叩,data=e;

p->next=NULL;

Lp->data++;

retumOK;

)

statusListDe1ete(pListNodeLp,inti,ElemType*e)

(

if(Lp->data)

。{

?if(iV1I|i>Lp->data)

。?>returnERROR;

8PListNodep1=Lp,p2=Lp->next;

^intj=1;

owhile(p2&&j<i)

{

。。p1二p2;

。。叩2=p2->next;

j++;

?}

pl->next=p2->next;

*ep2->data;

。Lp->data—;

free(p2);

8returnOK;

}

o「eturnERROR;

)

voidvisit(E1emTypee,inti){

printf("對第%d個元素調(diào)用visit函數(shù):元素值為%d\n\n",i+1,e);

)

statusListTrabverse(ListNodeL,void(*visitp)(ElemTypee,i

nti))

(

if(!L.data)returnERROR;

。pListNodep=L.next;

inti=0;

叩rintf("\n——對所有元素調(diào)用函數(shù)visit-----------

-\n");

°while(p)/〃依次對每個元素調(diào)用visit函數(shù)

(

g(*visitp)(p—>data,i++);

op=p->next;

)

oprintf("\n---end---————\n");

retumOK;

)

/*_-_—_____一—一__—__—_一一__—_———__—,-*/

voidmain(void){

ointop=1,e,cue,pre,next,m;

awhile(op){

system(ncIsn);

oprintf(M\n\nn);

printf(uMenuforLinearTableOnSequenceStructu

re\nu);

printf(n——————\n");

sprintf(n。1.IntiaList7.LocateElem\nn);

sprintf(“。2.DestroyList8.PriorE1em\n");

printf(n3.CiearList9.NextElem\nn);

printf(M4.ListEmpty10.ListInsert\n");

oprintf("5ListLength11.ListDelete\nn);

gprintf("36.GetElem12.ListTrabverse\n");

。printf(M。0.Exit\nn);

■\nn);

printf("請選擇你的操作[0~12]:");

seanf("%d",&op);

^switch(op)

gcase1:

g//printf("\n——IntiaList功能待實(shí)現(xiàn)!\n”);

if(IntiaList(pL)==OK)printf("線性表創(chuàng)建成功!

\n");

。eIseprintf(H線性表創(chuàng)建失敗!\nn);

。getchar();getchar();

gbreak;

ocase2:

g//printf("\n--DestroyList功能待實(shí)現(xiàn)!\n”);

oooif(DestroyList(pL)==OK)printf(H線性表銷毀成功!\n“);

匕elseprintff線性表銷毀失敗!\n”);

。<>getchar();getchar();

sbreak;

^case3:

n

ooo//printfC\n--CiearList功能待實(shí)現(xiàn)!\n);

if(ClearList(pL)==OK)printf("線性表清空成功!\n");

3e1seprintf("線性表清空失敗!\nn);

。getchar();getchar();

“break;

case4:

。//printf(H\n----ListEmpty功能待實(shí)現(xiàn)!\n”);

if(ListEmpty(L)==OK)printf("線性表已清空!\n”);

。elseprintf("線性表未清空!\n”);

“getchar();getchar();

3break;

ocase5:

00//printf("\n-一一-ListLength功能待實(shí)現(xiàn)!\n");

。。printf("線性表長度為%d\n",ListLength(L));

“getchar();getchar();

。break;

“case6:

。//printf("\n--GetElem功能待實(shí)現(xiàn)!\n");

。inti;

。printf("請輸入要查詢的序數(shù):");

“scanf("%d",&i);

“if(GetElem(L,i,&e)==0K)printf("表中第%d個數(shù)據(jù)為%

d\n",i,e);

ooelseprintf("查詢失??!\n");

ggetchar();getchar();

break;

?case7:

ooo//printf("\n-LocateElem功能待實(shí)現(xiàn)!\n");

printf("請輸入要查詢的數(shù)據(jù):\n");

。scanf("%d",&e);

。=LocateElem(L,e,compare);

。if(m!=ERROR)

0{

3叩rintf("L中第一個與查詢數(shù)據(jù)相等的數(shù)據(jù)的位序?yàn)椋\n",m);

?}

e1se

。I

如printf("這樣的數(shù)據(jù)元素不存在!\n");

00

ogetchar();getchar();

8bbreak;

case8:

,叩rintf("請輸入要查詢的元素:");

scanf('*%d”,&cue);

“if(Prior

溫馨提示

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

最新文檔

評論

0/150

提交評論