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

下載本文檔

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

文檔簡介

v1.0可編輯可修改v1.0可編輯可修改PAGEPAGEPAGE57PAGE57v1.0可編輯可修改PAGE《數(shù)據(jù)結(jié)構(gòu)》實驗指導及報告書/學年第學期姓名:______________學號:______________班級:______________指導教師:______________數(shù)學與統(tǒng)計學院2011

預備實驗C語言的函數(shù)數(shù)組指針結(jié)構(gòu)體知識一、實驗目的1、復習C語言中函數(shù)、數(shù)組、指針、結(jié)構(gòu)體與共用體等的概念。2、熟悉利用C語言進行程序設計的一般方法。二、實驗預習說明以下C語言中的概念函數(shù):數(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;m*m<=n;m++) if(n%m==0)return0; return1;}intmain(){/*輸出100以內(nèi)所有素數(shù)*/ inti;printf("\n"); for(i=2;i<100;i++) if(isprime(i)==1)printf("%4d",i); return0;}運行結(jié)果:2、調(diào)試程序:對一維數(shù)組中的元素進行逆序排列。#include<>#defineN10intmain(){ inta[N]={0,1,2,3,4,5,6,7,8,9},i,temp; printf("\ntheoriginalArrayis:\n"); for(i=0;i<N;i++) printf("%4d",a[i]); for(i=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ù)組,當鞍點存在時,把鞍點找出來。#include<>#defineM3#defineN4intmain(){ 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ù)組的元素。#include<>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ù)據(jù)有姓名、年齡、職業(yè)、教研室四項,學生有姓名、年齡、專業(yè)、班級四項,編程輸入人員的數(shù)據(jù),再以表格輸出。#include<>#defineN10structstudent{ charname[8]; /*姓名*/ intage; /*年齡*/ charjob; /*職業(yè)或?qū)I(yè),用s或t表示學生或教師*/ union{intclass; /*班級*/charoffice[10];/*教研室*/}depa;}stu[N];intmain(){ inti;intn;printf(“\n請輸入人員數(shù)(<10):\n”);scanf(“%d”,&n); for(i=0;i<n;i++){ /*輸入n個人員的信息*/ printf("\n請輸入第%d人員的信息:(nameagejobclass/office)\n",i+1); scanf("%s,%d,%c",stu[i].name,&stu[i].age,&stu[i].job); if(stu[i].job==’s’) scanf("%d",&stu[i].;elsescanf("%s",stu[i].; } printf(“nameagejobclass/office”); 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ù):2Wang19s99061Li36tcomputer運行結(jié)果:四、實驗小結(jié)五、教師評語

