《數(shù)據(jù)結(jié)構(gòu)》(C語言版)嚴(yán)蔚敏著-實驗指導(dǎo)_第1頁
《數(shù)據(jù)結(jié)構(gòu)》(C語言版)嚴(yán)蔚敏著-實驗指導(dǎo)_第2頁
《數(shù)據(jù)結(jié)構(gòu)》(C語言版)嚴(yán)蔚敏著-實驗指導(dǎo)_第3頁
《數(shù)據(jù)結(jié)構(gòu)》(C語言版)嚴(yán)蔚敏著-實驗指導(dǎo)_第4頁
《數(shù)據(jù)結(jié)構(gòu)》(C語言版)嚴(yán)蔚敏著-實驗指導(dǎo)_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《數(shù)據(jù)結(jié)構(gòu)》實驗指導(dǎo)及報告書

/學(xué)年第一學(xué)期

姓名:________________

學(xué)號:______________

班級:______________

指導(dǎo)教師:______________

數(shù)學(xué)與統(tǒng)計學(xué)院

2011

預(yù)備實驗C語言的函數(shù)數(shù)組指針結(jié)構(gòu)體知識

一、實驗?zāi)康?/p>

1、復(fù)習(xí)C語言中函數(shù)、數(shù)組、指針、結(jié)構(gòu)體與共用體等的概念。

2、熟悉利用C語言進(jìn)行程序設(shè)計的一般方法。

二、實驗預(yù)習(xí)

說明以下C語言中的概念

1、函數(shù):

2、數(shù)組:

3、指針:

4、結(jié)構(gòu)體

5、共用體

三、實驗內(nèi)容和要求

1、調(diào)試程序:輸出100以內(nèi)所有的素數(shù)(用函數(shù)實現(xiàn))。

#include<>

intisprime(intn){/*判斷一個數(shù)是否為素數(shù)*/

intm;

for(m=2;01*01<=0;m++)

if(n%m=0)return0;

return1;

}

