《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書

上傳人:細水****9 文檔編號:64937210 上傳時間:2022-03-22 格式:DOC 頁數(shù):67 大?。?70.01KB
收藏 版權(quán)申訴 舉報 下載
《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書_第1頁
第1頁 / 共67頁
《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書_第2頁
第2頁 / 共67頁
《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書_第3頁
第3頁 / 共67頁

下載文檔到電腦,查找使用更方便

5 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書》由會員分享,可在線閱讀,更多相關(guān)《《算法與數(shù)據(jù)結(jié)構(gòu)》上機指導書(67頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 算法與數(shù)據(jù)結(jié)構(gòu) 課程上機指導書電子信息工程 專業(yè)周月霞 編佛山科學技術(shù)學院2005 年 8 月摘 要本書是為了配合電子信息工程專業(yè)算法與數(shù)據(jù)結(jié)構(gòu)課程而編寫的,與高等教育出版社出版的數(shù)據(jù)結(jié)構(gòu)用C語言描述(唐策善等編)相配套。本指導書針對教學內(nèi)容組織了十三個上機實驗題目,分別涵蓋線性表、棧與隊列、串、數(shù)組和廣義表、樹和二叉樹、圖、動態(tài)存儲管理、集合(查找表)、內(nèi)部排序和外部排序、文件等內(nèi)容。并給予必要的上機指導,使學生能更深透地理解數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的基本概念以及有關(guān)算法,培養(yǎng)基本的、良好的程序設(shè)計技能,編制高效可靠的程序。 本書內(nèi)容豐富,涉及面廣,實用性強,與算法與數(shù)據(jù)結(jié)構(gòu)課程內(nèi)容緊

2、密結(jié)合??梢怨└黝悓W生課程學習使用,也可供教師或其他專業(yè)技術(shù)人員參考。目 錄 前言實驗一 順序表基本操作 1實驗二 順序表其它操作 5實驗三 鏈表基本操作 10實驗四 鏈表其它操作 14實驗五 表達式求值 24實驗六 數(shù)組的建立和使用 26實驗七 二叉樹基本操作 26實驗八 二叉樹其它操作 27實驗九 圖的基本操作 29實驗十 圖的其它操作 33實驗十一 二叉排序樹操作 41實驗十二 哈希表操作 44實驗十三 各種內(nèi)部排序方法 52主要參考書 57附錄1 程序設(shè)計風格和注釋要求 58附錄2 上機實驗報告格式 59前 言算法與數(shù)據(jù)結(jié)構(gòu)是計算機科學與技術(shù)專業(yè)和其他有志從事計算機技術(shù)工作的人員的一門

3、重要的專業(yè)基礎(chǔ)課。算法與數(shù)據(jù)結(jié)構(gòu)課程的教學要求是學會分析研究計算機加工的數(shù)據(jù)對象的特征,以便在實際應用中選擇適當?shù)臄?shù)據(jù)結(jié)構(gòu)、存儲結(jié)構(gòu)和相應的算法,初步掌握算法的時間與空間性能分析技巧,得到復雜程序設(shè)計的訓練。本書是與高等教育出版社出版的數(shù)據(jù)結(jié)構(gòu)用C語言描述(唐策善等編)相配套的,給出了十三個上機實驗指導,每個實驗都給出了幾道上機題目,每個實驗題目都介紹了實驗目的,主要采用的方法與技術(shù)和C語言實現(xiàn)程序。通過實驗使學生了解并學會如何運用數(shù)據(jù)結(jié)構(gòu)只是去解決現(xiàn)實世界的某些實際問題,具備設(shè)計較復雜程序的初步能力。本書的出發(fā)點是幫助學生學好算法與數(shù)據(jù)結(jié)構(gòu)這門課程,所以在使用本書的過程中要注意以下幾點:第一

