2023年數(shù)據(jù)結(jié)構(gòu)C語言版實(shí)驗(yàn)報(bào)告_第1頁
2023年數(shù)據(jù)結(jié)構(gòu)C語言版實(shí)驗(yàn)報(bào)告_第2頁
2023年數(shù)據(jù)結(jié)構(gòu)C語言版實(shí)驗(yàn)報(bào)告_第3頁
2023年數(shù)據(jù)結(jié)構(gòu)C語言版實(shí)驗(yàn)報(bào)告_第4頁
2023年數(shù)據(jù)結(jié)構(gòu)C語言版實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)結(jié)構(gòu)(C語言版)實(shí)驗(yàn)報(bào)告專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)、軟件工程學(xué)號(hào):_____(dá)______(dá)____(dá)________班級(jí):___(dá)___(dá)___軟件二班_____(dá)__(dá)___(dá)____姓名:____(dá)____(dá)朱海霞_________(dá)_____指導(dǎo)教師:___(dá)劉遵仁_____(dá)______(dá)_____青島大學(xué)信息工程學(xué)院2023年10月?實(shí)驗(yàn)1實(shí)驗(yàn)題目:順序存儲(chǔ)結(jié)構(gòu)線性表的插入和刪除實(shí)驗(yàn)?zāi)康模毫私夂驼莆站€性表的邏輯結(jié)構(gòu)和順序存儲(chǔ)結(jié)構(gòu),掌握線性表的基本算法及相關(guān)的時(shí)間性能分析。實(shí)驗(yàn)規(guī)定:建立一個(gè)數(shù)據(jù)域定義為整數(shù)類型的線性表,在表中允許有反復(fù)的數(shù)據(jù);根據(jù)輸入的數(shù)據(jù),先找到相應(yīng)的存儲(chǔ)單元,后刪除之。實(shí)驗(yàn)重要環(huán)節(jié):分析、理解給出的示例程序。調(diào)試程序,并設(shè)計(jì)輸入一組數(shù)據(jù)(3,-5,6,8,2,-5,4,7,-9),測試程序的如下功能:根據(jù)輸入的數(shù)據(jù),找到相應(yīng)的存儲(chǔ)單元并刪除,顯示表中所有的數(shù)據(jù)。程序代碼:#include<stdio.h>#include<malloc.h>#defineOK1#defineERROR0#defineOVERFLOW-2#defineLIST_INIT_SIZE100#defineLISTINCREMENT10typedefstruct{ int*elem;?intlength;?intlistsize;}Sqlist;intInitList_Sq(Sqlist&L){?L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));?if(!L.elem)return-1;?L.length=0; L.listsize=LIST_INIT_SIZE;?returnOK;}intListInsert_Sq(Sqlist&L,inti,inte){ if(i<1||i>L.length+1)returnERROR;?if(L.length==L.listsize){??int*newbase; newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));??if(!newbase)return-1; ?L.elem=newbase;??L.listsize+=LISTINCREMENT;?} int*p,*q; q=&(L.elem[i-1]);?for(p=&(L.elem[L.length-1]);p>=q;--p) *(p+1)=*p; *q=e;?++L.length; returnOK;}intListDelete_Sq(Sqlist&L,inti,inte){ int*p,*q; if(i<1||i>L.length)returnERROR; p=&(L.elem[i-1]);?e=*p;?q=L.elem+L.length-1;?for(++p;p<=q;++p)??*(p-1)=*p;?--L.length;?returnOK;}intmain(){?SqlistL; InitList_Sq(L);//初始化 inti,a[]={3,-5,6,8,2,-5,4,7,-9};?for(i=1;i<10;i++)ListInsert_Sq(L,i,a[i-1]);?for(i=0;i<9;i++)? printf("%d",L.elem[i]);? printf("\n");//插入9個(gè)數(shù)?ListInsert_Sq(L,3,24);?for(i=0;i<10;i++) ?printf("%d",L.elem[i]);??printf("\n");//插入一個(gè)數(shù) inte; ListDelete_Sq(L,2,e); for(i=0;i<9;i++) ?printf("%d",L.elem[i]);//刪除一個(gè)數(shù) printf("\n");??return0;}實(shí)驗(yàn)結(jié)果:3,-5,6,8,2,-5,4,7,-93,-5,24,6,8,2,-5,4,7,-93,24,6,8,2,-5,4,7,-9心得體會(huì):順序存儲(chǔ)結(jié)構(gòu)是一種隨機(jī)存取結(jié)構(gòu),存取任何元素的時(shí)間是一個(gè)常數(shù),速度快;結(jié)構(gòu)簡樸,邏輯上相鄰的元素在物理上也相鄰;不使用指針,節(jié)省存儲(chǔ)空間;但是插入和刪除元素需要移動(dòng)大量元素,消耗大量時(shí)間;需要一個(gè)連續(xù)的存儲(chǔ)空間;插入元素也許發(fā)生溢出;自由區(qū)中的存儲(chǔ)空間不能被其他數(shù)據(jù)共享實(shí)驗(yàn)2實(shí)驗(yàn)題目:單鏈表的插入和刪除實(shí)驗(yàn)?zāi)康模毫私夂驼莆站€性表的邏輯結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),掌握單鏈表的基本算法及相關(guān)的時(shí)間性能分析。實(shí)驗(yàn)規(guī)定:建立一個(gè)數(shù)據(jù)域定義為字符類型的單鏈表,在鏈表中不允許有反復(fù)的字符;根據(jù)輸入的字符,先找到相應(yīng)的結(jié)點(diǎn),后刪除之。實(shí)驗(yàn)重要環(huán)節(jié):分析、理解給出的示例程序。調(diào)試程序,并設(shè)計(jì)輸入數(shù)據(jù)(如:A,C,E,F,H,J,Q,M),測試程序的如下功能:不允許反復(fù)字符的插入;根據(jù)輸入的字符,找到相應(yīng)的結(jié)點(diǎn)并刪除。修改程序:增長插入結(jié)點(diǎn)的功能。建立鏈表的方法有“前插”、“后插”法。程序代碼:#include<stdio.h>#include<malloc.h>#defineNULL0#defineOK1#defineERROR0typedefstructLNode{ intdata; structLNode*next;}LNode,*LinkList;intInitList_L(LinkList&L){ L=(LinkList)malloc(sizeof(LN(yùn)ode));?L->next=NULL; returnOK;}intListInsert_L(LinkList&L,inti,inte){?LinkListp,s;?intj;?p=L;j=0;?while(p&&j<i-1){ p=p->next;++j; } if(!p||j>i-1) ?returnERROR;?s=(LinkList)malloc(sizeof(LN(yùn)ode)); s->data=e;?s->next=p->next; p->next=s; returnOK;}intListDelete_L(LinkList&L,inti,int&e){?LinkListp,q;?intj; p=L;j=0;?while(p->next&&j<i-1){? p=p->next;++j; } if(!(p->next)||j<i-1)? returnERROR;?q=p->next;p->next=q->next;?e=q->data;free(q); returnOK;}intmain(){ LinkListL,p;?chara[8]={'A','C','E','F','H','J','Q','U'};?inti,j;?InitList_L(L); for(i=1,j=0;i<=8,j<8;i++,j++)? ListInsert_L(L,i,a[j]); p=L->next;?while(p!=NULL){??printf("%c\t",p->data); p=p->next;?}//插入八個(gè)字符 printf("\n");?i=2;?inte; ListInsert_L(L,i,'B'); p=L->next;?while(p!=NULL){ ?printf("%c\t",p->data);? p=p->next;?}//插入一個(gè)字符?printf("\n"); i=3;?ListDelete_L(L,i,e);?p=L->next; while(p!=NULL){ printf("%c\t",p->data); ?p=p->next; }?printf("\n");?return0;}實(shí)驗(yàn)結(jié)果:ACEFHJQUABCEFHJQUABEFHJQU心得體會(huì):單鏈表是通過掃描指針P進(jìn)行單鏈表的操作;頭指針唯一標(biāo)記點(diǎn)鏈表的存在;插入和刪除元素快捷,方便。實(shí)驗(yàn)3實(shí)驗(yàn)題目:棧操作設(shè)計(jì)和實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康模?、掌握棧的順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),以便在實(shí)際中靈活應(yīng)用。2、掌握棧的特點(diǎn),即后進(jìn)先出和先進(jìn)先出的原則。3、掌握棧的基本運(yùn)算,如:入棧與出棧等運(yùn)算在順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)上的實(shí)現(xiàn)。實(shí)驗(yàn)規(guī)定:回文判斷:對于一個(gè)從鍵盤輸入的字符串,判斷其是否為回文?;匚募凑葱蛳嗤?。如“abba”是回文,而“abab”不是回文。實(shí)驗(yàn)重要環(huán)節(jié)(1)數(shù)據(jù)從鍵盤讀入;(2)輸出要判斷的字符串;(3)運(yùn)用棧的基本操作對給定的字符串判斷其是否是回文,若是則輸出“Yes”,否則輸出“No”。程序代碼:#include<stdio.h>#include<stdlib.h>#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineOVERFLOW-2#defineN100#defineSTACK_INIT_SIZE 100 #defineSTACKINCREMENT? 10 typedefstruct{int *base; ???//在棧構(gòu)造之前和銷毀之后,base的值為NULLint *top;?? ?//棧頂指針int???stacksize;? //當(dāng)前已分派的存儲(chǔ)空間,以元素為單位}SqStack;intInitStack(SqStack&S){//構(gòu)造一個(gè)空棧Sif(!(S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int))))exit(OVERFLOW);??? //存儲(chǔ)分派失敗S.top=S.base;S.stacksize=STACK_INIT_SIZE;returnOK;}intStackEmpty(SqStackS){//若棧S為空棧,則返回TRUE,否則返回FALSEif(S.top==S.base)returnTRUE;elsereturnFALSE;}intPush(SqStack&S,inte){//插入元素e為新的棧頂元素if(S.top-S.base>=S.stacksize)//棧滿,追加存儲(chǔ)空間{S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));if(!S.base)exit(OVERFLOW);//存儲(chǔ)分派失敗S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*(S.top)++=e;returnOK;}intPop(SqStack&S,int&e){//若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERRORif(S.top==S.base)returnERROR;e=*--S.top;returnOK;}intmain(){SqStacks;inti,e,j,k=1;charch[N]={0},*p,b[N]={0};if(InitStack(s))//初始化棧成功{printf("請輸入表達(dá)式:\n");gets(ch);p=ch;while(*p)//沒到串尾Push(s,*p++);?for(i=0;i<N;i++){?if(!StackEmpty(s)){//棧不空Pop(s,e);//彈出棧頂元素? b[i]=e; }?} for(i=0;i<N;i++){ ?if(ch[i]!=b[i]) ?k=0;}?if(k==0)? printf("NO!"); elseprintf("輸出:")printf("YES!");} return0;}實(shí)驗(yàn)結(jié)果:請輸入表達(dá)式:abcba輸出:YES!心得體會(huì):棧是僅能在表尾驚醒插入和刪除操作的線性表,具有先進(jìn)后出的性質(zhì),這個(gè)固有性質(zhì)使棧成為程序設(shè)計(jì)中的有用工具。實(shí)驗(yàn)4實(shí)驗(yàn)題目:二叉樹操作設(shè)計(jì)和實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康?掌握二叉樹的定義、性質(zhì)及存儲(chǔ)方式,各種遍歷算法。實(shí)驗(yàn)規(guī)定:采用二叉樹鏈表作為存儲(chǔ)結(jié)構(gòu),完畢二叉樹的建立,先序、中序和后序以及按層次遍歷的操作,求所有葉子及結(jié)點(diǎn)總數(shù)的操作。實(shí)驗(yàn)重要環(huán)節(jié):分析、理解程序。調(diào)試程序,設(shè)計(jì)一棵二叉樹,輸入完全二叉樹的先序序列,用#代表虛結(jié)點(diǎn)(空指針),如ABD###CE##F##,建立二叉樹,求出先序、中序和后序以及按層次遍歷序列,求所有葉子及結(jié)點(diǎn)總數(shù)。程序代碼:實(shí)驗(yàn)結(jié)果:心得體會(huì):?實(shí)驗(yàn)5實(shí)驗(yàn)題目:圖的遍歷操作實(shí)驗(yàn)?zāi)康模赫莆沼邢驁D和無向圖的概念;掌握鄰接矩陣和鄰接鏈表建立圖的存儲(chǔ)結(jié)構(gòu);掌握DFS及BFS對圖的遍歷操作;了解圖結(jié)構(gòu)在人工智能、工程等領(lǐng)域的廣泛應(yīng)用。實(shí)驗(yàn)規(guī)定:采用鄰接矩陣和鄰接鏈表作為圖的存儲(chǔ)結(jié)構(gòu),完畢有向圖和無向圖的DFS和BFS操作。實(shí)驗(yàn)重要環(huán)節(jié):設(shè)計(jì)一個(gè)有向圖和一個(gè)無向圖,任選一種存儲(chǔ)結(jié)構(gòu),完畢有向圖和無向圖的DFS(深度優(yōu)先遍歷)和BFS(廣度優(yōu)先遍歷)的操作。鄰接矩陣作為存儲(chǔ)結(jié)構(gòu)#include"stdio.h"#include"stdlib.h"#defineMaxVertexNum100//定義最大頂點(diǎn)數(shù)typedefstruct{charvexs[MaxVertexNum];//頂點(diǎn)表intedges[MaxVertexNum][MaxVertexNum];//鄰接矩陣,可看作邊表intn,e;//圖中的頂點(diǎn)數(shù)n和邊數(shù)e}MGraph;//用鄰接矩陣表達(dá)的圖的類型//=========建立鄰接矩陣=======voidCreat(yī)MGraph(MGraph*G){inti,j,k;chara;printf("InputVertexNum(n)andEdgesNum(e):");scanf("%d,%d",&G->n,&G->e);//輸入頂點(diǎn)數(shù)和邊數(shù)scanf("%c",&a);printf("InputVertexstring:");for(i=0;i<G->n;i++){ scanf("%c",&a); G->vexs[i]=a;//讀入頂點(diǎn)信息,建立頂點(diǎn)表}for(i=0;i<G->n;i++)? for(j=0;j<G->n;j++)? G->edges[i][j]=0;//初始化鄰接矩陣printf("Inputedges,CreatAdjacencyMat(yī)rix\n");for(k=0;k<G->e;k++){//讀入e條邊,建立鄰接矩陣 scanf("%d%d",&i,&j);//輸入邊(Vi,Vj)的頂點(diǎn)序號(hào)?G->edges[i][j]=1; G->edges[j][i]=1;//若為無向圖,矩陣為對稱矩陣;若建立有向圖,去掉該條語句}}//=========定義標(biāo)志向量,為全局變量=======typedefenum{FALSE,TRUE}Boolean;Booleanvisited[MaxVertexNum];//========DFS:深度優(yōu)先遍歷的遞歸算法======voidDFSM(MGraph*G,inti){//以Vi為出發(fā)點(diǎn)對鄰接矩陣表達(dá)的圖G進(jìn)行DFS搜索,鄰接矩陣是0,1矩陣給出你的編碼//===========BFS:廣度優(yōu)先遍歷=======voidBFS(MGraph*G,intk){//以Vk為源點(diǎn)對用鄰接矩陣表達(dá)的圖G進(jìn)行廣度優(yōu)先搜索給出你的編碼//==========主程序main=====voidmain(){inti;MGraph*G;G=(MGraph*)malloc(sizeof(MGraph));//為圖G申請內(nèi)存空間CreatMGraph(G);//建立鄰接矩陣printf("PrintGraphDFS:");DFS(G);//深度優(yōu)先遍歷printf("\n");printf("PrintGraphBFS:");BFS(G,3);//以序號(hào)為3的頂點(diǎn)開始廣度優(yōu)先遍歷printf("\n");}鄰接鏈表作為存儲(chǔ)結(jié)構(gòu)#include"stdio.h"#include"stdlib.h"#defineMaxVertexNum50//定義最大頂點(diǎn)數(shù)typedefstructnode{//邊表結(jié)點(diǎn)intadjvex;//鄰接點(diǎn)域structnode*next;//鏈域}EdgeNode;typedefstructvnode{//頂點(diǎn)表結(jié)點(diǎn)charvertex;//頂點(diǎn)域EdgeNode*firstedge;//邊表頭指針}VertexNode;typedefVertexNodeAdjList[MaxVertexNum];//AdjList是鄰接表類型typedefstruct{AdjListadjlist;//鄰接表intn,e;//圖中當(dāng)前頂點(diǎn)數(shù)和邊數(shù)}ALGraph;//圖類型//=========建立圖的鄰接表=======voidCreatALGraph(ALGraph*G){inti,j,k;chara;EdgeNode*s;//定義邊表結(jié)點(diǎn)printf("InputVertexNum(n)andEdgesNum(e):");scanf("%d,%d",&G->n,&G->e);//讀入頂點(diǎn)數(shù)和邊數(shù)scanf("%c",&a);printf("InputVertexstring:");for(i=0;i<G->n;i++)//建立邊表{ scanf("%c",&a); G->adjlist[i].vertex=a;//讀入頂點(diǎn)信息 G->adjlist[i].firstedge=NULL;//邊表置為空表}printf("Inputedges,CreatAdjacencyList\n");for(k=0;k<G->e;k++){//建立邊表?scanf("%d%d",&i,&j);//讀入邊(Vi,Vj)的頂點(diǎn)對序號(hào) s=(EdgeNode*)malloc(sizeof(EdgeNode));//生成邊表結(jié)點(diǎn)?s->adjvex=j;//鄰接點(diǎn)序號(hào)為j?s->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=s;//將新結(jié)點(diǎn)*S插入頂點(diǎn)Vi的邊表頭部 s=(EdgeNode*)malloc(sizeof(EdgeNode));?s->adjvex=i;//鄰接點(diǎn)序號(hào)為i s->next=G->adjlist[j].firstedge; G->adjlist[j].firstedge=s;//將新結(jié)點(diǎn)*S插入頂點(diǎn)Vj的邊表頭部}}//=========定義標(biāo)志向量,為全局變量=====

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論