單鏈表實驗報告

2022-12-03 04:39:04 字數 3968 閱讀 2087

計算機與資訊科技學院綜合性、設計性實驗報告

專業:網路工程年級/班級:大二 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 把單向鍊錶中元素逆置 不允許申請新...

實驗報告單

班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 實驗報告單 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 班級 六年級姓名 實驗報告單 班級 六年級姓名 班級 六年級姓名 六年級科學下冊實驗題集合 一 觀察加熱白糖的變化 在加熱白糖的過程中,蠟燭也在不斷地燃燒,它也同...