實驗一順序表與鏈表一、實驗目的1、掌握線性表中元素的前驅(qū)、后續(xù)的概念。2、掌握順序表與鏈表的建立、插入元素、刪除表中某元素的算法。3、對線性表相應算法的時間復雜度進行分析。4、理解順序表、鏈表數(shù)據(jù)結(jié)構(gòu)的特點(優(yōu)缺點)。二、實驗預習說明以下概念1、線性表:2、順序表:3、鏈表:三、實驗內(nèi)容和要求1、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結(jié)果。#include<>#include<>#defineERROR0#defineOK1#defineINIT_SIZE5/*初始分配的順序表長度*/#defineINCREM5/*溢出時,順序表長度的增量*/typedefintElemType;/*定義表元素的類型*/typedefstructSqlist{ ElemType*slist;/*存儲空間的基地址*/ intlength;/*順序表的當前長度*/ intlistsize;/*當前分配的存儲空間*/}Sqlist;intInitList_sq(Sqlist*L);/**/intCreateList_sq(Sqlist*L,intn);/**/intListInsert_sq(Sqlist*L,inti,ElemTypee);/**/intPrintList_sq(Sqlist*L);/*輸出順序表的元素*/intListDelete_sq(Sqlist*L,inti);/*刪除第i個元素*/intListLocate(Sqlist*L,ElemTypee);/*查找值為e的元素*/intInitList_sq(Sqlist*L){L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(!L->slist)returnERROR;L->length=0;L->listsize=INIT_SIZE;returnOK;}/*InitList*/intCreateList_sq(Sqlist*L,intn){ElemTypee;inti;for(i=0;i<n;i++){printf("inputdata%d",i+1);scanf("%d",&e);if(!ListInsert_sq(L,i+1,e))returnERROR;}returnOK;}/*CreateList*//*輸出順序表中的元素*/intPrintList_sq(Sqlist*L){inti;for(i=1;i<=L->length;i++)printf("%5d",L->slist[i-1]);returnOK;}/*PrintList*/intListInsert_sq(Sqlist*L,inti,ElemTypee){intk;if(i<1||i>L->length+1)returnERROR;if(L->length>=L->listsize){L->slist=(ElemType*)realloc(L->slist,(INIT_SIZE+INCREM)*sizeof(ElemType));if(!L->slist)returnERROR;L->listsize+=INCREM;}for(k=L->length-1;k>=i-1;k--){L->slist[k+1]=L->slist[k];}L->slist[i-1]=e;L->length++;returnOK;}/*ListInsert*//*在順序表中刪除第i個元素*/intListDelete_sq(Sqlist*L,inti){}/*在順序表中查找指定值元素,返回其序號*/intListLocate(Sqlist*L,ElemTypee){}intmain(){Sqlistsl;intn,m,k;printf("pleaseinputn:");/*輸入順序表的元素個數(shù)*/scanf("%d",&n);if(n>0){printf("\n1-CreateSqlist:\n");InitList_sq(&sl);CreateList_sq(&sl,n);printf("\n2-PrintSqlist:\n");PrintList_sq(&sl);printf("\npleaseinputinsertlocationanddata:(location,data)\n"); scanf("%d,%d",&m,&k); ListInsert_sq(&sl,m,k); printf("\n3-PrintSqlist:\n"); PrintList_sq(&sl); printf("\n");}elseprintf("ERROR");return0;}運行結(jié)果算法分析2、為第1題補充刪除和查找功能函數(shù),并在主函數(shù)中補充代碼驗證算法的正確性。刪除算法代碼:運行結(jié)果算法分析查找算法代碼:運行結(jié)果算法分析3、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結(jié)果。#include<>#include<>#defineERROR0#defineOK1typedefintElemType;/*定義表元素的類型*/typedefstructLNode{/*線性表的單鏈表存儲*/ElemTypedata;structLNode*next;}LNode,*LinkList;LinkListCreateList(intn);/**/voidPrintList(LinkListL);/*輸出帶頭結(jié)點單鏈表的所有元素*/intGetElem(LinkListL,inti,ElemType*e);/**/LinkListCreateList(intn){LNode*p,*q,*head;inti;head=(LinkList)malloc(sizeof(LNode));head->next=NULL;p=head;for(i=0;i<n;i++){q=(LinkList)malloc(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,ElemType*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("pleaseinputn:");/*輸入單鏈表的元素個數(shù)*/scanf("%d",&n);if(n>0){printf("\n1-CreateLinkList:\n");L=CreateList(n);printf("\n2-PrintLinkList:\n");PrintList(L);printf("\n3-GetElemfromLinkList:\n");printf("inputi=");scanf("%d",&i);if(GetElem(L,i,&e))printf("No%iis%d",i,e);elseprintf("notexists");}elseprintf("ERROR");return0;}運行結(jié)果算法分析4、為第3題補充插入功能函數(shù)和刪除功能函數(shù)。并在主函數(shù)中補充代碼驗證算法的正確性。插入算法代碼:運行結(jié)果算法分析刪除算法代碼:運行結(jié)果算法分析以下為選做實驗:5、循環(huán)鏈表的應用(約瑟夫回環(huán)問題)n個數(shù)據(jù)元素構(gòu)成一個環(huán),從環(huán)中任意位置開始計數(shù),計到m將該元素從表中取出,重復上述過程,直至表中只剩下一個元素。提示:用一個無頭結(jié)點的循環(huán)單鏈表來實現(xiàn)n個元素的存儲。算法代碼6、設一帶頭結(jié)點的單鏈表,設計算法將表中值相同的元素僅保留一個結(jié)點。提示:指針p從鏈表的第一個元素開始,利用指針q從指針p位置開始向后搜索整個鏈表,刪除與之值相同的元素;指針p繼續(xù)指向下一個元素,開始下一輪的刪除,直至p==null為至,既完成了對整個鏈表元素的刪除相同值。算法代碼四、實驗小結(jié)五、教師評語

