計算機與資訊科技學院綜合性、設計性實驗報告
專業:網路工程年級/班級:大二 2016—2017學年第一學期
一、 實驗目的
(1)熟悉順序表的建立、取值、查詢、插入、刪除等演算法,模組化程式設計方法。
二、 實驗儀器或裝置
(1)硬體裝置:cpu為pentium 4以上的計算機,記憶體2g以上
(2)配置軟體:microsoft windows 7與vc++6.0
三、 總體設計(設計原理、設計方案及流程等)
設計原理:
單鏈表屬於線性表,線性表的儲存結構的特點是:用一組任意儲存單元儲存線性表的資料元素,這組儲存單元可以是連續的,也可以是不連續的。因此,對於某個元素來說,不僅需要儲存其本身的資訊,還需要儲存乙個指示其直接後繼的資訊。
設計方案:
採用模組化設計的方法,設計各個程式段,最終通過主函式實現各個程式段的功能。設計時,需要考慮使用者輸入非法數值,所以要在程式中寫入說可以處理非法數值的**。
設計流程:
1. 引入所需的標頭檔案;
2. 定義狀態值;
3. 寫入順序表的各種操作的**;
寫入主函式,分別呼叫各個函式。在呼叫函式時,採用if結構進行判斷輸入值是否非法,從而執行相應的程式
四、 實驗步驟(包括主要步驟、**分析等)
#include<> // eof(=^z或f6),null
#include<> // srand( ) ,rand( ),exit(n)
#include<> // malloc( ),alloc( ),realloc( )等
#include<> // int_max等
#include<>
#include<>
#include<> // floor(),ceil( ),abs( )
#include<> // cout,cin
#include<> // clock( ),clk_tck,clock_t
#define true1
#define false0
#define ok1
#define error0
#define infeasible -1
#define overflow -2
typedef int statusstatus是函式的型別,
//其值是函式結果狀態**,如ok等
typedef int elemtype;
typedef struct lnode
lnode,*linklistlinklist為指向結構體lnode的指標型別
//初始化單鏈表
演算法步驟:
1. 生成新結點作為頭結點,用頭指標l指向頭結點。
2. 頭結點的指標域置空。
status initlist_l(linklist &l)
//單鏈表的取值
演算法步驟:
1. 用指標p指首元結點,用j做計數器初值賦為1.
2. 從首元結點開始依次順著鏈域next向下訪問,只要指向當前結點的指標p不為空(null),並且沒有到達序號為i的結點,則迴圈執行以下操作:
p指向下一結點;
計數器j相應加1;
3.退出迴圈時,如果指標p為空,或者計數器j大於i,說明指定的序號i值不合法(i大於表長n或i小於等於0),取值失敗返回error,否則取值成功,此時j=i時,p所指的結點就是要找的第i個結點,用引數e儲存當前結點的資料域,返回ok。
status getelem_l(linklist l, int i, elemtype &e)
if(!p||j>i) return error;
e=p->data;
return ok;
}//單鏈表的按值查詢
演算法步驟:
1. 用指標p指首元結點。
2. 從首元結點開始依次順著鏈域next向下查詢,只要指向當前結點的指標p不為空,並且p所指結點的資料域不等於給定值e,則迴圈執行以下操作:p指向下乙個結點。
3. 返回p。若查詢成功,p此時即為結點的位址值,若查詢失敗,p的值即為null。
int locateelem_l(linklist l,elemtype e)
if(p) return j;
else return 0;
}//單鏈表的插入
演算法步驟:
1. 查詢結點ai-1並由指標p指向該結點。
2. 生成乙個新結點*s。
3. 將新結點*s的資料域置為e。
4. 將新結點*s的指標域指向結點ai。
5. 將結點*p的指標域指向新結點*s。
status listinsert_l(linklist &l,int i,elemtype e)
if(!p||j>i-1)
s=new lnode;
s->data=e;
s->next=p->next;
p->next=s;
return ok;
}//單鏈表的刪除
1. 查詢結點ai-1並由指標p指向該結點。
2. 臨時儲存待刪除結點ai的位址在q中,以備釋放。
3. 將結點*p的指標域指向ai的直接後繼結點。
4. 釋放結點ai的空間。
status listdelete_l(linklist &l,int i)
if((!p->next)||(j>i-1))
q=p->next;
p->next=q->next;
delete q;
return ok;
}//單鏈表的輸出
演算法步驟:
1. 將指標p指向l的next域。
2. 輸出p指標的資料。
3. 將指標p後移。
4. 迴圈第2,3步,直到p指標為空(null)。
void listprint_l(linklist l)
while(p);
}void main()
printf("當前單鏈表的內容為:\n");
listprint_l(l);
printf("\n");
printf("請輸入您要插入的資料e及其位置i,使用空格鍵隔開:\n");
scanf("%d %d",&e,&i);
if(listinsert_l(l,i,e))
else
printf("\n");
printf("請輸入您要取的資料序號:\n");
scanf("%d",&i);
if(getelem_l(l,i,e))
else
printf("請輸入要查詢的資料值:\n");
scanf("%d",&e);
if(!locateelem_l(l,e))
else
printf("請輸入要刪除的資料的序號:\n");
scanf("%d",&i);
if(listdelete_l(l,i))
else
printf("\n");
}五、 結果分析與總結
圖1結果分析:
如圖1所示,輸入正確資料時,程式各個功能執行正常。設定輸入資料個數為5,可以輸入5個資料,按回車後,可以顯示我們當前單鏈表中的資料內容。繼續輸入下一指令:
輸入要插入的資料及位置,使用空格鍵隔開,回車後,可以看到已經成功插入。繼續輸入所取的資料序號,可以查詢該資料的值。輸入要查詢的資料,可以返回該資料的位置。
輸入要刪除的資料,可以返回刪除該元素後的單鏈表的內容。
總結:在單鏈表中,對資料元素ai來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊。這兩部分資訊組成資料元素ai的儲存映像,稱為結點。
它包括兩個域;其中儲存資料元素的域稱為資料域;儲存直接後繼的域稱為指標域。
教師簽名:
資料僅供參考!
致力為企業和個人提供合同協議,策劃案計畫書,學習資料等等
打造全網一站式需求
單鏈表操作實驗報告
線性表一 實驗目的 1.了解線性表的邏輯結構特徵,以及這種特性在計算機內的兩種儲存結構。2.掌握線性表的順序儲存結構的定義及其c語言實現。3.掌握線性表的鏈式村粗結構 單鏈表的定義及其c語言實現。4.掌握線性表在順序儲存結構即順序表中的各種基本操作。5.掌握線性表在鏈式儲存結構 單鏈表中的各種基本操...
單鏈表問題
實驗報告名稱 實驗目的 1 掌握單向鍊錶的儲存特點及其實現。2 掌握單向鍊錶的插入 刪除演算法及其應用演算法的程式實現 實驗報告 實驗內容 實驗步驟 實驗執行結果分析 實驗小結 實驗內容 1 鍵盤輸入一組元素,建立乙個帶頭結點的單向鍊錶 無序 2 遍歷單向鍊錶。3 把單向鍊錶中元素逆置 不允許申請新...
實驗報告單
班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 實驗報告單 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 實驗報告單 班級 六年級姓名 班級 六年級姓名 六年級科學下冊實驗題集合 一 觀察加熱白糖的變化 在加熱白糖的過程中,蠟燭也在不斷地燃燒,它也同...