順序表和連結串列(Sqlist&LNode)
寫在前面的廢話:這是應某人(不點名)的煽風點火整理來的一篇關於線性表中順序表和連結串列的區別
———————————————————————————————————————————
眾所周知,線性表是一個比較靈活的儲存空間,其中有兩種儲存格式:線性表和連結串列,下文儘量詳細地進行整理二者的特點和區別。
順序表(Sqlist):
順序表,顧名思義,就是用連續的空間儲存當下得到的資料。
順序鏈性表用Sqlist稱呼,提到Sqlist就指的是順序鏈性表
其特點在於:
1.儲存空間是連續的,可以通過下標找到前後成員的值
2.同時,因為空間的特殊性,可以通過下標來進行跳躍性查詢
順序表的實現:
以下是之前敲的一個大程式的關於順序表建立的小部分
在程式中我們是將線性表的每一塊儲存多種資訊(號碼,名稱,價格),概括起來就是將擁有多個資訊的結構體物件聯絡起來,存到一個表中。如果我們想線上性表中儲存陣列,而不是結構體,可以將裡面的那句話進行修改:
typedef book ElemType;
//更改為:
typedef int ElemType;
這樣就是將原本為結構體格式的表格改變為只可以儲存整型。
完整的建立順序表的程式碼:
typedef int Status; typedef struct { string no; string name; double price; }book; typedef struct { book *elem; int length; }SqList; typedef book ElemType;//上文提到的地方 Status initlist(SqList &l) { l.elem=new ElemType[MAXSIZE]; if(!l.elem) exit(error); l.length=0; return OK; }
順序表的優點在於:
1.可以迅速的調取某一個位置的數值或某一個數值所在的位置(兩個的複雜度均為O(n))
2.所儲存的資料均為連續的,查詢表長可以直接用l.length得到(複雜度為O(1))
而缺點在於:
1.新增與刪除時需要整體將後方數值進行移動(當然新增或刪除最後一位上的數值例外)
甚至如果要求為:“將某一位上的數值刪除的話”,有可能呼叫兩次遍歷。
連結串列(LNode)
連結串列?個人認為連結串列與線性表的優缺點正好相反。
先敲定義:
用度孃的話來說:“連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存
我認為已經寫得挺細了(沉思),簡單來說,連結串列因為儲存空間不是完全連續的,故而是由每一個結點中的指標域來連線前後的資料,最基本的連結串列只有下個數據的指標,故而只能從前往後查詢,從前往後遍歷。這樣的一個弊端引出了另一種結點中含有上下地址的連結串列(),解決了這個問題。
由此可以看出空間和時間的損耗是成反比?節約時間的狀態下會適當犧牲空間。
連結串列呼叫是用指標操作,建立時會將頭結點進行指空操作(設為空指標)
【詳細操作可以參考鄙人另一篇關於(LRU)的部落格,有完整的建立連結串列的程式碼】
#include<iostream>
#define ok 1;
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType date;
LNode *next;
}LNode,*LinkList;
Status IntList(LinkList &L)//初始化
{
L=new LNode;
L->next=NULL;
return ok;
}
建立之後可以通過匯入陣列等格式的資料、讀取檔案或是輸入操作來填充資料。
插入和刪除相較於順序表而言更加簡明,但複雜度並不一定確定:
如果是給予了地址,則直接把地址位置進行調整,否則則是通過遍歷來找到該位置,再進行操作。故而在單純看“刪除”這個操作下,連結串列要更加便捷,而完整的操作下,由於連結串列查詢的弊端,優勢在鄙人看來不是十分突出。
通過下標查詢數值和查詢表格長度操作,順序表相較於連結串列而言更加便捷。
以上關於線性表提到的操作,由於整體看起來過長,將擷取之前所敲的部分程式碼,通過銜接貼來。