實驗二棧和隊列一、實驗目的1、掌握棧的結(jié)構(gòu)特性及其入棧,出棧操作;2、掌握隊列的結(jié)構(gòu)特性及其入隊、出隊的操作,掌握循環(huán)隊列的特點及其操作。二、實驗預習說明以下概念1、順序棧:2、鏈棧:3、循環(huán)隊列:4、鏈隊三、實驗內(nèi)容和要求1、閱讀下面程序,將函數(shù)Push和函數(shù)Pop補充完整。要求輸入元素序列12345e,運行結(jié)果如下所示。#include<>#include<>#defineERROR0#defineOK1#defineSTACK_INT_SIZE10/*存儲空間初始分配量*/#defineSTACKINCREMENT5/*存儲空間分配增量*/typedefintElemType;/*定義元素的類型*/typedefstruct{ElemType*base;ElemType*top;intstacksize;/*當前已分配的存儲空間*/}SqStack;intInitStack(SqStack*S);/*構(gòu)造空棧*/intpush(SqStack*S,ElemTypee);/*入棧*/intPop(SqStack*S,ElemType*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;}/*InitStack*/intPush(SqStack*S,ElemTypee){}/*Push*/intPop(SqStack*S,ElemType*e){}/*Pop*/intCreateStack(SqStack*S){inte;if(InitStack(S))printf("InitSuccess!\n");else{printf("InitFail!\n");returnERROR;}printf("inputdata:(Terminatedbyinputingacharacter)\n");while(scanf("%d",&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;} 算法分析:輸入元素序列12345,為什么輸出序列為54321體現(xiàn)了棧的什么特性2、在第1題的程序中,編寫一個十進制轉(zhuǎn)換為二進制的數(shù)制轉(zhuǎn)換算法函數(shù)(要求利用棧來實現(xiàn)),并驗證其正確性。實現(xiàn)代碼驗證3、閱讀并運行程序,并分析程序功能。#include<>#include<>#include<>#defineM20#defineelemtypechartypedefstruct{elemtypestack[M];inttop;}stacknode;voidinit(stacknode*st);voidpush(stacknode*st,elemtypex);voidpop(stacknode*st);voidinit(stacknode*st){st->top=0;}voidpush(stacknode*st,elemtypex){if(st->top==M)printf("thestackisoverflow!\n");else{st->top=st->top+1;st->stack[st->top]=x;}}voidpop(stacknode*st){if(st->top>0)st->top--;elseprintf(“StackisEmpty!\n”);}intmain(){chars[M];inti;stacknode*sp;printf("createaemptystack!\n");sp=malloc(sizeof(stacknode));init(sp);printf("inputaexpression:\n");gets(s);for(i=0;i<strlen(s);i++){if(s[i]=='(')push(sp,s[i]);if(s[i]==')')pop(sp);}if(sp->top==0)printf("'('match')'!\n");elseprintf("'('notmatch')'!\n");return0;}輸入:2+((c-d)*6-(f-7)*a)/6運行結(jié)果:輸入:a-((c-d)*6-(s/3-x)/2運行結(jié)果:程序的基本功能:以下為選做實驗:4、設計算法,將一個表達式轉(zhuǎn)換為后綴表達式,并按照后綴表達式進行計算,得出表達式得結(jié)果。實現(xiàn)代碼5、假設以帶頭結(jié)點的循環(huán)鏈表表示隊列,并且只設一個指針指向隊尾結(jié)點(不設隊頭指針),試編寫相應的置空隊列、入隊列、出隊列的算法。實現(xiàn)代碼:四、實驗小結(jié)五、教師評語

