線性表的順序儲存結構最大的缺點是插入和刪除時需要移動大量資料,這顯然就需要消耗時間。本節討論的鏈式儲存結構可以很好滴解決這個問題。
線性表的鏈式儲存結構的特點是用一組任意的儲存單元儲存線性表的資料元素,這些儲存單元可以使連續的,也可以是不連續的。這就意味著,這些資料元素可以存在記憶體未被占用的任意位置。
以前的順序結構中,每個資料元素只需要存資料元素的資訊就可以了。現在鏈式結構中,除了要存資料元素資訊外,還要儲存它的後繼元素的儲存位址。
因此,為了表示每乙個資料元素a(i)與其直接後繼資料元素a(i+1)之間的邏輯關係。對資料a(1)來說,除了儲存其本身的資訊之外,還需儲存乙個指示其直接後繼的資訊(即直接後繼的儲存位置)。我們把儲存資料元素資訊的域稱為資料域;把儲存直接後繼位置的域稱為指標域。指標域中儲存的資訊稱為指標或鏈。這兩部分資訊組成元素a(i)的儲存映像,稱為結點。如果每個結點只包含乙個指標域,叫做單鏈表。單鏈表正是通過每個節點的指標域將線性表的資料元素按其邏輯次序連線在一起,如圖所示:
對於線性表來說,總要有頭有尾,鍊錶也不例外。我們把鍊錶中第乙個結點的儲存位置叫做頭指標,那麼整個鍊錶的訪問就必須是從頭指標開始進行了。之後的每乙個結點,其實就是上乙個的後繼指標指向的位置。最後有意義的是討論最後乙個結點的指標指向問題,暫時規定,線性鍊錶的最後乙個結點指標為「空」(null)
有時,我們為了更加方便地對鍊錶進行操作,會在單鏈表的第乙個結點前附設乙個結點,稱為頭結點。頭結點的資料域可以不儲存任何資訊,頭結點的指標域儲存指向第乙個結點的指標,如圖所示:
獲得鍊錶第i個資料的演算法思路:
(1)宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始;
(2)當j
(3)若到鍊錶末尾p為空,則說明第i個元素不存在;
(4)否則查詢成功,返回結點p的資料。
**實現如下:
status getelem( linklist* l, int i, elemtype* e)
if (!p || j>1i)
return error;
*e = p->data;
return ok;
}
說白了,就是從頭開始找,知道第i個元素為止。由於這個演算法的時間複雜度取決於i的位置,當i=1時,則不需要遍歷,第乙個就取出資料了,而當i = n時,則遍歷n-1次就可以了,因此最壞情況的時間複雜度是o(n)。
由於單鏈表的結構中沒有定義表長,所以不能事先知道要迴圈多少次,因此也就不方便使用for來控制迴圈。其主要核心思想就是「工作指標後移」。
單鏈表的元素插入用不著驚到其他結點,只需要讓s->next和p->next的指標做一點改變即可。
單鏈表第i個資料插入節點的演算法思路:
(1)宣告一結點p指向鍊錶第乙個結點,初始化j從1開始;
(2)當j
(3)若到鍊錶末尾p為空,則說明第i個元素不存在;
(4)否則查詢成功,在系統中生成乙個空節點s;
(5)將資料元素e賦值給s->data;
(6)單鏈表的插入標準語句s->next=p->next;p->next = s;
(7)返回成功。
實現**演算法如下:
status listinsert ( linklist *l, int i, elemtype e)
if ( !p || j>1)
return error;
s = (linklist)malloc(sizeof(node));
s->data = e;
s->next = p->next;
p->next = s;
return ok;
}
2.3 單鏈表的元素刪除
設儲存元素a(i)的結點為q,要實現將節點q刪除單鏈表操作,其實就是將他的前幾結點的指標繞過,指向它的後繼結點即可,如圖所示:
這裡需要做的只有一步,p->next = p->next->next,用q來取代p->next,刪除語句可以寫成:
q=p->next;
p->next = q->next;
單鏈表第i個資料刪除節點的演算法思路:
(1)宣告乙個結點p指向鍊錶第乙個結點,初始化j從1開始;
(2)當j小於i時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下乙個結點,j累加1;
(3)若到鍊錶末尾p為空,則說明第i個元素不存在;
(4)否則查詢成功,將預刪除的結點p->next賦值給q;
(5)單鏈表的刪除標準語句p->next=q->next;
(6)將q結點中的資料賦值給e,作為返回;
(7)釋放q結點;
(8)返回成功。
實現**演算法如下:
status listdelete( linklist* l, int i, elemtype* e)
if ( !(p->next) || j>i)
return error;
q=p->next;
p->next=q->next;
*e = q->data;
free(q);
return ok;
}
大話資料結構(2)線性表
線性表 零個或多個資料元素的有限序列 tips 1.有序性 2.有限性 在較複雜的線性表中,乙個資料元素可以由若干個資料項組成。definition 用一段位址連續的儲存單元依次儲存線性表的資料元素 線性表中第i 1個元素的儲存位置和第i個元素的位置關係式 假設每個資料佔據c個儲存單元 loc ai...
《大話資料結構》 線性表
created by pengxiangzhou on 2021 1 24.include ifndef c ds linear list h define c ds linear list h endif c ds linear list h 線性表 順序儲存結構 順序儲存結構的三個屬性 陣列da...
大話資料結構 線性表
線性表是零個或多個資料元素的有限序列。線性表的抽象資料型別定義如下 adt 線性表 list data 線性表的資料物件集合為,每個元素的型別均為datatype。其中,除第乙個元素a1外,每乙個元素有且只有乙個直接前驅元素,除了最後乙個元素an外,每乙個元素有且只有乙個直接後繼元素。資料元素之間的...