intmain(){/*輸出100以內(nèi)所有素數(shù)*/

inti;printf("\nH);

for(i=2;i<100;i++)

if(isprime(i)==1)printf("%4d",i);

return0;

1

運行結(jié)果:

2、調(diào)試程序:對一維數(shù)組中的元素進(jìn)行逆序排列。

#include<>

#defineN10

intmain(){

inta[N]={0,1,2,3,4,5,6,7,8,9],i.temp;

printf(H\ntheoriginalArrayis:\n");

for(i=0;i<N;i++)

printf("%4d",a[i]);

for(匚0;i<N/2;i++){/*交換數(shù)組元素使之逆序*/

temp=a[i];

a[i]=a[N-i-1];

a[N-i-1]=temp;

)

printf("\nthechangedArrayis:\n");

for(i=0;i<N;i++)

printf("%4d",a[i]);

return0;

運行結(jié)果:

3、調(diào)試程序:在二維數(shù)組中,若某一位置上的元素在該行中最大,而在該列中最小,則該

元素即為該二維數(shù)組的一個鞍點。要求從鍵盤上輸入一個二維數(shù)組,當(dāng)鞍點存在時,把鞍點

找出來。

#incIude<>

#defineM3

#defineN4

intmain(){

inta[M][N],i,j,k;

printf("\n請輸入二維數(shù)組的數(shù)據(jù):\n”);

for(i=0;i<M;i++)

for(j=0;j<N;j++)

scanf("%d",&a[i][j]);

for(i=0;i<M;i++){/*輸出矩陣*/

for(j=0:j<N;j++)

printf("%4d",a[i][j]);

printf("\n");

)

for(i=0;i<M;i++){

k=0;

for(j=1;j<N;j++)/*找出第i行的最大值*/

if(a[i][j]>a[i][k])

k=j;

for(j=0;j<M;j++)/*判斷第i行的最大值是否為該列的最小值*/

if(a[j][k]<a[i][k])

break;

if(j==M)/*在第i行找到鞍點*/

printf("%d,%d,%d\n",a[i][k],i,k);

)

return0;

)

運行結(jié)果:

4、調(diào)試程序:利用指針輸出二維數(shù)組的元素。

#incIude<>

intmain(){

inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int*p;

for(p=a[0];p<a[0]+12;p++){

if((p_a[0])%4==0)printf("\n");

printf("%4d",*p);

)

return0;

)

運行結(jié)果:

5、調(diào)試程序:設(shè)有一個教師與學(xué)生通用的表格,教師的數(shù)據(jù)有姓名、年齡、職業(yè)、教研室

四項,學(xué)生有姓名、年齡、專業(yè)、班級四項,編程輸入人員的數(shù)據(jù),再以表格輸出。

#incIude<>

#defineN10

structstudent{

charname[8];/*姓名*/

intage;/*年齡*/

charjob;/*職業(yè)或?qū)I(yè),用s或t表示學(xué)生或教師*/

union{

intcIass;/*班級*/

charoffice[10];/*教研室*/

Jdepa;

}stu[N];

intmain(){

inti;intn;

printf("\n請輸入人員數(shù)?10):\n");

scanf("%d",&n);

for(i=0;i<n;i++){/*輸入n個人員的信息*/

printf("\n請輸入第%(1人員的信息:(nameagejobclass/office)\nH,i+1);

scanf("%s,%d,%c",stu[i].name,&stu[i].age,&stu[i].job);

if(stu[i].job==,s')

scanf("%d",&stu[i].;

eIse

scanf("%sH,stu[i].;

)

printf("nameagejobcIass/officeM);

for(i=0;i<n;i++){/*輸出*/

if(stu[i].job=,s')

printf("%s%3d%3c%d\n",stu[i].name,stu[i].age,stu[i].job,stu[i].;

else

printf("%s%3d%3c%s\n",stu[i].name,stu[i].age,stu[i].job,stu[i].;

)

輸入的數(shù)據(jù):2

Wang19s99061

Li36tcomputer

運行結(jié)果:

四、實驗小結(jié)

五、教師評語

實驗一順序表與鏈表

一、實驗?zāi)康?/p>

1、掌握線性表中元素的前驅(qū)、后續(xù)的概念。

2、掌握順序表與鏈表的建立、插入元素、刪除表中某元素的算法。

3、對線性表相應(yīng)算法的時間復(fù)雜度進(jìn)行分析。

4、理解順序表、鏈表數(shù)據(jù)結(jié)構(gòu)的特點(優(yōu)缺點)。

二、實驗預(yù)習(xí)

說明以下概念

1、線性表:

2、順序表:

3、鏈表:

三、實驗內(nèi)容和要求

1、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結(jié)果。

#include<>

#incIude<>

#defineERROR0

#defineOK1

#defineINIT_SIZE5/*初始分配的順序表長度*/

#defineINCREM5/*溢出時,順序表長度的增量*/

typedefintElemType;/*定義表元素的類型*/

typedefstructSqIist{

ElemType*sIist;/*存儲空間的基地址*/

intlength;/*順序表的當(dāng)前長度*/

intIistsize;/*當(dāng)前分配的存儲空間*/

1SqIist;

intInitList_sq(SqIist*L);/**/

intCreateList_sq(SqIist*L,intn);/**/

intListInsert_sq(SqIist*L,intiFElemTypee);/**/

intPrintList_sq(Sqlist*L);/*輸出順序表的元素*/

intListDeIete_sq(SqIist*L,inti);/*刪除第i個元素*/

intListLocate(SqIist*LtEIemTypee);/*查找值為e的元素*/

intInitList_sq(SqIist*L){

L->sIist=(EIemType*)maIIoc(INIT_SIZE*sizeof(EIemType));

if(!L->sIist)returnERROR;

L->Iength=0;

L->listsize=INIT_SIZE;

returnOK;

}/"InitList*/

intCreateList_sq(SqIist*L,intn){

ElemTypee;

inti;

for(i=0;i<n;i++){

printf("inputdata%d",i+1);

scanf("%d",&e);

if(!Listlnsert_sq(L,i+1,e))

returnERROR;

returnOK;

}/*CreateList*/

/*輸出順序表中的元素*/

intPrintList_sq(SqIist*L){

inti;

for(i=1;i<=L->length;i++)

printf("%5d"FL->sIist;

returnOK;

}/*PrintList*/

intListInsert_sq(SqIist*L,inti,EIemTypee){

intk;

if(i<1||i>L->Iength+1)

returnERROR;

if(L->Iength>=L->Iistsize){

L->sIist=(EIemType*)reaIIoc(L->sIist,

(INIT_SIZE+INCREM)*sizeof(ElemType));

if(!L->sIist)

returnERROR;

L->listsize+=INCREM;

)

for(k=L->Iength-1;k>=i-1;k—){

L->slist[k+1]=L->slist[k];

)

L->sIist[i-1]=e;

L->length++;

returnOK;

}/*ListInsert*/

/*在順序表中刪除第i個元素*/

intListDeIete_sq(SqIist*L,inti){

1

/*在順序表中查找指定值元素,返回其序號*/

intListLocate(SqIist*L,EIemTypee){

}

intmain(){

SqIistsI;

intn,m,k;

printf("pleaseinputn:'*);/*輸入順序表的元素個數(shù)*/

scanf("%d",&n);

if(n>0){

printf("\n1-CreateSqIist:\n");

InitList_sq(&sI);

CreateList_sq(&sI,n);

printf("\n2-PrintSqlist:\n");

PrintList_sq(&sI);

printf("\npIeaseinputinsertlocationanddata:(Iocation,data)\n");

scanf("%d,%d",&m,&k);

Listlnsert_sq(&sI,m,k);

printf("\n3-PrintSqlist:\n");

PrintList_sq(&sI);

printf("\n");

)

eIse

printf("ERROR");

return0;

)

運行結(jié)果

算法分析

2、為第1題補(bǔ)充刪除和查找功能函數(shù),并在主函數(shù)中補(bǔ)充代碼驗證算法的正確性。

刪除算法代碼:

運行結(jié)果

算法分析

查找算法代碼:

運行結(jié)果

算法分析

3、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結(jié)果。

#include<>

#include<>

#defineERROR0

#defineOK1

typedefintElemType;/*定義表元素的類型*/

typedefstructLNode{/*線性表的單鏈表存儲*/

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

LinkListCreateList(intn);/**/

voidPrintList(LinkListL);/*輸出帶頭結(jié)點單鏈表的所有元素*/

intGetElem(LinkListL,inti,EIemType*e);/**/

LinkListCreateList(intn){

LNode*p,*q,*head;

inti;

head二(LinkList)maIIoc(sizeof(LNode));head->next=NULL;

p=head;

for(i=0;i<n;i++){

q=(LinkList)maIIoc(sizeof(LNode));printf("inputdata%i:",i+1);

scanf("%d",&q->data);/*輸入元素值*/

q->next=NULL;/*結(jié)點指針域置空*/

p->next=q;/*新結(jié)點連在表末尾*/

p=q;

)

returnhead;

}/*CreateList*/

voidPrintList(LinkListL){

LNode*p;

p=L->next;/*p指向單鏈表的第1個元素*/

while(p!=NULL){

printf("%5d",p->data);

p=p->next;

}/*PrintList*/

intGetElem(LinkListL,inti,EIemType*e){

LNode*p;intj=1;

p=L->next;

while(p&&j<i){

p=p->next;j++;

)

if(!p||j>i)

returnERROR;

*e=p->data;

returnOK;

}/*GetElem*/

intmain(){

intn,i;ElemTypee;

LinkListL二NULL;/*定義指向單鏈表的指針*/

printf(,rpleaseinputn:;/*輸入單鏈表的元素個數(shù)*/

scanf&n);

if(n>0){

printf("\n1-CreateLinkList:\nn);

L=CreateList(n);

printf("\n2-PrintLinkList:\n");

PrintList(L);

printf("\n3-GetEIemfromLinkList:\n");

printf("inputi=");

scanf("%d",&i);

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

printf("No%iis%d",i,e);

eIse

printf("notexists");

}eIse

printf("ERROR");

return0;

)

運行結(jié)果

算法分析

4、為第3題補(bǔ)充插入功能函數(shù)和刪除功能函數(shù)。并在主函數(shù)中補(bǔ)充代碼驗證算法的正確性。

插入算法代碼:

運行結(jié)果

算法分析

刪除算法代碼:

運行結(jié)果

算法分析

以下為選做實驗:

5、循環(huán)鏈表的應(yīng)用(約瑟夫回環(huán)問題)

n個數(shù)據(jù)元素構(gòu)成一個環(huán),從環(huán)中任意位置開始計數(shù),計到m將該元素從表中取出,重復(fù)上

述過程,直至表中只剩下一個元素。

提示:用一個無頭結(jié)點的循環(huán)單鏈表來實現(xiàn)n個元素的存儲。

算法代碼

6、設(shè)一帶頭結(jié)點的單鏈表,設(shè)計算法將表中值相同的元素僅保留一個結(jié)點。

提示:指針P從鏈表的第一個元素開始,利用指針q從指針P位置開始向后搜索整個鏈表,

刪除與之值相同的元素;指針P繼續(xù)指向下一個元素,開始下一輪的刪除,直至p==null

為至,既完成了對整個鏈表元素的刪除相同值。

算法代碼

四、實驗小結(jié)

五、教師評語

實驗二棧和隊列

一、實驗?zāi)康?/p>

1、掌握棧的結(jié)構(gòu)特性及其入棧,出棧操作;

2、掌握隊列的結(jié)構(gòu)特性及其入隊、出隊的操作,掌握循環(huán)隊列的特點及其操作。

二、實驗預(yù)習(xí)

說明以下概念

1、順序棧:

2、鏈棧:

3、循環(huán)隊列:

4、鏈隊

三、實驗內(nèi)容和要求

1、閱讀下面程序,將函數(shù)Push和函數(shù)Pop補(bǔ)充完整。要求輸入元素序列12345e,運

行結(jié)果如下所示。

#include<>

#incIude<>

#defineERROR0

#defineOK1

#defineSTACK,INT_SIZE10/*存儲空間初始分配量*/

#defineSTACKINCREMENT5/*存儲空間分配增量*/

typedefintElemType;/*定義元素的類型*/

typedefstruct{

ElemType*base;

ElemType*top;

intstacksize;/*當(dāng)前已分配的存儲空間*/

}SqStack;

intInitStack(SqStack*S);/*構(gòu)造空棧*/

intpush(SqStack*S,ElemTypee);/*入棧*/

intPop(SqStack*S,EIemType*e);/*出棧*/

intCreateStack(SqStack*S);/*創(chuàng)建棧*/

voidPrintStack(SqStack*S);/*出棧并輸出棧中元素*/

intInitStack(SqStack*S){

S->base=(ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));

if(!S->base)returnERROR;

S->top=S->base;

S->stacksize=STACK_INT_SIZE;

returnOK;

}/*lnitStack*/

intPush(SqStack*S,ElemTypee){

}/*Push*/

intPop(SqStack*S,ElemType*e){

}/*Pop*/

intCreateStack(SqStack*S){

inte;

if(InitStack(S))

printf("InitSuccess!\n");

else{

printf("InitFail!\nH);

returnERROR;

)

printf(ninputdata:(Terminatedbyinputingacharacter)\n");

n

while(scanf("%df&e))

Push(S,e);

returnOK;

}/*CreateStack*/

voidPrintStack(SqStack*S){

ElemTypee;

while(Pop(S,&e))

printf("%3d",e);

}/*Pop_and_Print*/

intmain(){

SqStackss;

printf("\n1"createStack\n");

CreateStack(&ss);

printf("\n2-Pop&Print\n");

PrintStack(&ss);

return0;

1

算法分析:輸入元素序列12345,為什么輸出序列為54321體現(xiàn)了棧的什么特

2、在第1題的程序中,編寫一個十進(jìn)制轉(zhuǎn)換為二進(jìn)制的數(shù)制轉(zhuǎn)換算法函數(shù)(要求利用棧來

實現(xiàn)),并驗證其正確性。

實現(xiàn)代碼

驗證

3、閱讀并運行程序,并分析程序功能。

#include<>

#incIude<>

#incIude<>

#defineM20

#defineeIemtypechar

typedefstruct

elemtypestack[M];

inttop;

)

stacknode;

voidinit(stacknode*st);

voidpush(stacknode*st,eIemtypex);

voidpop(stacknode*st);

voidinit(stacknode*st)

(

st->top=0;

)

voidpush(stacknode*stteIemtypex)

(

if(st->top=M)

printf("thestackisoverfIow!\n");

else

(

st->top=st->top+1;

st->stack[st->top]=x;

)

)

voidpop(stacknode*st)

(

if(st->top>0)st->top-;

eIseprintf("StackisEmpty!\n,5);

)

intmain0

chars[M];

inti;

stacknode*sp;

printf("createaemptystack!\n");

sp=maIIoc(sizeof(stacknode));

init(sp);

printf(ninputaexpression:\n");

gets(s);

for(i=0;i<strlen(s);i++)

(

if(s[i]=*(1)

push(sp,s[i]);

if(s[i]==')')

pop(sp);

)

if(sp->top-0)

printf("'('match')'!\n");

eIse

printf("'(*notmatch')'!\n");

return0;

輸入:2+((c-d)*6-(f-7)*a)/6

運行結(jié)果:

輸入:a-((c-d)*6-(s/3-x)/2

運行結(jié)果:

程序的基本功能:

以下為選做實驗:

4、設(shè)計算法,將一個表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,并按照后綴表達(dá)式進(jìn)行計算,得出表達(dá)式

得結(jié)果。

實現(xiàn)代碼

5、假設(shè)以帶頭結(jié)點的循環(huán)鏈表表示隊列,并且只設(shè)一個指針指向隊尾結(jié)點(不設(shè)隊頭指針),

試編寫相應(yīng)的置空隊列、入隊列、出隊列的算法。

實現(xiàn)代碼:

四、實驗小結(jié)

五、教師評語

實驗三串的模式匹配

一、實驗?zāi)康?/p>

1、了解串的基本概念

2、掌握串的模式匹配算法的實現(xiàn)

二、實驗預(yù)習(xí)

說明以下概念

1、模式匹配:

2、BF算法:

3、KMP算法:

三、實驗內(nèi)容和要求

1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。

#include<>

#incIude<>

#defineMAXSIZE100

typedefstruct{

chardata[MAXSIZE];

intlength;

JSqString;

intstrCompare(SqString*s1,SqString*s2);/*串的比較*/

voidshow_strCompare();

voidstrSub(SqString*s,intstart,intsubIen,SqString*sub);

/*求子串*/

voidshow_subString();

intstrCompare(SqString*s1,SqString*s2){

inti;

for(i=0;i<s1->length&&i<s2->Iength;i++)

if(s1->data[i]!=s2->data[i])

returns1->data[i]-s2->data[i];

returns1->Iength-s2->Iength;

)

voidshow_strCompare(){

SqStrings1,s2;

intk;

printf("\n***showCompare***\n");

printf("inputstrings1:");

gets;

=strlen;

printf('*inputstrings2:");

gets;

=strlen;

if((k=strCompare(&s1,&s2))==0)

printf("s1=s2\n");

eIseif(k<0)

printf("s1<s2\n");

else

printf("s1>s2\n");

printf("\n***showover***\n");

voidstrSub(SqString*s,intstart,intsubIen,SqString*sub){

inti;

if(start<1||start>s->Iength||subIen>s->Iength-start+1){

sub->length=0;

}

for(i=0;i<subIen;i++)

sub->data[i]=s->data[start+i-1];

sub->Iength=subIen;

)

voidshow_subString(){

SqStrings,sub;

intstart,subIen,i;

printf("\n***showsubString***\n");

printf(ninputstrings:;

gets;

二strlen;

printf("inputstart:");

scanf(n%d",&start);

printf("inputsubIen:");

scanf(u%d",&sublen);

strSub(&s,start,subIen,&sub);

if=0)

printf("ERROR!\n");

eIse{

printf("subStringis:");

for(i=0;i<sublen;i++)

printf("%c",[i]);

)

printf(M\n***showover***\n");

)

intmain(){

intn;

do{

printf("\n---String---\n");

printf("1.strCompare\n");

printf("2.subString\n");

printf("0.EXIT\n,r);

printf(u\ninputchoice:");

scanf("%dH,&n);

getchar();

switch(n){

case1:show_strCompare();break;

case2:show_subString();break;

defauIt:n=0;break;

)

}while(n);

return0;

)

運行程序

輸入:

1

student

students

2

ComputerDataStuctures

10

4

運行結(jié)果:

2、實現(xiàn)串的模式匹配算法。補(bǔ)充下面程序,實現(xiàn)串的BF和KMP算法。

#include<>

#incIude<>

#defineMAXSIZE100

typedefstruct{

chardata[MAXSIZE];

intlength;

ISqString;

intindex_bf(SqString*s,SqString*t,intstart);

voidgetNext(SqString*t,intnext[]);

intindex_kmp(SqString*s,SqString*t,intstart,intnext[]);

voidshow_index();

intindex_bf(SqString*s,SqString*t,intstart){

補(bǔ)充代碼一.一

)

voidgetNext(SqString*t,intnext[]){

inti=0,j=-1;

next[0]=-1;

whiIe(i<t->Iength){

if((j=-1)||(t->data[i]==t->data[j])){

i++;j++;next[i]=j;

)eIse

j=next[j];

)

)

intindex_kmp(SqString*s,SqString*ttintstart,intnext[]){

補(bǔ)充代碼.????

voidshow_index(){

SqStrings,t;

intk,next[MAXSIZE]={0},i;

printf("\n***showindex***\n");

printf("inputstrings:");

gets;

=strlen;

printf("inputstringt:n);

gets;

=strlen;

printf("inputstartposition:");

scanf(H%d",&k);

printf("BF:\ntheresultofBFis%d\nu,index_bf(&s,&t,k));

getNext(&t,next);

printf("KMP:\n");

printf(Hnext[]:");

for(i=0;i<;i++)

printf("%3d"fnext[i]);

printf("\nn);

n

printf(theresultofKMPis%d\n",index_kmp(&s,&trk,next));

printf("\n***showover***\n");

)

intmain(){

show_index();

return0;

)

輸入:

abcaabbabcabaacbacba

abcabaa

1

運行結(jié)果:

四、實驗小結(jié)

五、教師評語

實驗四二叉樹

一'實驗?zāi)康?/p>

1、掌握二叉樹的基本特性

2、掌握二叉樹的先序、中序、后序的遞歸遍歷算法

3、理解二叉樹的先序、中序、后序的非遞歸遍歷算法

4、通過求二叉樹的深度、葉子結(jié)點數(shù)和層序遍歷等算法,理解二叉樹的基本特性

二、實驗預(yù)習(xí)

說明以下概念

1、二叉樹:

2、遞歸遍歷:

3、非遞歸遍歷:

4、層序遍歷:

三、實驗內(nèi)容和要求

1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果,并畫出二叉樹的形態(tài)。

#include<>

#incIude<>

#defineMAX20

typedefstructBTNode{/*節(jié)點結(jié)構(gòu)聲明*/

chardata;/*節(jié)點數(shù)據(jù)*/

structBTNode*lchiId;

structBTNode*rchiId;/*指針*/

}*BiTree;

voidcreateBiTree(BiTree*t){/*先序遍歷創(chuàng)建二叉樹*/

chars;

BiTreeq;

printf("\npIeaseinputdata:(exitfor#)");

s二getche();

if(s='#'){*t=NULL;return;)

q=(BiTree)maIIoc(sizeof(structBTNode));

if(q==NULL)(printf("MemoryallocfaiIure!");exit(0);}

q->data=s;

*t=q;

createBiTree(&q->IchiId);/*遞歸建立左子樹*/

createBiTree(&q->rchiId);/*遞歸建立右子樹*/

)

voidPreOrder(BiTreep){/*先序遍歷二叉樹*/

if(p!=NULL){

printf("%cn,p->data);

PreOrder(p->lchiId);

PreOrder(p->rchiId);

)

)

voidInOrder(BiTreep){/*中序遍歷二叉樹*/

if(p!=NULL){

InOrder(p->IchiId);

printf("%c",p->data);

InOrder(p->rchiId)

voidPostOrder(BiTreep){/*后序遍歷二叉樹*/

if(p!=NULL){

PostOrder(p->lchiId);

PostOrder(p->rchiId);

printf("%c",p->data);

)

)

voidPreorder_n(BiTreep){/*先序遍歷的非遞歸算法*/

BiTreestack[MAX],q;

inttop=0,i;

for(i=0;i<MAX;i++)stack[i]=NULL;/*初始化棧*/

q=P;

while(q!=NULL){

printfq->data);

if(q->rchiId!二NULL)stack[top++]=q->rchiId;

if(q->IchiId!=NULL)q=q->lchiId;

eIse

if(top>0)q=stack[—top];

elseq=NULL;

)

)

voidrelease(BiTreet){/*釋放二叉樹空間*/

if(t!二NULL){

reIease(t->IchiId);

reIease(t->rchiId);

free(t);

}

)

intmain(){

BiTreet=NULL;

createBiTree(&t);

printf("\n\nPreOrderthetreeis:");

PreOrder(t);

printf("\n\nInOrderthetreeis:");

InOrder(t);

printf("\n\nPostOrderthetreeis:");

PostOrder(t);

printf("\n\n先序遍歷序列(非遞歸):”);

Preorder_n(t);

reIease(t);

return0;

)

運行程序

輸入:

ABC##DE#G##F###

運行結(jié)果:

2、在上題中補(bǔ)充求二叉樹中求結(jié)點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的結(jié)點

數(shù)),并在主函數(shù)中補(bǔ)充相應(yīng)的調(diào)用驗證正確性。

算法代碼:

3、在上題中補(bǔ)充求二叉樹中求葉子結(jié)點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的

葉子結(jié)點數(shù)),并在主函數(shù)中補(bǔ)充相應(yīng)的調(diào)用驗證正確性。

算法代碼:

4、在上題中補(bǔ)充求二叉樹深度算法,并在主函數(shù)中補(bǔ)充相應(yīng)的調(diào)用驗證正確性。

算法代碼:

選做實驗:(代碼可另附紙)

4、補(bǔ)充二叉樹層次遍歷算法。(提示:利用隊列實現(xiàn))

5、補(bǔ)充二叉樹中序、后序非遞歸算法。

四、實驗小結(jié)

五、教師評語

實驗五圖的表示與遍歷

一、實驗?zāi)康?/p>

1、掌握圖的鄰接矩陣和鄰接表表示

2、掌握圖的深度優(yōu)先和廣度優(yōu)先搜索方法

3、理解圖的應(yīng)用方法

二、實驗預(yù)習(xí)

說明以下概念

1、深度優(yōu)先搜索遍歷:

2、廣度優(yōu)先搜索遍歷:

3、拓?fù)渑判颍?/p>

4、最小生成樹:

5、最短路徑:

三、實驗內(nèi)容和要求

1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。

#incIude<>

#defineN20

#defineTRUE1

#defineFALSE0

intvisited[N];

typedefstruct/*隊列的定義*/

intdata[N];

intfront,rear;

1queue;

typedefstruct/*圖的鄰接矩陣*/

intvexnum,arcnum;

charvexs[N];

intarcs[N][N];

)

graph;

voidcreateGraph(graph*g);/*建立一個無向圖的鄰接矩陣*/

voiddfs(inti,graph*g);/*從第i個頂點出發(fā)深度優(yōu)先搜索*/

voidtdfs(graph*g);/*深度優(yōu)先搜索整個圖*/

voidbfs(intk,graph*g);/*從第k個頂點廣度優(yōu)先搜索*/

voidtbfs(graph*g);/*廣度優(yōu)先搜索整個圖*/

voidinit_visit();/*初始化訪問標(biāo)識數(shù)組*/

voidcreateGraph(graph*g)/*建立一個無向圖的鄰接矩陣*/

{inti,j;

charv;

g->vexnum=0;

g->arcnum=0;

i=0;

printf("輸入頂點序列(以#結(jié)束):\n");

while((v=getchar())!='#')

g->vexs[i]=v;/*讀入頂點信息*/

i++;

)

g->vexnum=i;/*頂點數(shù)目*/

for(i=0;i<g->vexnum;i++)/*鄰接矩陣初始化*/

for(j=0;j<g->vexnum;j++)

g->arcs[i][j]=0;

printf("輸入邊的信息:\n");

scanf(',%d,%d,\&i,&j);/*讀入邊i,j*/

while(i!=-1)/*讀入i,j為一1時結(jié)束*/

(

g->arcs[i][j]=1;

g->arcs[j][i]=1;

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

voiddfs(inti,graph*g)/*從第i個頂點出發(fā)深度優(yōu)先搜索*/

(

intj;

printfg->vexs[i]);

visited[i]=TRUE;

for(j=0;j<g->vexnum;j++)

if((g->arcs[i][j]==1)&&(!visited[j]))

dfs(j.g);

voidtdfs(graph*g)/*深度優(yōu)先搜索整個圖*/

inti;

printf(”\n從頂點%0開始深度優(yōu)先搜索序列g(shù)->vexs[0]);

for(i=0;i<g->vexnum;i++)

if(visited[i]!=TRUE)

dfs(i,g);

)

voidbfs(intk,graph*g)/*從第k個頂點廣度優(yōu)先搜索*/

(

inti,j;

queueqIist,*q;

q二&qlist;

q->rear=0;

q->front=0;

printfg->vexs[k]);

visited[k]=TRUE;

q->data[q->rear]=k;

q->rear=(q->rear+1)%N;

while(q->rear!=q->front)

{

i=q->data[q->front];

q->front=(q->front+1)%N;

for(j=0;j<g->vexnum;j++)

if((g->arcs[i][j]==1)&&(!visited[j]))

printf("%c”,g->vexs[j]);

visited[j]=TRUE;

q->data[q->rear]=j;

q->rear=(q->rear+1)%N;

)

voidtbfs(graph*g)/*廣度優(yōu)先搜索整個圖*/

(

inti;

printf(“\n從頂點%C開始廣度優(yōu)先搜索序列:“,g->vexs[0]);

for(i=0;i<g->vexnum;i++)

if(visited[i]!=TRUE)

bfs(i,g);

)

voidinit_visit()/*初始化訪問標(biāo)識數(shù)組*/

(

inti;

for(i=0;i<N;i++)

visited[i]=FALSE;

}

intmain()

(

graphga;

inti,j;

createGraph(&ga);

printf("無向圖的鄰接矩陣:\n");

for(i=0;i<;i++)

for(j=O;j<;j++)

printf("%3d",[i][j]);

printf("\n");

init_visit();

tdfs(&ga);

init_visit();

tbfs(&ga);

return0;

)

根據(jù)右圖的結(jié)構(gòu)驗證實驗,輸入:

ABCDEFGH#

0.1

0,2

0.5

1,3

1,4

2.5

2,6

3.7

4,7

-1,-1

運行結(jié)果:

2、閱讀并運行下面程序,補(bǔ)充拓?fù)渑判蛩惴ā?/p>

#incIude<>

#incIude<>

#defineN20

typedefstructedgenode{/*圖的鄰接表:鄰接鏈表結(jié)點*/

intadjvex;/*頂點序號*/

structedgenode*next;/*下一個結(jié)點的指針*/

}edgenode;

typedefstructvnode{/*圖的鄰接表:鄰接表*/

chardata;/*頂點信息*/

intind;/*頂點入度*/

structedgenode*1ink;/*指向鄰接鏈表指針*/

}vnode;

voidcreateGraph_list(vnodeadjIist[],int*p);/*建立有向圖的鄰接表*/

voidtopSort(vnodeg[],intn);/*拓?fù)渑判?/

voidcreateGraph_list(vnodeadjIist[],int*p){/*建立有向圖的鄰接表*/

inti,j,n,e;

charv;

edgenode*s;

i二0;n=0;e=0;

printf(”輸入頂點序列(以#結(jié)束):\n");

whiIe((v=getchar())!='#')

adjIist[i].data=v;/*讀入頂點信息*/

adjlist[i].Iink=NULL;

adjIind=O;

i++;

)

n=i;

*P=n;

/*建立鄰接鏈表*/

printf("\n請輸入弧的信息(i=T結(jié)束):i,j:\n");

scanf(n%d,%d",&i,&j);

while(i!=-1){

s二(structedgenode*)maIIoc(sizeof(edgenode));

s->adjvex=j;

s->next=adjIist[i].link;

adjIist[i].Iink=s;

adjIist[j].ind++;/*頂點j的入度加1*/

e++;

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

)

printf(“鄰接表:”);

for(i=0;i<n;i++){/*輸出鄰接表*/

printf("\n%c,%d:",adjIist[i].data,adjIist[i].ind);

s=adjIist[i].link;

whiIe(s!二NULL){

printf("->%d",s->adjvex);

s=s->next;

)

)

)

voidtopSort(vnodeg[],intn){/*拓?fù)渑判?/

intmain(){

vnodeadjIist[N];

intn,*p;

p二&n;

createGraph_list(adjIist,p);

return0;

)

根據(jù)輸入,輸出有向圖的拓?fù)渑判蛐蛄?。并畫出有向圖。輸入:

ABCDEF#

0.1

1,2

2,3

4.1

4.5

運行結(jié)果:

3、閱讀并運行下面程序。

#include<>

#defineN20

#defineTRUE1

#defineINF32766/*鄰接矩陣中的無窮大元素*/

#defineINFIN32767/*比無窮大元素大的數(shù)*/

typedefstruct

{/*圖的鄰接矩陣*/

intvexnum,arcnum;

charvexs[N];

intarcs[N][N];

)

graph;

voidcreateGraph_w(graph*g,intfIag);

voidprim(graph*g,intu);

voiddijkstra(graphg,intv);

voidshowprim();

voidshowdij();

/*建帶權(quán)圖的鄰接矩陣,若flag為1則為無向圖,flag為0為有向圖*/

voidcreateGraph_w(graph*g,intfIag)

inti,j,w;

charv;

g->vexnum=0;

g->arcnum=0;

i=0;

printf("輸入頂點序列(以#結(jié)束):\n");

while((v=getchar())!='#')

(

g->vexs[i]=v;/*讀入頂點信息*/

i++;

)

g->vexnum=i;

for(i=0;i<6;i++)/*鄰接矩陣初始化*/

for(j=0;j<6;j++)

g->arcs[i][j]=INF;

prin"("輸入邊的信息:\n");

scanf("%d,%d,%d",&i,&j,&w);/*讀入邊(i,j,w)*/

while(i!=-1)/*讀入i為一1時結(jié)束*/

(

g->arcs[i][j]=w;

if(flag=1)

g->arcs[j][i]=w;

scanf("%df%df%d",&i,&j,&w);

}

1

voidprim(graph*g,intu)/*出發(fā)頂點u*/

intIowcost[N],cIosest[N],i,j,k,min;

for(i=0;i<g->vexnum;i++)/*求其他頂點到出發(fā)頂點u的權(quán)*/

(

Iowcost[i]=g->arcs[u][i];

closest[il=u;

)

Iowcost[u]=0;

for(i=1;i<g->vexnum;i++)/*循環(huán)求最小生成樹中的各條邊*/

{min=INFIN;

for(j=0;j<g->vexnum;j++)/*選擇得到一條代價最小的邊*/

if(Iowcost[j]!=0&&Iowcost[j]<min)

(

min=Iowcost[j];

k二j;

)

printf("(%c,%c)-%d\n",g->vexs[cIosest[k]],g->vexs[k],Iowcost[k]);

/*輸出該邊*/

lowcost[k]=0;/*頂點k納入最小生成樹*/

for(j=0;j<g->vexnum;j++)/*求其他頂點到頂點k的權(quán)*/

if(g->arcs[k][j]!=0&&g->arcs[k][j]<Iowcost[j])

(

Iowcost[j]=g->arcs[k][j];

cIosest[j]=k;

voidprintPath(graphg,intstartVex,intEndVex)

intstack[N],top=0;/*堆棧*/

inti,k,j;

intflag[N];/*輸出路徑頂點標(biāo)志*/

k二EndVex;

for(i=0;i<;i++)flag[i]=0;

j=startVex;

n

printf(%c"f[j]);

flag[j]=1;

stack[top++]=k;

while(top>0)/*找j到k的路徑*/

(

for(i=0;i<;i++)

(

if(path[k][i]==1&&flag[i]==0)/*J到k的路徑含有i頂點*/

(

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論