讓程式設計改變世界
change the world by program
上節課我們提到了,
頭結點的資料域一般不儲存任何資訊,誰叫它是第乙個呢,有這個特權。
拿個小旗子即可:
頭指標與頭結點的異同
那有童鞋就疑惑了,既然頭結點的資料域不儲存任何資訊,那麼頭指標和頭結點又有何異同呢?
頭指標
頭指標是指鍊錶指向第乙個結點的指標,若煉表有頭結點,則是指向頭結點的指標。頭指標具有標識作用,所以常用頭指標冠以鍊錶的名字(指標變數的名字)。無論鍊錶是否為空,頭指標均不為空。頭指標是鍊錶的必要元素。頭結點
頭結點是為了操作的統一和方便而設立的,放在第乙個元素的結點之前,其資料域一般無意義(但也可以用來存放鍊錶的長度)。有了頭結點,對在第一元素結點前插入結點和刪除第一結點起操作與其它結點的操作就統一了。頭結點不一定是鍊錶的必須要素。no pic you say a j8…
單鏈表圖例:
單鏈表圖例
空鍊錶圖例:
空鍊錶圖例
我們在c語言中可以用結構指標來描述單鏈表:
typedef struct node
node;
typedef struct node* linklist;
我們看到結點由存放資料元素的資料域和存放後繼結點位址的指標域組成。
假設p是指向線性表第i個元素的指標,則該結點ai的資料域我們可以用p->data的值是乙個資料元素。
結點ai的指標域可以用p->next來表示,p->next的值是乙個指標。
那麼p->next指向誰呢?當然指向第i+1個元素!也就是指向ai+1的指標。
問題:如果p->data = ai,那麼p->next->data = ?
答案:p->next->data = ai+1。
但在單鏈表中,由於第i個元素到底在哪?我們壓根兒沒辦法一開始就知道,必須得從第乙個結點開始挨個兒找。
因此,對於單鏈表實現獲取第i個元素的資料的操作getelem,在演算法上相對要麻煩一些,大家不妨先思考一下。
獲得鍊錶第i個資料的演算法思路:
宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始;由於這個演算法的時間複雜度取決於i的位置,當i=1時,則不需要遍歷,而i=n時則遍歷n-1次才可以。因此最壞情況的時間複雜度為o(n)。當j若到鍊錶末尾p為空,則說明第i個元素不存在;
否則查詢成功,返回結點p的資料。
由於單鏈表的結構中沒有定義表長,所以不能實現知道要迴圈多少次,因此也就不方便使用for來控制迴圈。
其核心思想叫做「工作指標後移」,這其實也是很多演算法的常用技術。
資料結構 線性表演算法
1.線性表 線性表是n個具有相同特性的資料元素的有限序列。線性表的主要儲存結構 順序儲存結構 順序表 鏈式儲存結構 鍊錶 2.順序儲存 儲存空間連續,用一組連續的儲存單元依次存放資料元素 即邏輯上相鄰的元素,其物理位置也相鄰。優點 隨機訪問 缺點 插入刪除結點困難 擴充套件不靈活 3.鏈式儲存 儲存...
筆記10 資料結構 線性表
線性表是具有相同特性的資料元素的乙個有限序列,該序列中所含元素的個數叫做線性表的長度,用n表示,n 0。當n 0時,表示線性表是乙個空表,即表中不包括任何元素。第乙個元素叫表頭元素,最後乙個元素叫表尾元素。線性表 零個或多個資料元素的有限序列。線性表 包括順序表和煉表 順序表 其實就是陣列 裡面元素...
資料結構和演算法之線性表
因為要準備筆試,要涉及到一些資料結構和演算法基礎。所以準備重新學習和整理下資料結構演算法的的知識。按照但不全按照下圖的思維導圖展開。定義 元素一條線布局,可以不同,有先後順序。除了第乙個沒有直接前驅,最後乙個沒有直接後繼。其他節點都有直接前驅和後繼。下儲存可分順序儲存和鏈式儲存。定義 元素放在一塊連...