實驗三串的模式匹配一、實驗目的1、了解串的基本概念2、掌握串的模式匹配算法的實現(xiàn)二、實驗預習說明以下概念1、模式匹配:2、BF算法:3、KMP算法:三、實驗內(nèi)容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。#include<>#include<>#defineMAXSIZE100typedefstruct{ chardata[MAXSIZE]; intlength;}SqString;intstrCompare(SqString*s1,SqString*s2);/*串的比較*/voidshow_strCompare();voidstrSub(SqString*s,intstart,intsublen,SqString*sub);/*求子串*/voidshow_subString();intstrCompare(SqString*s1,SqString*s2){ inti; for(i=0;i<s1->length&&i<s2->length;i++) if(s1->data[i]!=s2->data[i]) returns1->data[i]-s2->data[i]; returns1->length-s2->length;}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");elseif(k<0)printf("s1<s2\n");elseprintf("s1>s2\n");printf("\n***showover***\n");}voidstrSub(SqString*s,intstart,intsublen,SqString*sub){ inti; if(start<1||start>s->length||sublen>s->length-start+1){ sub->length=0; } for(i=0;i<sublen;i++) sub->data[i]=s->data[start+i-1]; sub->length=sublen;}voidshow_subString(){SqStrings,sub;intstart,sublen,i;printf("\n***showsubString***\n");printf("inputstrings:");gets;=strlen;printf("inputstart:");scanf("%d",&start);printf("inputsublen:");scanf("%d",&sublen);strSub(&s,start,sublen,&sub);if==0)printf("ERROR!\n");else{printf("subStringis:");for(i=0;i<sublen;i++)printf("%c",[i]);}printf("\n***showover***\n");}intmain(){intn;do{printf("\nString\n");printf("1.strCompare\n");printf("2.subString\n");printf("0.EXIT\n");printf("\ninputchoice:");scanf("%d",&n);getchar();switch(n){case1:show_strCompare();break;case2:show_subString();break;default:n=0;break;}}while(n);return0;}運行程序輸入:1studentstudents2ComputerDataStuctures104運行結(jié)果:2、實現(xiàn)串的模式匹配算法。補充下面程序,實現(xiàn)串的BF和KMP算法。#include<>#include<>#defineMAXSIZE100typedefstruct{ chardata[MAXSIZE]; intlength;}SqString;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){補充代碼}voidgetNext(SqString*t,intnext[]){ inti=0,j=-1; next[0]=-1; while(i<t->length){ if((j==-1)||(t->data[i]==t->data[j])){ i++;j++;next[i]=j; }else j=next[j];}}intindex_kmp(SqString*s,SqString*t,intstart,intnext[]){ 補充代碼}voidshow_index(){SqStrings,t;intk,next[MAXSIZE]={0},i;printf("\n***showindex***\n");printf("inputstrings:");gets;=strlen;printf("inputstringt:");gets;=strlen;printf("inputstartposition:");scanf("%d",&k);printf("BF:\ntheresultofBFis%d\n",index_bf(&s,&t,k));getNext(&t,next);printf("KMP:\n");printf("next[]:");for(i=0;i<;i++)printf("%3d",next[i]);printf("\n");printf("theresultofKMPis%d\n",index_kmp(&s,&t,k,next));printf("\n***showover***\n");}intmain(){show_index();return0;}輸入:abcaabbabcabaacbacbaabcabaa1運行結(jié)果:四、實驗小結(jié)五、教師評語

實驗四二叉樹一、實驗目的1、掌握二叉樹的基本特性2、掌握二叉樹的先序、中序、后序的遞歸遍歷算法3、理解二叉樹的先序、中序、后序的非遞歸遍歷算法4、通過求二叉樹的深度、葉子結(jié)點數(shù)和層序遍歷等算法,理解二叉樹的基本特性二、實驗預習說明以下概念1、二叉樹:2、遞歸遍歷:非遞歸遍歷:4、層序遍歷:三、實驗內(nèi)容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果,并畫出二叉樹的形態(tài)。#include<>#include<>#defineMAX20typedefstructBTNode{/*節(jié)點結(jié)構(gòu)聲明*/ chardata;/*節(jié)點數(shù)據(jù)*/ structBTNode*lchild; structBTNode*rchild;/*指針*/}*BiTree;voidcreateBiTree(BiTree*t){/*先序遍歷創(chuàng)建二叉樹*/ chars; BiTreeq; printf("\npleaseinputdata:(exitfor#)"); s=getche(); if(s=='#'){*t=NULL;return;} q=(BiTree)malloc(sizeof(structBTNode)); if(q==NULL){printf("Memoryallocfailure!");exit(0);} q->data=s; *t=q; createBiTree(&q->lchild);/*遞歸建立左子樹*/ createBiTree(&q->rchild);/*遞歸建立右子樹*/}voidPreOrder(BiTreep){/*先序遍歷二叉樹*/if(p!=NULL){ printf("%c",p->data); PreOrder(p->lchild); PreOrder(p->rchild);}}voidInOrder(BiTreep){/*中序遍歷二叉樹*/if(p!=NULL){ InOrder(p->lchild); printf("%c",p->data); InOrder(p->rchild);}}voidPostOrder(BiTreep){/*后序遍歷二叉樹*/if(p!=NULL){ PostOrder(p->lchild); PostOrder(p->rchild); 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){printf("%c",q->data);if(q->rchild!=NULL)stack[top++]=q->rchild;if(q->lchild!=NULL)q=q->lchild;elseif(top>0)q=stack[--top];elseq=NULL;}}voidrelease(BiTreet){/*釋放二叉樹空間*/ if(t!=NULL){ release(t->lchild); release(t->rchild); 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);release(t);return0;}運行程序輸入:ABC##DE#G##F###運行結(jié)果:2、在上題中補充求二叉樹中求結(jié)點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的結(jié)點數(shù)),并在主函數(shù)中補充相應的調(diào)用驗證正確性。算法代碼:3、在上題中補充求二叉樹中求葉子結(jié)點總數(shù)算法(提示:可在某種遍歷過程中統(tǒng)計遍歷的葉子結(jié)點數(shù)),并在主函數(shù)中補充相應的調(diào)用驗證正確性。算法代碼:4、在上題中補充求二叉樹深度算法,并在主函數(shù)中補充相應的調(diào)用驗證正確性。算法代碼:選做實驗:(代碼可另附紙)補充二叉樹層次遍歷算法。(提示:利用隊列實現(xiàn))5、補充二叉樹中序、后序非遞歸算法。四、實驗小結(jié)五、教師評語

