鏈式存儲 :用一組任意的存儲單元存儲線性表中的數據元素。用這種方法存儲的線性表簡稱線性鏈表。存儲鏈表中結點的一組任意的存儲單元能夠是連續的,也能夠是不連續的,甚至是零散分佈在內存中的任意位置上的。spa
爲了正確表示結點間的邏輯關係,在存儲每一個結點值的同時,還必須存儲指示其直接後繼結點的地址(或位置),稱爲指針(pointer)或鏈(link),這兩部分指針
組成了鏈表中的結點結構,以下圖所示。code
data :數據域,存放結點的值。next :指針域,存放結點的直接後繼的地址。 blog
指針域和數據域組成數據元素稱爲存儲映象,稱爲結點(NODE).內存
把鏈表中的第一個結點的存儲位置叫作頭指針,最後一個結點指針爲空(NULL)class
頭指針和頭結點的區別:
頭指針:
--頭指針是指鏈表指向第一個結點的指針,若鏈表有頭結點,則是指向頭結點的指針
--頭指針具備標識做用,因此頭指針冠以鏈表的名字(指針變量的名字)
--不管鏈表是否爲空,頭指針均不爲空
--頭指針是鏈表的必要元素
頭結點:
--頭結點是爲了操做的統一和方便而設立的,放在第一個元素的結點以前,其數據域通常無心義(但也能夠用來存放鏈表的長度)
--有了頭結點,對在第一元素結點前插入結點和刪除第一結點起操做與其它結點的操做就統一了
--頭結點不必定是鏈表的必要元素變量
單鏈表存儲結構List
typedef struct Node { ElemType data; //數據域 struct Node* Next;//指針域 }Node; typedef struct Node* LinkList;
若是p->data = ai , 那麼p->next->data=ai+1方法
Status GetElem( LinkList L, int i =, ElemType *e) { int j; LinkList p; p= L->next; j=1; while(p && j<i) { p= p->next; ++j; } if( !p || j>i) { return ERROR; } *e = p->data; return OK; }
單鏈表,插入時間複雜度O(1) 。im