




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、金陵科技學院實驗報告學 生 實 驗 報 告 冊(理工類)課程名稱:算法與數據結構 專業(yè)班級: _ 學生學號:_ 學生姓名: _ 所屬院部: - 指導教師: 20 13 20 14 學年 第 2 學期 金陵科技學院教務處制實驗報告書寫要求實驗報告原則上要求學生手寫,要求書寫工整。若因課程特點需打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用A4的紙張。實驗報告書寫說明實驗報告中一至四項內容為必填項,包括實驗目的和要求;實驗儀器和設備;實驗內容與過程;實驗結果與分析。各院部可根據學科特點和實驗具體要求增加項目。填寫注意事項(1)細致觀察,及時、準確、如實記錄。(2)準確說明,層次清晰。
2、(3)盡量采用專用術語來說明事物。(4)外文、符號、公式要準確,應使用統(tǒng)一規(guī)定的名詞和符號。(5)應獨立完成實驗報告的書寫,嚴禁抄襲、復印,一經發(fā)現,以零分論處。實驗報告批改說明實驗報告的批改要及時、認真、仔細,一律用紅色筆批改。實驗報告的批改成績采用百分制,具體評分標準由各院部自行制定。實驗報告裝訂要求實驗批改完畢后,任課老師將每門課程的每個實驗項目的實驗報告以自然班為單位、按學號升序排列,裝訂成冊,并附上一份該門課程的實驗大綱。實驗項目名稱: 順序表 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗1 順序表一、實驗目的和要求掌握順序表的定位
3、、插入、刪除等操作。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1) 編寫程序建立一個順序表,并逐個輸出順序表中所有數據元素的值。編寫主函數測試結果。(2) 編寫順序表定位操作子函數,在順序表中查找是否存在數據元素x。如果存在,返回順序表中和x值相等的第1個數據元素的序號(序號從0開始編號);如果不存在,返回1。編寫主函數測試結果。(3) 在遞增有序的順序表中插入一個新結點x,保持順序表的有序性。解題思路:首先查找插入的位置,再移位,最后進行插入操作;從第一個元素開始找到第一個大于該新結點值x的元素位置i即為插入
4、位置;然后將從表尾開始依次將元素后移一個位置直至元素i;最后將新結點x插入到i位置。(4) 刪除順序表中所有等于X的數據元素。2、選做題(5) 已知兩個順序表A和B按元素值遞增有序排列,要求寫一算法實現將A和B歸并成一個按元素值遞減有序排列的順序表(允許表中含有值相同的元素)。程序清單:1.(1)#include<stdio.h>#define maxsize 20typedef struct int datamaxsize; int last;sequenlist;void Creatlist(sequenlist *L,int n)/建立順序表 int i; for(i=0;i
5、<n;i+) scanf("%d",&(*L).datai); (*L).last=n;void Outputlist(sequenlist *L,int n)/輸出順序表 int j; for(j=0;j<n;j+) printf("%2d",(*L).dataj); printf("n");int main() int n=5; sequenlist L; Creatlist(&L,n); printf("The array is:"); Outputlist(&L,n);
6、return 0; (2) int Search(sequenlist *L,int n,int x)/搜索數據元素x int i,flag=-1; for(i=0;i<n;i+) if(L->datai=x) flag=i; break; return flag;(3)#include<stdio.h>#define maxsize 20typedef struct int datamaxsize; int last;sequenlist;void Creatlist(sequenlist *L,int n)/創(chuàng)建順序表 int i; for(i=0;i<n;i
7、+) scanf("%d",&(*L).datai); (*L).last=n;void Outputlist(sequenlist *L,int n)/輸出順序表 int j; for(j=0;j<n;j+) printf("%2d",(*L).dataj); printf("n");void Insert(sequenlist *L,int n,int x)/插入元素X int i,j; for(i=0;i<n;i+) if(L->datai<x) continue;else for(j=L->
8、;last;j>=i;j-) L->dataj+1=L->dataj; L->datai=x; break; L->last+;int main() int n=5,x; sequenlist L; Creatlist(&L,n); printf("The array is:"); Outputlist(&L,n); printf("The added number is:"); scanf("%d",&x); Insert(&L,n,x); Outputlist(&
9、;L,L->last); return 0;(4) void Delete(sequenlist *L,int n,int x) int i,j; for(i=0;i<n;i+) if(*L).datai!=x) continue;else for(j=i;j<n-1;j+) (*L).dataj=(*L).dataj+1; n-; i-; (*L).last=n;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 單鏈表 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 3實
10、驗2 單鏈表一、實驗目的和要求1、實驗目的掌握單鏈表的定位、插入、刪除等操作。2、實驗要求(1)注意鏈表的空間是動態(tài)分配的,某結點不用之后要及時進行物理刪除,以便釋放其內存空間。(2)鏈表不能實現直接定位,一定注意指針的保存,防止丟失。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1) 編寫程序建立一個單鏈表,并逐個輸出單鏈表中所有數據元素。(2) 在遞增有序的單鏈表中插入一個新結點x,保持單鏈表的有序性。解題思路:首先查找插入的位置然后進行插入操作;從第一個結點開始找到第一個大于該新結點值的結點即為插入位置;然后
11、在找到的此結點之前插入新結點;注意保留插入位置之前結點的指針才能完成插入操作。(3) 編寫實現帶頭結點單鏈表就地逆置的子函數,并編寫主函數測試結果。2、選做題已知指針LA和LB分別指向兩個無頭結點單鏈表的首元結點。要求編一算法實現,從表LA中刪除自第i個元素起共len個元素后,將它們插入到表LB中第j個元素之前。程序清單:1(1)#include<stdio.h>#include<stdlib.h>typedef struct node int data; struct node *next;linklist;linklist *Creatlist(linklist *
12、head)/創(chuàng)建單鏈表 char ch; linklist *p=NULL,*s=NULL; ch=getchar(); while(ch!='$') p=malloc(sizeof(linklist); p->data=ch; if(head=NULL) head=p; else s->next=p; s=p; ch=getchar(); if(s!=NULL) s->next=NULL;return head;int main() linklist *head=NULL,*p=NULL; head=Creatlist(head); p=head; whil
13、e(p!=NULL) printf("%c",p->data); p=p->next; return 0;(2)#include<stdio.h>#include<stdlib.h> typedef int datatype; typedef struct node datatype data;struct node *next; linklist; linklist *CREATLISTR(linklist *head) char ch; linklist *s,*r; r=NULL; scanf("%c",&
14、;ch); while(ch!='$') s=malloc(sizeof(linklist);s->data=ch;if(head=NULL) head=s;else r->next=s;r=s; scanf("%c",&ch); if(r!=NULL) r->next=NULL; return head; linklist *INSERT(linklist *head,int x)/插入元素X linklist *s,*q,*r; s=malloc(sizeof(linklist); s->data=x; q=head; r
15、=q->next; while(r->data<x) q=r; r=r->next; s->next=r; q->next=s; return head; int main() char x; linklist *head=NULL,*p=NULL; scanf("%c",&x); head=CREATLISTR(head); p=head; while(p!=NULL) printf("%c",p->data);p=p->next; head=INSERT(head,x); p=head; whi
16、le(p!=NULL) printf("%c",p->data);p=p->next; printf("n"); return 0; (3)linklist *Invert(linklist *head)/將單鏈表逆置 linklist *p=NULL,*q=NULL,*r=NULL; if(head=NULL|head->next=NULL) return head; p=head; q=p->next; while(q!=NULL) r=q->next; q->next=p; p=q; q=r; head->
17、next=NULL; head=p; return head;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 堆棧和隊列 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗3 堆棧和隊列一、實驗目的和要求(1)掌握應用棧解決問題的方法。(2)掌握利用棧進行表達式求和的算法。(3)掌握隊列的存儲結構及基本操作實現,并能在相應的應用問題中正確選用它們。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1) 判斷一個算
18、術表達式中開括號和閉括號是否配對。(2) 假設稱正讀和反讀都相同的字符序列為”回文”,試寫一個算法判別讀入的一個以為結束符的字符序列是否是“回文”。2、選做題(1)測試“漢諾塔”問題。(2)在順序存儲結構上實現輸出受限的雙端循環(huán)隊列的入列和出列算法。設每個元素表示一個待處理的作業(yè),元素值表示作業(yè)的預計時間。入隊列采取簡化的短作業(yè)優(yōu)先原則,若一個新提交的作業(yè)的預計執(zhí)行時間小于隊頭和隊尾作業(yè)的平均時間,則插入在隊頭,否則插入在隊尾。程序清單:1(1)#include<stdio.h>#include<stdlib.h>#define maxsize 64typedef st
19、ruct node char datamaxsize; int top;seqstack;int Judge(char a,int n,seqstack *s)/判斷括號是否配對 int i,flag=1; s->top=-1; for(i=0;i<n;i+) if(ai='(') s->top+; s->datas->top=ai; if(ai=')') if(s->top=-1|s->datas->top!='(')flag=0;break;else s->top-; if(s->t
20、op>-1) flag=0; return flag;int main() seqstack s; char amaxsize=0,ch; int n=0,flag; ch=getchar(); an=ch; while(ch!=''&&n<maxsize) ch=getchar(); a+n=ch; flag=Judge(a,n,&s); if(flag=0) printf("該算式括號不配對!"); else printf("該算式括號配對。"); return 0;2(1)#include<
21、stdio.h>void move(char x,char z)printf("%c->",x); printf("%cn",z);void Hanoi(int n,char x, char y,char z) if(n=1) move(x,z); else Hanoi(n-1,x,z,y); move(x,z); Hanoi(n-1,y,x,z); int main() int m; printf("請你輸入A上面的碟子總數"); scanf("%d",&m); Hanoi(m,'A&
22、#39;,'B','C'); return 0;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 串 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗4 串一、實驗目的和要求掌握串的存儲及應用。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1) 編寫輸出字符串s中值等于字符ch的第一個字符的函數,并用主函數測試結果。(2) 編寫輸出字符串s中值等于字符ch的所有字符的函數,并用
23、主函數測試結果。解題思路:可以將第一題程序改進成一個子函數,在本題中循環(huán)調用。(3) 設字符串采用單字符的鏈式存儲結構,編程刪除串s從位置i開始長度為k的子串。2、選做題假設以鏈結構表示串,編寫算法實現將串S插入到串T中某個字符之后,若串T中不存在這個字符,則將串S聯接在串T的末尾。提示:為提高程序的通用性,插入位置字符應設計為從鍵盤輸入。程序清單:1(1)#include <stdio.h>#include <string.h>int Search(char a,char x) int i; for(i=0;i<strlen(a);i+) if(ai=x) re
24、turn i;int main() int location; char ch; char s50; gets(s); scanf("%c",&ch); location=Search(s,ch); printf("%d",location);(2)#include <stdio.h>#include <string.h>void Search(char a,char x) int i; for(i=0;i<strlen(a);i+) if(ai=x) printf("%d ",i);int ma
25、in() char ch; char s50; gets(s); scanf("%c",&ch); Search(s,ch); (3)#include<stdio.h>#include<stdlib.h>typedef struct linknode char data; struct linknode *next;linkstring;linkstring *Creatlink(linkstring *S) linkstring *p=NULL,*q=NULL; char ch; ch=getchar(); while(ch!='$
26、') p=malloc(sizeof(linkstring);p->data=ch;if(S=NULL) S=p,q=p;else q->next=p,q=p; ch=getchar(); if(q->next!=NULL) q->next=NULL; return S;linkstring *Delete(linkstring *S,int i,int k)/假定字符串足夠長 linkstring *p=S,*q; int m=2; while(m<i) p=p->next; m+; m=0; if(i=1)while(m<k)S=p->
27、;next;free(p);p=S;m+; elsewhile(m<k) q=p->next;p->next=q->next; free(q);m+; return S;void Output(linkstring *S) linkstring *p=S; while(p!=NULL) printf("%2c",p->data); p=p->next; int main() linkstring *S=NULL; int i,k; S=Creatlink(S); Output(S); printf("n"); prin
28、tf("Please enter the location and the length:"); scanf("%d%d",&i,&k); S=Delete(S,i,k); getchar(); Output(S); printf("n"); return 0;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 二叉樹 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗5 二叉樹一、實驗目的和要求(1)掌握二叉樹的生
29、成,以及前、中、后序遍歷算法。(2)掌握應用二叉樹遞歸遍歷思想解決問題的方法。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1) 建立一棵二叉樹。對此樹進行前序遍歷、中序遍歷及后序遍歷,輸出遍歷序列。(2) 在第一題基礎上,求二叉樹中葉結點的個數。(3) 在第一題基礎上,求二叉樹中結點總數。(4) 在第一題基礎上,求二叉樹的深度。2、選做題已知一棵完全二叉樹存于順序表sa中,sa.elem1sa.last存儲結點的值。試編寫算法由此順序存儲結構建立該二叉樹的二叉鏈表。解題思路:根據完全二叉樹順序存儲的性質來確定二叉
30、樹的父子關系即“還原”了二叉樹,之后再按照二叉樹二叉鏈表的構造方法進行建立。完全二叉樹順序存儲的一個重要性質為,第i個結點的左孩子是編號為2i的結點,第i個結點的右孩子是編號為2i+1的結點。程序清單:1#include<stdio.h>#include<stdlib.h>#define maxsize 64typedef struct node char data; struct node *lchild,*rchild;bitree;bitree *Qmaxsize;bitree *Creattree(bitree *root,int *n) char ch; in
31、t front=1,rear=0; bitree *s; ch=getchar(); while(ch!='$') s=NULL; if(ch!='') s=malloc(sizeof(bitree); s->data=ch; s->lchild=NULL; s->rchild=NULL; (*n)+; rear+; Qrear=s; if(rear=1) root=s; else if(s&&Qfront) if(rear%2=0) Qfront->lchild=s; else Qfront->rchild=s;i
32、f(rear%2=1) front+; ch=getchar(); return root;void PreOrder(bitree *root) if(root) printf("%2c",root->data); PreOrder(root->lchild); PreOrder(root->rchild); void InOrder(bitree *root) if(root) InOrder(root->lchild); printf("%2c",root->data); InOrder(root->rchild
33、); void PostOrder(bitree *root) if(root) PostOrder(root->lchild); PostOrder(root->rchild); printf("%2c",root->data); int leafnum(bitree *root) if(root=NULL) return 0; else if(root->lchild=NULL&&root->rchild=NULL) return 1; else return leafnum(root->lchild)+leafnum
34、(root->rchild);int main() int n0,n=0; bitree *root=NULL; root=Creattree(root,&n); PreOrder(root);/前序遍歷 printf("n"); InOrder(root);/中序遍歷 printf("n"); PostOrder(root);/后序遍歷 printf("n"); n0=leafnum(root); printf("葉子節(jié)點總數是:%dn",n0); printf("節(jié)點總數是%dn&quo
35、t;,n); return 0;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 圖 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗6 圖一、實驗目的和要求(1)熟練掌握圖的基本概念、構造及其存儲結構。(2)熟練掌握對圖的深度優(yōu)先搜索遍歷和廣度優(yōu)先搜索遍歷的算法。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題(1)構造一個無向圖(用鄰接矩陣表示存儲結構)。(2)對上面所構造的無向圖,進行深度優(yōu)先遍歷和廣度優(yōu)先
36、遍歷,輸出遍歷序列。2、選做題采用鄰接表存儲結構,編寫一個判別無向圖中任意給定的兩個頂點之間是否存在一條長度為k的簡單路徑的算法。簡單路徑是指其頂點序列中不含有重復頂點的路徑。提示:兩個頂點及k值均作為參數給出。程序清單:1#include<stdio.h>#define N 3#define M 5typedef struct char dataN; int locationNN;graph;void Creatgraph(graph *g) /建立無向圖 int i,j,k; int w; for(i=0;i<N;i+) g->datai=getchar(); fo
37、r(i=0;i<N;i+)for(j=0;j<N;j+) g->locationij=0;for(k=0;k<M;k+) scanf("%d%d%f",&i,&j,&w); g->locationij=w; g->locationji=w;int visitedN=0;void DFS(graph *g,int i) /深度優(yōu)先遍歷無向圖 int j; printf("node:%cn",g->datai); visitedi=1; for(j=0;j<N;j+)if(g->l
38、ocationij=1)&&(!visitedj) DFS(g,j);void BFS(graph *g,int i)/廣度優(yōu)先遍歷int j;printf("%d ",g->datai); visitedi=1;for(j=0;j<N;j+)if(g->locationij!=0 && visitedj!=1) BFS(g,j);int main() graph g; Creatgraph(&g); DFS(&g,3); BFS(&g,3); printf("n"); retur
39、n 0;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗項目名稱: 排序 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 實驗7 排序一、實驗目的和要求(1)熟練掌握希爾排序、堆排序、直接插入排序、起泡排序、快速排序、直接選擇排序、歸并排序和基數排序的基本概念。(2)掌握以上各種排序的算法。區(qū)分以上不同排序的優(yōu)、缺點。二、實驗儀器和設備Turbo C 2.0 / Visual C + 6.0三、實驗內容與過程(含程序清單及流程圖)1、必做題用隨機數產生10000個待排序數據元素的關鍵字值。測試下列各排
40、序函數的機器實際執(zhí)行時間(至少測試兩個):直接插入排序、希爾排序(增量為4,2,1)、冒泡排序、快速排序、直接選擇排序、二路歸并排序、堆排序。2、選做題假設含n個記錄的序列中,其所有關鍵字為值介于v和w之間的整數,且其中很多關鍵字的值是相同的。則可按如下方法排序:另設數組numbervw,令numberi統(tǒng)計關鍵字為整數i的紀錄個數,然后按number重排序列以達到有序。試編寫算法實現上述排序方法,并討論此種方法的優(yōu)缺點。程序清單:1.直接選擇排序:#include<stdio.h>#include<stdlib.h>#include<time.h>#def
41、ine N 1000void Creatstring(int a) int i; int rand(void); srand(time(NULL); for(i=0;i<N;i+) ai=rand()%N;void Outputstring(int a) int i; for(i=0;i<N;i+) printf("%4d",ai); if(i+1)%20=0) printf("n"); void Sortstring(int a)/排序 int i,j,temp; int k; for(i=0;i<N-1;i+) k=i; for(j
42、=i+1;j<N;j+) if(aj<ak) k=j; if(i!=k) temp=ai; ai=ak; ak=temp; int main() int aN; Creatstring(a); Outputstring(a); printf("n"); Sortstring(a); Outputstring(a); return 0;冒泡排序:void Sortstring(int a)int i,j,t,flag;for(i=0;i<N-1;i+)flag=1;for(j=N-1;j>i;j-) if(aj-1>aj) t=aj-1;aj-1=aj;aj=t;flag=0; if(flag) break;四、實驗結果與分析(程序運行結果及其分析)五、實驗體會(遇到問題及解決辦法,編程后的心得體會)實驗
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度安防設備運輸安全責任險合同
- 烏魯木齊物業(yè)前期合同范本
- 中介賣房套房合同范本
- 2025年電站汽車機行業(yè)深度研究分析報告
- 債務債權轉移合同范本
- 互易合同范本
- 中國植物藻類提取物行業(yè)市場前景預測及投資戰(zhàn)略研究報告
- 做房子防水工程合同范本
- 農民農場租賃合同范本
- 債權保證擔保合同范本
- 標準化機房改造方案
- 珠海市第三人民醫(yī)院中醫(yī)智能臨床輔助診療系統(tǒng)建設方案
- 早產臨床診斷與治療指南
- 工程簽證單完整版
- 《義務教育數學課程標準(2022年版)》初中內容解讀
- 全院護理查房(食管裂孔疝)
- 川教版信息技術六年級下冊全冊教案【新教材】
- 2024-2025學年統(tǒng)編版語文九年級下冊第7課《溜索》任務驅動型教學設計
- (國賽)5G組網與運維賽項備考試題庫及答案
- 代寫文章合同模板
- 初中體育與健康 50米加速跑及途中跑 教案
評論
0/150
提交評論