4、要與課程內(nèi)容的學習同步,有利于進一步理解掌握各知識點和鞏固課堂效果教學。第二算法設(shè)計具有不唯一性,對實驗題目本書只給出一種或幾種算法,要在學習、理解、領(lǐng)會的基礎(chǔ)上自己動手設(shè)計算法程序,這樣才會取得良好的效果。切忌照抄照搬,否則會影響學習效果。第三要學會舉一反三,觸類旁通,實驗內(nèi)容知識點是有限的,但運用這些知識點、運用所介紹的方法和技術(shù)解決的實際問題卻是無限的,重在掌握基本原理、基本方法和基本技術(shù),并學會靈活運用。第四要有C語言的基礎(chǔ)。本書算法是用C語言描述,所以讀者應先了解C語言的基本內(nèi)容。由于時間倉促和作者水平有限,本書一定還存在著許多問題,敬請廣大讀者批評指正。 作者 2005年8月63實

5、驗一 順序表基本操作一、目的和要求1、熟悉C語言的上機環(huán)境,掌握C語言的基本結(jié)構(gòu)。2、會定義線性表的順序存儲結(jié)構(gòu)。3、熟悉對順序表的一些基本操作和具體的函數(shù)定義。 二、實驗內(nèi)容1、該程序的功能是對元素類型為整型的順序表進行一些操作。該程序包括順序表結(jié)構(gòu)類型的定義以及對順序表操作的具體的函數(shù)定義和主函數(shù)。三、儀器、設(shè)備和材料1、 計算機若干臺 四、實驗步驟/* 定義ElemType為int類型 */typedef int ElemType;/*順序表存儲空間的總分配量*/#define MAXSIZE 100#define FALSE 0#define TRUE 1/* 順序存儲類型 */typ

6、edef structElemType dataMAXSIZE; /*存放線性表的數(shù)組*/ int length; /* length是順序表的長度*/SeqList;/* 初始化順序表 */SeqList SeqListInit( )SeqList L; L.length=0; return L; /* 清空順序表 */SeqList ListClear(SeqList L)L.length=0; return L;/* 求順序表長度 */int ListLength(SeqList L) return(L.length);/* 檢查順序表是否為空 */int ListEmpty(SeqLi

7、st L)if(L.length) return(FALSE); else return(TRUE);/*檢查順序表是否為滿 */int ListFull(SeqList L)if(L.length=MAXSIZE) return(TRUE); else return(FALSE);/* 遍歷順序表 */void ListTraverse(SeqList L)int i; if(L.length=0) printf(順序表為空n); else printf(當前順序表中的元素為:n); for(i=1;i=L.length;i+) printf(%d ,L.datai-1); printf(n

8、); /* 從順序表中查找元素 */ElemType ListGet(SeqList L ,int i)ElemType e; e=L.datai-1; return(e);/* 從順序表中查找與給定元素值相同的元素在順序表中的位置 */int ListLocate(SeqList L, ElemType x)int i=0; while(iL.length & L.datai!=x) i+; if (iL.length) return (i+1); else return 0;/* 向順序表中插入元素 */SeqList ListInsert(SeqList L,int i,ElemType

9、 x)int j; if(L.length=MAXSIZE) printf(表滿,不能插入n); else if(iL.length+1) printf(插入位置不正確n); else for(j=L.length-1;j=i-1;j-)L.dataj+1=L.dataj; L.datai-1=x; L.length+; return L; /* 從順序表中刪除元素 */SeqList ListDelete(SeqList L,int i)int j;ElemType x; if (iL.length)printf(刪除位置不正確n); else x=L.datai-1; for(j=i;j=

10、L.length-1;j+) L.dataj-1=L.dataj; L.length-; printf(%d已被刪除n,x); return L;/*求順序表中元素的前驅(qū)*/ElemType SeqListPrior(SeqList L,ElemType e)int i=0; while(iL.length&L.datai!=e)i+; if(i=0) printf(第一個元素沒有前驅(qū)n);return 0; else if(i=L.length-1) return(L.datai-1);else printf(不存在值為%d的元素n,e);return 0;/*求順序表中元素的后繼*/Ele

