資料結構鍊錶實現

2021-10-01 22:37:04 字數 4262 閱讀 2769

二、實驗基本原理與設計

三、主要儀器裝置及耗材

四、附錄

利用linux gnu make c 專案管理軟體工具實現資料結構鍊錶(linked list)。要求實現以下功能:push, pop, insert, delete, search, visit go through, clear。節點的資料必須具有一般性(使用 void * data),提**用例項,且煉表頭指標必須作為每個函式的形式引數。

要讓程式更加靈活,使用到了,可以根據自己需要輸入值,如不需要輸入0即可退出。

該實驗的各個模組的功能,實現與設計思想可以如下圖所示。

鍊錶的設計:

初始化鍊錶:因為完成的程式,不是一次性的輸入輸出。所以需要設定成指標的指標,到main中可以使用到,在這所初始化的鍊錶。所以需要申請空間,如成功或者失敗返回乙個值給main知道是否可以執行下一步。

push模組:需要從main中獲取到要新新增的數值放到頭位置,先是如果鍊錶s為空,即返回失敗,如果部位空,新建乙個新節點,用來放從main傳來的值,在進行指標操作,把新節點n指向鍊錶s的頭節點,後賦s的next為n。

delete_data模組:刪除想要刪除的資料用data傳到delete的函式中,因為設計的是單鏈表,所以需要有兩個節點才能進行刪除所想要刪除的節點。n是用來判斷節點的值是否等於我們所要刪除值的。因為pre節點是用來跟著n走的,所以需要判斷頭節點是否相等,因為要設定節點pre需要有鍊表裡有兩個值以及以上才可以。

visit_all_data模組:因為s是用來表著鍊錶的開始位置,不可以直接拿過來做while迴圈,並且該鍊錶也為單鏈表,所以建立乙個新的節點go再進行while,如果為空即列印提醒該鍊錶裡面沒有資料。while迴圈當go指向空時即為結束的位置。

pop模組:取出頭元素。如果鍊錶s為空,返回成功。如果頭元素為空,返回失敗,如果存在資料,那可以用來取出鍊錶所指的第乙個元素。先是把頭元素的data取出並賦給e,指標處理和刪除節點一致,最後返回數值。

search_data模組:在main時,需要輸入data的值,然後傳到search_data函式,然後進行查詢,與上同理,需要建立乙個新節點並賦為頭元素,並用while迴圈查詢是否該data在煉表裡存在。

insert_data模組:與push模組同理都是輸入要輸入的值,push是進行放到鍊錶的頭元素,insert_data為放到最後乙個位置。而要放到尾部的位置,需要遍歷到鍊錶的最後乙個元素,但在此之前,需要判斷煉表裡是否有資料了,不然直接節點指標等於頭節點的話,會越界,導致程式出錯,停止執行。所以需要判斷鍊錶是否有資料先。在進行遍歷,最後賦值新的節點,指標操作。

pc、虛擬機器vmware workstation pro、ubuntu

三、實驗小結、建議及體會

在這次實驗中,收穫了使用鍊錶在linux上的操作和在自定義的標頭檔案中宣告,這次寫的比之前寫的更加多的模組功能,所以需要顧到多個函式之前的關係和值的設定。在除錯**現了很多問題,不過在進行乙個比較合理的理清程式間的關係和值之後,問題也就隨之解決了,同時也學到了一些正規表示式的用法,現在掌握的只是正規表示式中的皮毛而已,還需要花更多的時間去學習和掌握對應的知識,在做實驗的過程中,雖然遇到了許多問題,但是我覺得這些問題需要去面對,問題就不再是問題了。讓我體會到了學知識聽起來簡單,但還是需要多多用於實踐,畢竟是軟體,還是需要根據需求多變化的,所以以後會多加把知識用於實踐。

#include

"demo.h"

intmain

(void

)else

printf

("push the data %d finish\n"

, data)

;break

;case2:

ret =

pop(s);if

(failure == ret)

else

if(success == ret)

printf

("pop finish!\n");

else

printf

("pop finish!the data is %d\n"

,ret)

;break

;case3:

printf

("please input want search data!:");

scanf

("%d"

,&data)

; ret =

search_data

(s,data);if

(ret == success)

else

printf

("unfortunately!\n");

break

;case4:

printf

("input you want delete data:");

scanf

("%d"

,&data)

; ret =

delete_data

(s,data);if

(failure == ret)

else

printf

("delete finish!\n");

visit_all_data

(s);

break

;case5:

ret =

visit_all_data

(s);

if(success == ret)

else

printf

("error!!");

break

;case6:

ret =

clearstack

(s);

if(success == ret)

else

printf

("clear error\n");

break

;case7:

printf

("please input data:");

scanf

("%d"

,&data)

; ret=

in_data

(s,data);if

(ret == success)

break;}

printf

("please input num :(if don't go ,input 0):");

scanf

("%d"

,&flag);}

while

(flag !=0)

;}else

return0;

}

#include

"demo.h"

/* * initstack malloc!

*/int

initstack

(stack *

*s)/*

* push data into stack!

*/int

push

(stack *s,

int num)

/* * visit all data

*/int

visit_all_data

(stack *s)

return success;}/*

*search_data

* */

intsearch_data

(stack *s,

int data)

return failure;}/*

* please pop the top data!

* */

intpop

(stack *s)

/* *

* */

intin_data

(stack *s,

int num)

else

while

(go->next)

pre->data = num;

go->next = pre;

s->length++

;return success;

}int

delete_data

(stack *s,

int data)

else

while

(n)else

} s->length--

;return failure;

}int

clearstack

(stack *s)

return success;

}

以上便是實驗的學習的總結, 其中截圖比較多,過幾天考試完會上傳的,出錯的地方, 望指正, 感謝!

資料結構 棧 鍊錶實現

鍊錶實現的棧可以克服在程式執行時也無法估計棧容量大小的情況 棧中的元素是儲存在稱為節點的類中,每個節點都包含乙個資料域和乙個指標域 資料域儲存棧的值,指標域指示棧中下乙個值得位置 而棧類的資料成員是需要乙個指向棧頂的指標即可 類宣告如下 typedef int stackelement class ...

資料結構 鍊錶(java實現)

鍊錶節點定義 private class node public void setnext node next public node object data private node head private int size public linkedlistonepoint public bo...

資料結構 鍊錶介面實現

鍊錶是一種物理儲存結構上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的 鍊錶與陣列 本篇部落格講解的是單向 非迴圈鍊錶的介面實現 pragma once 預處理指令 只編譯一次 定義鍊錶中每乙個 結點 的結構體 typedef struct slistnode slis...