1. 程式人生 > >順序表和連結串列(Sqlist&LNode)

順序表和連結串列(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;
}

建立之後可以通過匯入陣列等格式的資料、讀取檔案或是輸入操作來填充資料。

插入和刪除相較於順序表而言更加簡明,但複雜度並不一定確定:

  如果是給予了地址,則直接把地址位置進行調整,否則則是通過遍歷來找到該位置,再進行操作。故而在單純看“刪除”這個操作下,連結串列要更加便捷,而完整的操作下,由於連結串列查詢的弊端,優勢在鄙人看來不是十分突出。

通過下標查詢數值和查詢表格長度操作,順序表相較於連結串列而言更加便捷。

以上關於線性表提到的操作,由於整體看起來過長,將擷取之前所敲的部分程式碼,通過銜接貼來。