11、mType SeqListNext(SeqList L,ElemType e)int i=0; while(iL.length&L.datai!=e) i+; if(i=L.length-1) printf(最后一個元素沒有后繼n);return 0; else if(iL.length-1) return(L.datai+1);else printf(不存在值為%d的元素n,e);return 0;int scan()int d; printf(請選擇所要進行的操作n); printf(1.初始化 2.清空3.求順序表長度4.檢查順序表是否為空n); printf(5.檢查順序表是否為滿 6

12、.遍歷順序表 7.從順序表中查找元素n); printf(8.從順序表中查找與給定元素值相同的元素在順序表中的位置n); printf(9.向順序表中插入元素10. 從順序表中刪除元素n); printf(11.求元素的前驅(qū) 12.求元素的后繼n); printf(其他鍵退出.n); scanf(%d,&d); return(d);main()int quit=0;int i,location; ElemType e,prior,next; SeqList L; printf(第一次操作需選擇初始化n); while(!quit) switch(scan() case 1:L=SeqListI

13、nit();break; case 2:ListClear(L);break; case 3:printf(順序表的長度為%dn,ListLength(L);break; case 4:if(ListEmpty(L)printf(順序表為空n);else printf(順序表不為空n);break; case 5:if(ListFull(L)printf(順序表滿n);else printf(順序表不滿n);break; case 6:ListTraverse(L);break; case 7:printf(請輸入要查找的元素的位置n);scanf(%d,&i);if(L.length=0)

14、printf(順序表已空n);else if(iL.length) printf(查找的位置不正確n); else printf(順序表中第%d個元素的值為:%dn,i,ListGet(L,i);break; case 8:printf(請輸入要查找的元素的值n);scanf(%d,&e);if(L.length=0) printf(順序表已空n);else location=ListLocate(L,e); if(location=0) printf(順序表中不存在值為%d的元素n,e); else printf(順序表中%d的位置是:%dn,e,ListLocate(L,e);break;

15、 case 9:printf(請輸入要插入的元素的位置和其值:n);scanf(%d%d,&i,&e);L=ListInsert(L,i,e);break; case 10:printf(請輸入要刪除的元素的位置:n); scanf(%d,&i); L=ListDelete(L,i); break; case 11:scanf(%d,&e); prior=SeqListPrior(L,e); if(prior) printf(%d的前驅(qū)是:%dn,e,prior);break; case 12:scanf(%d,&e); next=SeqListNext(L,e); if(next) prin

16、tf(%d的后繼是:%dn,e,next);break; default:quit=1;五、實驗注意事項1、在做第一次“數(shù)據(jù)結(jié)構(gòu)”課程實驗之前,要在硬盤上建立好自己的工作目錄,專門來存儲你所做的實驗程序及相關(guān)信息,以后每次做實驗都采用這個目錄。實驗二 順序表其它操作一、目的和要求1、進一步掌握在線性表的順序存儲結(jié)構(gòu)上的一些其它操作。 二、實驗內(nèi)容1、已知一個線性表,用另辟空間和利用原表兩種方法把線性表逆置。2、已知兩個非遞減有序的線性表LA和LB,將LA和LB合并成一個線性表LC,LC也非遞減有序。3、已知兩個非遞減有序的線性表LA和LB,長度分別為m和n,假設(shè)LA的空間足夠大,利用原表LA,

17、將LA和LB合并成一個仍然非遞減有序的線性表。要求時間復雜度為O(m+n)。4、約瑟夫環(huán)問題:任給正整數(shù)N和K,按下述方法可以得到1,2, ,n的一個置換,將數(shù)字1,2,n環(huán)形排列,按順時針方向自1開始報數(shù),報到K時輸出該位置上的數(shù)字,并使其出列。然后從他在順時針方向的下一個數(shù)字繼續(xù)報數(shù),如此下去,直到所有的數(shù)字全部出列為止。例如N=10,K=3,則正確的出列順序應為3,6,9,2,7,1,8,5,10,4。三、儀器、設(shè)備和材料1、 計算機若干臺 四、實驗步驟1、已知一個線性表,用另辟空間和利用原表兩種方法把線性表逆置。typedef int ElemType; /* 定義ElemType為i

18、nt類型 */*順序表存儲空間的總分配量*/#define MAXSIZE 100#define FALSE 0#define TRUE 1typedef struct /* 順序存儲類型 */ElemType dataMAXSIZE; /*存放線性表的數(shù)組*/ int length; /* length是順序表的長度*/SeqList;SeqList reverse(SeqList A) /*順序表的就地逆置 */ int i,j;ElemType temp; for(i=0,j=A.length-1;ij;i+,j-) /*i,j分別是低端和高端下標*/temp=A.datai; /*交換

19、*/ A.datai=A.dataj; A.dataj =temp; return A;/* 遍歷順序表 */void ListTraverse(SeqList L)int i; if(L.length=0) printf(順序表為空n); else printf(當前順序表中的元素為:n); for(i=1;i=L.length;i+) printf(%d ,L.datai-1); printf(n); SeqList create(int n)SeqList L;ElemType e; int i; printf(input element:n); for(i=0;in;i+) scanf

20、(%d,&e); L.datai=e; L.length=n; return L;main()int n;SeqList L; printf(input the number:); scanf(%d,&n); L=create(n); L=reverse(L); printf(順序表已經(jīng)逆置n); ListTraverse(L);2、已知兩個非遞減有序的線性表LA和LB,將LA和LB合并成一個線性表LC,LC也非遞減有序。SeqList MergeSeqList(SeqList La,SeqList Lb)int i,j,k;SeqList Lc; i=0;j=0;k=0; while(iLa

21、.length&jLb.length) /*La,Lb都沒結(jié)束*/ if(La.datai=Lb.dataj) Lc.datak=La.datai;i+;k+; /*La當前元素小復制到Lc中*/ elseLc.datak=Lb.dataj;j+;k+;/*Lb當前元素小復制到Lc中*/ while(iLa.length) Lc.datak=La.datai;i+;k+; /*La還沒結(jié)束*/ while(jLb.length) Lc.datak=Lb.dataj;j+;k+; /*Lb還沒結(jié)束*/ Lc.length=k; /*Lc表長為k*/ return Lc;void ListTrav

22、erse(SeqList L) /* 遍歷順序表 */int i; if(L.length=0) printf(順序表為空n); else printf(當前順序表中的元素為:n); for(i=1;i=0&j=0)if(La.datai=Lb.dataj) /*大的向La的后面復制*/ La.datak=La.datai;i-;k-; else La.datak=Lb.dataj;j-;k-; while(i0) Lc.datak=La.datai;i-;k-;/*La沒有結(jié)束*/ while(j0) Lc.datak=Lb.dataj;j-;k-; /*Lb沒有結(jié)束*/ La.length

23、=m+n; /*合并后的表長*/ return La;void ListTraverse(SeqList L) /* 遍歷順序表 */int i; if(L.length=0) printf(順序表為空n); else printf(當前順序表中的元素為:n); for(i=1;i=L.length;i+) printf(%d ,L.datai-1); printf(n); SeqList create()SeqList L;ElemType e; int i=0; scanf(%d,&e); while(e!=-1) L.datai=e;i+;scanf(%d,&e); L.length=i

24、; return L;main()int n;SeqList La,Lb,Lc; printf(請輸入非遞減有序的La的元素,輸入-1結(jié)束:n); La=create(); printf(請輸入非遞減有序的Lb的元素,輸入-1結(jié)束:n); Lb=create(); Lc=MergeSeqList(La,Lb,La.length,Lb.length); printf(順序表已經(jīng)合并n); ListTraverse(Lc);4、約瑟夫環(huán)問題#define MAXSIZE 100void Js(int n,int k)int i,j,s,AMAXSIZE; for(i=0;in;i+) Ai=1;

25、/*1為是否輸出標志*/ j=0; for(i=0;in;i+)s=0; while(snext=NULL; return L;void LinkedListClear(LinkedList L) /* 清空單鏈表 */L-next=NULL; printf(鏈表已經(jīng)清空n);int LinkedListEmpty(LinkedList L) /* 檢查單鏈表是否為空 */if(L-next=NULL) return TRUE; else return FALSE;void LinkedListTraverse(LinkedList L) /* 遍歷單鏈表 */LinkedList p; p=

26、L-next; if(p=NULL) printf(單鏈表為空表n); elseprintf(鏈表中的元素為:n); while(p!=NULL) printf(%d ,p-data); p=p-next; printf(n);int LinkedListLength (LinkedList L)LinkedList p; int j; p=L-next; j=0; while(p!=NULL) j+;p=p-next; return j; LinkedList LinkedListGet(LinkedList L,int i)LinkedList p;int j; p=L-next;j=1;

27、 while (p!=NULL & jnext; j+; if (j=i) return p; else return NULL;int LinkedListLocate ( LinkedList L, ElemType x)LinkedList p;int j; p=L-next; j=1; while ( p!=NULL & p-data != x) p=p-next;j+; if(p) return j; else return 0; void LinkedListInsert(LinkedList L, int i, ElemType x)LinkedList p,s; int j;

28、j=1;p=L; while(p&jnext;j+; if(p=NULL|ji) printf(插入位置不正確n); else s=(LNode *)malloc(sizeof(LNode); s-data=x; s-next=p-next; p-next=s; printf(%d已插入到鏈表中n,x); void LinkedListDel(LinkedList L,int i) LinkedList p,q; int j; j=1;p=L; while(p-next&jnext;j+; if(p-next=NULL)printf(刪除位置不正確n); else q=p-next;p-nex

29、t=q-next;free(q); printf(第%d個元素已從鏈表中刪除n,i); LinkedList LinkedListCreat( ) LinkedList L=LinkedListInit(),p,r; ElemType x; r=L; printf(請依次輸入鏈表中的元素,輸入-1結(jié)束n); scanf(%d,&x); while (x!=flag)p=(LinkedList)malloc(sizeof(LNode);p-data=x;r-next=p;r=p;scanf(%d,&x);r-next=NULL;return L;int scan()int d; printf(請

30、選擇要進行的操作n); printf(1.初始化 2.清空3.求鏈表長度4.檢查鏈表是否為空n); printf(5.遍歷鏈表 6.從鏈表中查找元素n); printf(7.從鏈表中查找與給定元素值相同的元素在順序表中的位置n); printf(8.向鏈表中插入元素9. 從鏈表中刪除元素n); printf(其他鍵退出。n); scanf(%d,&d); return(d);main()int quit=0;int i,locate;ElemType e; LinkedList L,p; while(!quit) switch(scan() case 1:L=LinkedListInit();

31、printf(n);break; case 2:LinkedListClear(L);printf(n);break; case 3:printf(鏈表的長度為 %dn,LinkedListLength(L);break; case 4:if(LinkedListEmpty(L)printf(鏈表為空n);else printf(鏈表非空n);break; case 5:LinkedListTraverse(L);break; case 6:printf(請輸入待查詢元素在鏈表中的位置:);scanf(%d,&i);p=LinkedListGet(L,i);if(p)printf(鏈表中第%d

32、個元素的值為:%dn,i,p-data);else printf(查詢位置不正確n);break; case 7:printf(請輸入待查詢元素的值:);scanf(%d,&e);locate=LinkedListLocate(L,e);if(locate) printf(%d在鏈表中的位置是:%dn,e,locate);else printf(鏈表中沒有值為%d的元素n,e);break; case 8:printf(請輸入插入元素的位置和值(中間以空格或回車分隔):n);scanf(%d%d,&i,&e);LinkedListInsert(L,i,e);break; case 9:if(L

33、inkedListLength(L)=0)printf(鏈表已經(jīng)為空,不能刪除n); else printf(請輸入待刪除元素的位置:n);scanf(%d,&i);LinkedListDel(L,i);break; case 10:L=LinkedListCreat(); printf(n);break; default:quit=1;實驗四 鏈表其它操作一、目的和要求1、熟悉對單鏈表的一些其它操作。2、掌握循環(huán)鏈表和雙鏈表的一些操作,理解與單鏈表操作的不同。二、實驗內(nèi)容1、設(shè)單鏈表L是一個非遞減有序表,寫一算法將x插入其中后仍保持L的有序性。2、利用原空間,將兩個單鏈表合并成一個單鏈表。3

34、、已知兩個非遞減有序的單鏈表la和lb,將la和lb合并成一個線性表lc,lc也非遞減有序。4、已知一個單鏈表,利用原表把單鏈表逆置。5、在計算機上先輸入一串正整數(shù)的序列。請編寫一個程序,首先用鏈表存儲該序列。然后執(zhí)行刪除操作,即先從鏈表中找出最小的結(jié)點,刪除它。然后再在剩余的鏈表中,找出最小的結(jié)點,再刪除之。直至表空為止。6、利用單循環(huán)鏈表作為存儲結(jié)構(gòu),實現(xiàn)實驗二中的約瑟夫環(huán)問題。7、在雙向鏈表上實現(xiàn)線性表運算。8、設(shè)有一個雙鏈表,每個結(jié)點中除有prior,next及data可設(shè)為正整數(shù)三個域之外,還有一個專門記錄訪問該結(jié)點次數(shù)的數(shù)據(jù)域freq,其值在初始化時為零。每當在鏈表中進行一次Sea

35、rchl,key時,則數(shù)據(jù)域data之值等于key的結(jié)點,其freq域之值將加一。并使該雙鏈表中結(jié)點按freq之值的遞減順序排列,freq值越大的結(jié)點越靠近表頭。請編寫符合上述要求的Searchl,key程序。三、儀器、設(shè)備和材料1、 計算機若干臺 四、實驗步驟1、將x插入L后仍保持L的有序性。#include stdio.h#define NULL 0typedef struct LNodeint data; struct LNode *next; LNode,*LinkedList;LinkedList LinkedListCreat( ) LinkedList L,p,r; int x,

36、flag=-1; L=(LinkedList)malloc(sizeof(LNode); L-next=NULL; r=L; printf(請輸入遞增的有序序列,輸入-1結(jié)束n); scanf(%d,&x); while (x!=flag)p=(LinkedList)malloc(sizeof(LNode); p-data=x; r-next=p; r=p;scanf(%d,&x); r-next=NULL; return L;void InsertList(LinkedList L,int x)LinkedList p,q,s; q=L;p=q-next; while(p!=NULL&p-d

37、atanext; s=(LinkedList)malloc(sizeof(LNode); s-data=x; s-next=q-next; q-next=s;void print(LinkedList L) /*輸出鏈表中的結(jié)點*/LinkedList p; p=L-next; while(p!=NULL) printf(%d ,p-data); p=p-next; main( )LinkedList L; int x; L=LinkedListCreat( ); printf(請輸入要插入的元素:); scanf(%d,&x); InsertList(L,x); print(L);2、利用原

38、空間,將兩個單鏈表合并成一個單鏈表。#include stdio.h#define NULL 0typedef struct LNodeint data; struct LNode *next; LNode,*LinkedList;LinkedList LinkedListCreat( ) LinkedList L,p,r; int x,flag=-1; L=(LinkedList)malloc(sizeof(LNode); L-next=NULL; r=L; printf(請輸入鏈表中的結(jié)點,以-1結(jié)束n); scanf(%d,&x); while (x!=flag)p=(LinkedLis

39、t)malloc(sizeof(LNode); p-data=x; r-next=p; r=p;scanf(%d,&x); r-next=NULL; return L;LinkedList ListConcat(LinkedList La,LinkedList Lb)/*把鏈表Lb接在La后面*/ LinkedList Lc,p; Lc=La;p=La; while(p-next) p=p-next; p-next=Lb-next; return Lc;void print(LinkedList L) /*輸出鏈表中的結(jié)點*/LinkedList p; p=L-next; while(p!=N

40、ULL) printf(%d ,p-data); p=p-next; main( )LinkedList La,Lb; La=LinkedListCreat( ); Lb= LinkedListCreat( ); La=ListConcat(La,Lb); print(La);3、兩個非遞減有序的單鏈表la和lb,合并成一個非遞減有序線性表lc。#define NULL 0typedef struct LNodeint data; struct LNode *next; LNode,*LinkedList;LinkedList LinkedListCreat() LinkedList L,p,

41、r; int x,flag=-1; L=(LinkedList)malloc(sizeof(LNode); L-next=NULL; r=L; printf(請輸入非遞減有序表,以-1結(jié)束n); scanf(%d,&x); while (x!=flag)p=(LinkedList)malloc(sizeof(LNode); p-data=x; r-next=p; r=p;scanf(%d,&x); r-next=NULL; return L;LinkedList un(LinkedList La,LinkedList Lb) /*合并鏈表*/LinkedList p,q,r; p=La-nex

42、t; q=Lb-next; r=La; while(p!=NULL)&(q!=NULL) if(p-datadata) r-next=p; r=p;p=p-next; else r-next=q; r=q;q=q-next; if(p!=NULL) r-next=p; if(q!=NULL) r-next=q; return La;void print(LinkedList L) /*輸出鏈表中的結(jié)點*/LinkedList p; p=L-next; while(p!=NULL) printf(%d ,p-data); p=p-next; main( )LinkedList La,Lb,Lc;

43、 La=LinkedListCreat( ); Lb= LinkedListCreat( ); Lc=un(La,Lb); print(Lc);4、把單鏈表逆置(見課后習題)。5、在計算機上先輸入一串正整數(shù)的序列。首先用鏈表存儲該序列。然后從鏈表中找出最小的結(jié)點,刪除它。直至表空為止。6、利用單循環(huán)鏈表作為存儲結(jié)構(gòu),實現(xiàn)實驗二中的約瑟夫環(huán)問題。7、在雙向鏈表上實現(xiàn)線性表的下列運算:a)建立 DLinkedList creat()b)插入void DlistInsert(DLinkedList L,int x,int i)c)刪除void DlistDelete(DLinkedList L,in

44、t i)8、設(shè)有一個雙鏈表,每個結(jié)點中除有prior,next及data可設(shè)為正整數(shù)三個域之外,還有一個專門記錄訪問該結(jié)點次數(shù)的數(shù)據(jù)域freq,其值在初始化時為零。每當在鏈表中進行一次Searchl,key時,則數(shù)據(jù)域data之值等于key的結(jié)點,其freq域之值將加一。并使該雙鏈表中結(jié)點按freq之值的遞減順序排列,freq值越大的結(jié)點越靠近表頭。#define NULL 0typedef struct DLNodeint data,freq; struct DLNode *prior,*next;DLNode,*DLinkedList;DLinkedList creat()int num;

45、 DLinkedList head,p1,p2; head=(DLinkedList)malloc(sizeof(DLNode);head-next=NULL; /*表頭為空 */ p2=head;printf(輸入元素,以-1結(jié)束:);scanf(%d,&num);while(num!=-1) p1=(DLinkedList)malloc(sizeof(DLNode); p1-data=num; p1-freq=0; p2-next=p1; p1-prior=p2; p2=p1; scanf(%d,&num); p2-next=NULL;return head;void search(DLi

46、nkedList head, int key)DLinkedList p1,p2,temp; p2=head; p1=p2-next; while(p1) if(p1-data=key) p1-freq+; break; else p2=p1; p1=p2-next; if(p1=NULL) printf(沒有發(fā)現(xiàn).n); else if(p1-next=NULL) p2-next=p1-next; temp=p1; else p2-next=p1-next; p1-next-prior=p2;temp=p1;for(p2=head,p1=p2-next; p1 & p1-freq temp-

47、freq;p2=p1,p1=p2-next); /*插入*/ if(p1=NULL) p2-next=temp; temp-prior=p2; temp-next=NULL; else p2-next=temp; temp-prior=p2; temp-next=p1; p1-prior=temp;void print(DLinkedList head)DLinkedList p; p=head-next; doprintf(元素=%d , p-data); printf(頻度=%dn, p-freq); p=p-next; while(p);int main()DLinkedList hea

48、d; int key; head=creat(); printf(現(xiàn)在元素和其訪問的頻度(按遞減的順序輸出)為:n ); print(head); printf(請輸入要訪問的元素,以-1結(jié)束:); scanf(%d,&key); while(key!=-1) search(head,key); print(head); printf( 請輸入要訪問的元素,以-1結(jié)束:); scanf(%d,&key); 實驗五 表達式求值一、目的和要求1、會定義順序棧和鏈棧的結(jié)點類型。 2、掌握棧的插入和刪除結(jié)點在操作上的特點。3、熟悉對棧的一些基本操作和具體的函數(shù)定義。 二、實驗內(nèi)容1、實現(xiàn)順序棧的定義和操作。該程序包括定義的棧結(jié)構(gòu)類型以及對每一種棧操作的具體的函數(shù)定義和主函數(shù)。2、用順序棧實現(xiàn)算術(shù)表達式求值。3、用鏈棧實現(xiàn)算術(shù)表達式求值。三、儀器、設(shè)備和材料1、 計算機若干臺 四、實驗步驟1、該程序包括定義的棧結(jié)構(gòu)類型以及對每一種棧操作的具體的函數(shù)定義和主函數(shù)。typedef int DataType; /* 定義DataType為int類型 */* 棧的結(jié)點類型 */#define MAXSIZE 1024 typedef struct

展開閱讀全文
溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!