實驗五圖的表示與遍歷一、實驗目的1、掌握圖的鄰接矩陣和鄰接表表示2、掌握圖的深度優(yōu)先和廣度優(yōu)先搜索方法3、理解圖的應用方法二、實驗預習說明以下概念1、深度優(yōu)先搜索遍歷:2、廣度優(yōu)先搜索遍歷:3、拓撲排序:4、最小生成樹:5、最短路徑:三、實驗內(nèi)容和要求1、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。#include<>#defineN20#defineTRUE1#defineFALSE0intvisited[N];typedefstruct/*隊列的定義*/{intdata[N];intfront,rear;}queue;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();/*初始化訪問標識數(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;printf("%c",g->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從頂點%C開始深度優(yōu)先搜索序列:",g->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;queueqlist,*q;q=&qlist;q->rear=0;q->front=0;printf("%c",g->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()/*初始化訪問標識數(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=0;j<;j++)printf("%3d",[i][j]);printf("\n");}init_visit();tdfs(&ga);init_visit();tbfs(&ga);return0;}根據(jù)右圖的結(jié)構(gòu)驗證實驗,輸入:ABCDEFGH#ABABCDEFGH012345670,20,51,31,42,52,63,74,7-1,-1運行結(jié)果:2、閱讀并運行下面程序,補充拓撲排序算法。#include<>#include<>#defineN20typedefstructedgenode{/*圖的鄰接表:鄰接鏈表結(jié)點*/intadjvex;/*頂點序號*/structedgenode*next;/*下一個結(jié)點的指針*/}edgenode;typedefstructvnode{/*圖的鄰接表:鄰接表*/chardata;/*頂點信息*/intind;/*頂點入度*/structedgenode*link;/*指向鄰接鏈表指針*/}vnode;voidcreateGraph_list(vnodeadjlist[],int*p);/*建立有向圖的鄰接表*/voidtopSort(vnodeg[],intn);/*拓撲排序*/voidcreateGraph_list(vnodeadjlist[],int*p){/*建立有向圖的鄰接表*/inti,j,n,e;charv;edgenode*s;i=0;n=0;e=0;printf("輸入頂點序列(以#結(jié)束):\n");while((v=getchar())!='#'){adjlist[i].data=v;/*讀入頂點信息*/adjlist[i].link=NULL;adjlist[i].ind=0;i++;}n=i;*p=n;/*建立鄰接鏈表*/printf("\n請輸入弧的信息(i=-1結(jié)束):i,j:\n");scanf("%d,%d",&i,&j);while(i!=-1){s=(structedgenode*)malloc(sizeof(edgenode));s->adjvex=j;s->next=adjlist[i].link;adjlist[i].link=s;adjlist[j].ind++;/*頂點j的入度加1*/e++;scanf("%d,%d",&i,&j);}printf("鄰接表:");for(i=0;i<n;i++){/*輸出鄰接表*/printf("\n%c,%d:",adjlist[i].data,adjlist[i].ind);s=adjlist[i].link;while(s!=NULL){printf("->%d",s->adjvex);s=s->next;}}}voidtopSort(vnodeg[],intn){/*拓撲排序*/}intmain(){vnodeadjlist[N];intn,*p;p=&n;createGraph_list(adjlist,p);return0;}根據(jù)輸入,輸出有向圖的拓撲排序序列。并畫出有向圖。輸入:ABCDEF#0,11,22,34,14,5-1,-1運行結(jié)果:3、閱讀并運行下面程序。#include<>#defineN20#defineTRUE1#defineINF32766/*鄰接矩陣中的無窮大元素*/#defineINFIN32767/*比無窮大元素大的數(shù)*/typedefstruct{/*圖的鄰接矩陣*/intvexnum,arcnum;charvexs[N];intarcs[N][N];}graph;voidcreateGraph_w(graph*g,intflag);voidprim(graph*g,intu);voiddijkstra(graphg,intv);voidshowprim();voidshowdij();/*建帶權(quán)圖的鄰接矩陣,若flag為1則為無向圖,flag為0為有向圖*/voidcreateGraph_w(graph*g,intflag){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;printf("輸入邊的信息:\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("%d,%d,%d",&i,&j,&w);}}voidprim(graph*g,intu)/*出發(fā)頂點u*/{intlowcost[N],closest[N],i,j,k,min;for(i=0;i<g->vexnum;i++)/*求其他頂點到出發(fā)頂點u的權(quán)*/{lowcost[i]=g->arcs[u][i];closest[i]=u;}lowcost[u]=0;for(i=1;i<g->vexnum;i++)/*循環(huán)求最小生成樹中的各條邊*/{min=INFIN;for(j=0;j<g->vexnum;j++)/*選擇得到一條代價最小的邊*/if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}printf("(%c,%c)--%d\n",g->vexs[closest[k]],g->vexs[k],lowcost[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]<lowcost[j]){lowcost[j]=g->arcs[k][j];closest[j]=k;}}}voidprintPath(graphg,intstartVex,intEndVex){intstack[N],top=0;/*堆棧*/inti,k,j;intflag[N];/*輸出路徑頂點標志*/k=EndVex;for(i=0;i<;i++)flag[i]=0;j=startVex;printf("%c",[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頂點*/{if[j][i]!=INF)/*j到i的路徑含有中間頂點*/{printf("->%c(%d)",[i],[j][i]);/*輸出j到k的路徑的頂點i*/flag[i]=1;j=i;k=stack[--top];break;}else{if(i!=k)stack[top++]=i;/*break;*/}}}}voiddijkstra(graphg,intv){/*dijkstra算法求單源最短路徑*/intpath[N][N],dist[N],s[N];intmindis,i,j,u,k;for(i=0;i<;i++){dist[i]=[v][i];s[i]=0;for(j=0;j<;j++)path[i][j]=0;if(dist[i]<INF){path[i][v]=1;path[i][i]=1;}}dist[v]=0;s[v]=1;for(i=0,u=1;i<;i++){mindis=INFIN;for(j=0;j<;j++)if(s[j]==0)if(dist[j]<mindis){u=j;mindis=dist[j];}s[u]=1;for(j=0;j<;j++)if((s[j]==0)&&dist[u]+[u][j]<dist[j]){dist[j]=dist[u]+[u][j];for(k=0;k<;k++)path[j][k]=path[u][k];path[j][j]=1;}}printf("\n頂點%c->到各頂點的最短路徑\n",[v]);for(i=0;i<;i++){printf("\n頂點%c->頂點%c:",[v],[i]);if(dist[i]==INF||dist[i]==0)printf("無路徑");else{printf("%d",dist[i]);printf("經(jīng)過頂點:");printPath(g,v,i);/*輸出v到i的路徑*/}}}voidshowprim()/*最小生成樹prim算法演示*/{graphga;createGraph_w(&ga,1);prim(&ga,0);}voidshowdij(){/*dijstra算法演示*/graphga;createGraph_w(&ga,0);dijkstra(ga,0);}intmain(){showprim();/*prim算法演示*/getchar();showdij();/*dijstra算法演示*/return0;}下面的輸入分別驗證prim算法和dijstra算法。輸入實例的第一部分為無向圖,求其最小生成樹;輸入的第二部分為有向圖,求其最短路徑。最小生成樹最短路徑ABCDEF#0,1,60,2,10,3,51,2,51,4,32,3,52,4,62,5,43,5,24,5,6-1,-1,-1ABCDEF#0,2,100,5,1000,4,301,2,52,3,503,4,203,5,104,3,204,5,60-1,-1,-1PAGEPAGE73運行結(jié)果:(并畫出兩個圖)最小生成樹最短路徑四、實驗小結(jié)五、教師評語

