具有連結存儲結構的線性表,它用一組地址任意的存儲單元存放線性表中的數據元素,邏輯上相鄰的元素在物理上不要求也相鄰,不能隨機存取。一般用結點描述:結點(表示數據元素) =數據域(數據元素的映象) + 指針域(指示後繼元素存儲位置)
概念
實現
基本操作為: 使指針p始終指向線性表中第j個數據元素
Status GetElem_L(LinkList L, int i, ElemType &e)// L為帶頭結點的單鍊表的頭指針。當線性表中存在第i個元素時,則將第i個數據元素的值賦給e並返回OK,否則返 回ERROR
e = p->data; // 取第i個元素
return OK;
} // GetElem_L算法的時間複雜度為:O(ListLength(L))
(2) 線性表的操作ListInsert(&L, i, e)在鍊表中的實現:
// 在帶頭結點的單鍊表L中第i個數據元素之前插入數據元素e
p = L; j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 尋找第i-1個結點
if (!p|| j > i-1) return ERROR; // i小於1或者大於表長
s = (LinkList) malloc (sizeof (LNode)); // 生成新結點
s->data = e; s->next = p->next; // 插入L中
p->next = s;
return OK;
} // LinstInsert_L算法的時間複雜度為:O(ListLength(L))
(3) 線性表的操作ListDelete(&L, i, &e)在鍊表中的實現:
if (!(p->next) || j > i-1) return ERROR; // 刪除位置不合理
q = p->next; p->next = q->next; // 刪除並釋放結點
e = q->data; free(q);
return OK;
} // ListDelete_L算法的時間複雜度為:O(ListLength(L))
單鏈線性表
定義一個帶頭結點的線性鍊表類型:
typedef struct LNode // 結點類型
ElemType data;
struct LNode *next;
} *Link,*Position;
typedef struct // 鍊表類型
{ Link head, tail; // 指向頭結點和最後一個結點
int len; // 指示鍊表長度
Link current; // 指向當前訪問的結點的指針,初始位置指向頭結點
}
Status MakeNode( Link &p, ElemType e );
// 分配由p指向的值為e的結點,並返回OK;若分配失敗,則返回ERROR
void FreeNode( Link &p ); // 釋放p所指結點
L->next = NULL; // 先建立一個帶頭結點的單鍊表
for (i = n; i > 0; --i) {
p = (LinkList) malloc (sizeof (LNode)); // 生成新結點
scanf(&p->data); // 輸入元素值
p->next = L->next; L->next = p; // 插入到表頭
}
} // CreateList_L算法的時間複雜度為:O(Listlength(L))