第一篇:算法與數(shù)據(jù)結(jié)構(gòu)實驗 14計統(tǒng)一 1413101001 王成
金陵科技學院實驗報告
學 生 實 驗 報 告 冊
課程名稱:
學生學號:
所屬院部:
(理工類)
算法與數(shù)據(jù)結(jié)構(gòu) 專業(yè)班級:14計算機科學與技術(shù)1 1413101001 學生姓名: 王成
計算機工程 指導教師: 徐永華 15 ——20 16 學年 第 二 學期
金陵科技學院教務處制
金陵科技學院實驗報告
實驗報告書寫要求
實驗報告原則上要求學生手寫,要求書寫工整。若因課程特點需打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用A4的紙張。
實驗報告書寫說明
實驗報告中一至四項內(nèi)容為必填項,包括實驗目的和要求;實驗儀器和設備;實驗內(nèi)容與過程;實驗結(jié)果與分析。各院部可根據(jù)學科特點和實驗具體要求增加項目。
填寫注意事項
(1)細致觀察,及時、準確、如實記錄。(2)準確說明,層次清晰。
(3)盡量采用專用術(shù)語來說明事物。
(4)外文、符號、公式要準確,應使用統(tǒng)一規(guī)定的名詞和符號。(5)應獨立完成實驗報告的書寫,嚴禁抄襲、復印,一經(jīng)發(fā)現(xiàn),以零分論處。
實驗報告批改說明
實驗報告的批改要及時、認真、仔細,一律用紅色筆批改。實驗報告的批改成績采用百分制,具體評分標準由各院部自行制定。
實驗報告裝訂要求
實驗批改完畢后,任課老師將每門課程的每個實驗項目的實驗報告以自然班為單位、按學號升序排列,裝訂成冊,并附上一份該門課程的實驗大綱。
金陵科技學院實驗報告
實驗項目名稱: 順序表 實驗學時: 2 同組學生姓名: 實驗地點: A101 實驗日期: 4.5 實驗成績: 批改教師: 批改時間:
金陵科技學院實驗報告
實驗1 順序表
一、實驗目的和要求
掌握順序表的定位、插入、刪除等操作。
二、實驗儀器和設備
Turbo C 2.0
三、實驗內(nèi)容與過程(含程序清單及流程圖)
1、必做題
(1)編寫程序建立一個順序表,并逐個輸出順序表中所有數(shù)據(jù)元素的值。編寫主函數(shù)測試結(jié)果。
(2)編寫順序表定位操作子函數(shù),在順序表中查找是否存在數(shù)據(jù)元素x。如果存在,返回順序表中和x值相等的第1個數(shù)據(jù)元素的序號(序號從0開始編號);如果不存在,返回-1。編寫主函數(shù)測試結(jié)果。(3)在遞增有序的順序表中插入一個新結(jié)點x,保持順序表的有序性。
解題思路:首先查找插入的位置,再移位,最后進行插入操作;從第一個元素開始找到第一個大于該新結(jié)點值x的元素位置i即為插入位置;然后將從表尾開始依次將元素后移一個位置直至元素i;最后將新結(jié)點x插入到i位置。
(4)刪除順序表中所有等于X的數(shù)據(jù)元素。
2、選做題
(5)已知兩個順序表A和B按元素值遞增有序排列,要求寫一算法實現(xiàn)將A和B歸并成一個按元素值遞減有序排列的順序表(允許表中含有值相同的元素)。
程序清單:
#include
金陵科技學院實驗報告
{
} int locate(sequenlist a,int x){
} int insert(sequenlist *a,int x){ int i,j;int i;for(i=0;i } return-1;if(a.data[i]==x){ } return i;int i;printf(“要輸入幾個數(shù):n”);scanf(“%d”,&a->length);if(a->length<=maxsize){ } else printf(“溢出n”);for(i=0;i } printf(“請輸入數(shù)字:n”);scanf(“%d”,&a->data[i]); 金陵科技學院實驗報告 } if(a->length==maxsize){ } for(i=0;i } a->data[a->length]=x;a->length++;if(a->data[i]>x){ } for(j=a->length-1;j>=i;j--)a->data[j+1]=a->data[j];printf(“溢出”);return-1;a->data[i]=x;a->length++;return 1;void Delete(sequenlist *a,int x){ int i,j;for(i=0,j=0;i if(a->data[i]==x){ for(j=i;j<(a->length);j++)a->data[j]=a->data[j+1];a->length--;i--; 金陵科技學院實驗報告 } } } void combine(sequenlist *a,sequenlist *b,sequenlist *c){ } main(){ int i,x;int i,j;if((a->length+b->length)>maxsize)printf(“溢出”);else { } for(i=(a->length-1),j=(b->length-1);i>=0||j>=0;){ if(a->data[i]>b->data[j]){ c->data[c->length]=a->data[i];c->length++;i--;} else } { c->data[c->length]=b->data[j];c->length++;j--;} 金陵科技學院實驗報告 sequenlist a,b,c;c.length=0;setup(&a);for(i=0;i 金陵科技學院實驗報告 } for(i=0;i 四、實驗結(jié)果與分析(程序運行結(jié)果及其分析) 金陵科技學院實驗報告 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 這次編程總的來說還是很簡單的,但在編程過程中一定要考慮邊界條件,以免出現(xiàn)數(shù)據(jù)溢出。 金陵科技學院實驗報告 實驗項目名稱: 單鏈表 實驗學時: 2 同組學生姓名: 實驗地點: A101 實驗日期: 2016.4.12 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗2 單鏈表 一、實驗目的和要求 1、實驗目的 掌握單鏈表的定位、插入、刪除等操作。 2、實驗要求 (1)注意鏈表的空間是動態(tài)分配的,某結(jié)點不用之后要及時進行物理刪除,以便釋放其內(nèi)存空間。 (2)鏈表不能實現(xiàn)直接定位,一定注意指針的保存,防止丟失。 二、實驗儀器和設備 Turbo C 2.0 三、實驗內(nèi)容與過程(含程序清單及流程圖) 1、必做題 (1)編寫程序建立一個單鏈表,并逐個輸出單鏈表中所有數(shù)據(jù)元素。(2)在遞增有序的單鏈表中插入一個新結(jié)點x,保持單鏈表的有序性。 解題思路:首先查找插入的位置然后進行插入操作;從第一個結(jié)點開始找到第一個大于該新結(jié)點值的結(jié)點即為插入位置;然后在找到的此結(jié)點之前插入新結(jié)點;注意保留插入位置之前結(jié)點的指針才能完成插入操作。 (3)編寫實現(xiàn)帶頭結(jié)點單鏈表就地逆置的子函數(shù),并編寫主函數(shù)測試結(jié)果。 2、選做題 已知指針LA和LB分別指向兩個無頭結(jié)點單鏈表的首元結(jié)點。要求編一算法實現(xiàn),從表LA中刪除自第i個元素起共len個元素后,將它們插入到表LB中第j個元素之前。程序清單: #include 金陵科技學院實驗報告 linklist *create(){ int i;linklist *head,*p,*r;head=(linklist*)malloc(sizeof(linklist));r=head;printf(“輸入幾個數(shù)據(jù):n”);scanf(“%d”,&head->data);for(i=0;i printf(“請輸入數(shù)據(jù):n”); p=(linklist*)malloc(sizeof(linklist)); scanf(“%d”,&p->data); r->next=p; r=p;} r->next=NULL;return head;} void display(linklist *head){ 金陵科技學院實驗報告 linklist *p;p=head->next;do { printf(“%4d”,p->data); p=p->next;}while(p);printf(“n”);} void sort(linklist *head){ linklist *p,*q;int x;for(p=head->next;p->next!=NULL;p=p->next){ for(q=p->next;q!=NULL;q=q->next) { if(p->data>q->data) { x=p->data; p->data=q->data; q->data=x; 金陵科技學院實驗報告 } } } } void insert(linklist *head){ int x;linklist *p,*r;printf(“輸入要插入的數(shù):n”);scanf(“%d”,&x);r=(linklist*)malloc(sizeof(linklist));r->data=x;p=head->next;while(p->data p=p->next;if(p->next==NULL){ p->next=r; r->next=NULL;} else { 金陵科技學院實驗報告 r->next=p->next;p->next=r;} head->data++;} void ni(linklist *head){ linklist *p,*r;int i,j,n;r=head->next;j=head->data;while(j>head->data /2){ p=head;i=0;while(p->next!=NULL&&i p=p->next; i++;} n=p->data;p->data=r->data; 金陵科技學院實驗報告 r->data=n;j--;r=r->next;} } main(){ linklist *head;head=create();display(head);sort(head);printf(“輸出排序后的:n”);display(head);insert(head);display(head);ni(head);display(head);} 金陵科技學院實驗報告 四、實驗結(jié)果與分析(程序運行結(jié)果及其分析) 五、實驗體會(遇到問題及解決辦法,編程后的心得體會) 在這次試驗中,我學會了單鏈表的建立,插入,刪除等基本操作。剛開始時,由于對單鏈表的操作不是很熟悉出現(xiàn)了很多錯誤,但在翻閱書本后還是一一解決了。 單鏈表比起數(shù)組,它的插入,刪除等操作要更簡便,不會浪費存儲空間。 金陵科技學院實驗報告 實驗項目名稱: 堆棧和隊列 實驗學時: 2 同組學生姓名: 實驗地點: 實驗日期: 實驗成績: 批改教師: 批改時間: 金陵科技學院實驗報告 實驗3 堆棧和隊列 一、實驗目的和要求 (1)掌握應用棧解決問題的方法。(2)掌握利用棧進行表達式求和的算法。 (3)掌握隊列的存儲結(jié)構(gòu)及基本操作實現(xiàn),并能在相應的應用問題中正確選用它們。 二、實驗儀器和設備 Turbo C 2.0 三、實驗內(nèi)容與過程(含程序清單及流程圖) 1、必做題 (1)判斷一個算術(shù)表達式中開括號和閉括號是否配對。(2)測試“漢諾塔”問題。 (3)假設稱正讀和反讀都相同的字符序列為”回文”,試寫一個算法判別讀入的一個以’@’為結(jié)束符的字符序列是否是“回文”。 2、選做題 在順序存儲結(jié)構(gòu)上實現(xiàn)輸出受限的雙端循環(huán)隊列的入列和出列算法。設每個元素表示一個待處理的作業(yè),元素值表示作業(yè)的預計時間。入隊列采取簡化的短作業(yè)優(yōu)先原則,若一個新提交的作業(yè)的預計執(zhí)行時間小于隊頭和隊尾作業(yè)的平均時間,則插入在隊頭,否則插入在隊尾。程序清單: #include 金陵科技學院實驗報告 { if(maxsize-1 == s->top){ printf(“??臻g已滿!”);return;} else { ++s->top;s->data[s->top] = ch;} } char Pop(Stack *s){ char ch;if(-1 == s->top){ printf(“空棧!”);return '