實驗六查找一、實驗目的1、掌握查找表、動態(tài)查找表、靜態(tài)查找表和平均查找長度的概念。2、掌握線性表中順序查找和折半查找的方法。3、學會哈希函數(shù)的構(gòu)造方法,處理沖突的機制以及哈希表的查找。二、實驗預習說明以下概念1、順序查找:2、折半查找:3、哈希函數(shù):4、沖突及處理:三、實驗內(nèi)容和要求1.靜態(tài)查找表技術(shù)依據(jù)順序查找算法和折半查找算法的特點,對下面的兩個查找表選擇一個合適的算法,設計出完整的C源程序。并完成問題:查找表1:{8,15,19,26,33,41,47,52,64,90},查找key=41查找表2:{12,76,29,15,62,35,33,89,48,20},查找key=35查找key=41的算法:比較次數(shù):查找key=35的算法:比較次數(shù):順序查找算法算法實現(xiàn)代碼折半查找算法算法實現(xiàn)代碼2、哈希表的構(gòu)造與查找/*采用開放地址法構(gòu)造哈希表*/#include<>#include<>#defineMAXSIZE25#defineP13#defineOK1#defineERROR0#defineDUPLICATE-1#defineTRUE1#defineFALSE0typedefstruct{/*哈希表元素結(jié)構(gòu)*/intkey;/*關(guān)鍵字值*/intflag;/*是否存放元素*/}ElemType;typedefstruct{ElemTypedata[MAXSIZE];intcount;/*元素個數(shù)*/intsizeindex;/*當前哈希表容量*/}HashTable;intd1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};/*線性探測序列*/intd2[15]={0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7};/*二次探測序列*/voiddataset(intds[],int*len);intInsertHash(HashTable*H,inte,intd[]);intCreateHash(HashTable*H,intds[],intlen,intd[]);intSearchHash(HashTable*H,inte,intd[]);voidmenu();/*輸入查找表*/voiddataset(intds[],int*len){intn,m;n=0;printf("\n查找表輸入:");while(scanf("%d",&m)==1){/*以輸入一個非整數(shù)作為結(jié)束*/ds[n]=m;n++;}*len=n;}/*計算哈希地址,插入哈希表*/intInsertHash(HashTable*H,inte,intd[]){intk,i=1;k=e%P;while(H->data[k].flag==TRUE||k<0){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)returnERROR;}H->data[k].key=e;H->data[k].flag=TRUE;H->count++;returnOK;}/*構(gòu)造哈希表*/intCreateHash(HashTable*H,intds[],intlen,intd[]){inti;for(i=0;i<len;i++){if(SearchHash(H,ds[i],d)!=-1)returnDUPLICATE;InsertHash(H,ds[i],d);if(H->count>=MAXSIZE)returnERROR;}returnOK;}/*初始化哈希表*/voidInitHash(HashTable*H){inti;for(i=0;i<MAXSIZE;i++){H->data[i].key=0;H->data[i].flag=FALSE;}}/*在哈希表中查找*/intSearchHash(HashTable*H,inte,intd[]){intk,i=1;k=e%P;while(H->data[k].key!=e){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return-1;}returnk;}/*演示菜單*/voidmenu(){intchoice;int*p;HashTableh;=0;=MAXSIZE;inta[MAXSIZE]={0};inti,n,e;dataset(a,&n);/*建立查找表*/getchar();printf("\n");do{printf("\n哈希查找演示\n");printf("\n1.線性探測構(gòu)造哈希表\n");printf("\n2.二分探測構(gòu)造哈希表\n");printf("\n3.退出\n");printf("\n輸入選擇:");scanf("%d",&choice);if(choice==1)p=d1;elseif(choice==2)p=d2;elsereturn;InitHash(&h);/*初始化哈希表*/if(!(i=CreateHash(&h,a,n,p)))/*構(gòu)造哈希表*/printf("\n哈希表構(gòu)造失敗!\n");elseif(i==DUPLICATE)printf("\n哈希表具有重復關(guān)鍵字!\n");else{printf("\n哈希表:\n");for(i=0;i<;i++)printf("%3d",[i].key);printf("\n\n哈希查找\n輸入要查找的key值:");getchar();

溫馨提示

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

評論

0/150

提交評論