1. 程式人生 > >用陣列實現連結串列的好處

用陣列實現連結串列的好處

一般傳統連結串列的物理結構,是由指標把一個一個的節點相互連線而成:

1 2 3 4 5 6 struct node { DataType data; node* previous; node* next; }

其特點是按需分配節點,靈活動態增長。

但是此外,還有另外一種方式是使用陣列實現連結串列,這裡所有的node都在預先分配好的陣列中,不使用指標,而是用陣列下標來指向前一個、下一個元素:

1 2 3 4 5 6 struct node { DataType data; int previous; int next; }

其特點是預先分配節點,並且如果需要連結串列長度隨需增加,需要reallocation ,和vector類似。

下面就我自己的一些瞭解,談一下其優缺點與應用。

陣列作連結串列有哪些優點

能要省些記憶體嗎?不見得;速度要快嗎?沒看出來,那麼為什麼要使用這種不那麼直觀的方式來實現連結串列呢?

  • 陣列的記憶體佈局比較緊湊,能佔些區域性性原理的光
  • 在不提供指標的語言中實現連結串列結構,如vb等
  • 程序間通訊,使用index比使用指標是要靠譜 - 一個程序中的指標地址在另外一個程序中是沒有意義的
  • 對一些記憶體奇缺應用,當其值型別為整型,且值域與陣列index相符時,可以將next指標與data複用,從而節省一些記憶體
  • 整存零取,防止記憶體碎片的產生(多謝Emacs補充)

實現與應用

Id allocator

這裡第一個例子針對上面第四點展開,其主要的應用在於ID的分配與回收,比如資料庫表中的每條記錄都需要一個unique id,當你增增減減若干次之後,然後新建一個表項,你該分配給它哪個id呢?

  • 維持一個id,每增加一行就加1,刪行不回收id --- 這樣id會無限增加,太浪費了
  • 每次分配都遍歷一遍,找到最小的那個還沒被用過的id --- 這樣太浪費時間了
一個比較合理的做法是維護一個“可用ID”的連結串列,每次增加就從連結串列中拿一個,每次刪除就把被刪的ID連結到連結串列中,但是,對於傳統連結串列結構而言,其節點的定義類似於: 
1 2 3 4 5 struct idnode { int availableID; idnode* next; };
這裡,因為連結串列的值的型別與值域都與陣列的index相符,我們可以複用其值和next,從而只需一個int陣列,而不是一個idnode陣列,陣列中某個元素的值代表的即是連結串列節點的值,也是連結串列的下一個節點下標。下面是一個idallocator的實現,主要提供allocate和free兩個函式用來滿足上述要求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

相關推薦

陣列實現連結串列的好處

一般傳統連結串列的物理結構,是由指標把一個一個的節點相互連線而成: 1 2 3 4 5 6 struct node { DataType data; node* previous; node*

陣列連結串列實現

完成一個棧總共需要完成以下操作:初始化入棧出棧檢視棧頂元素檢視棧的容量清空棧。首先是簡單的,用陣列做的,會有越界的可能。#include <stdio.h> #include <stdlib.h> typedef struct Stack {

陣列連結串列兩種方式實現佇列

手寫陣列實現佇列 1 int queue[20]; 2 int front,rear; 3 4 void clear() 5 { 6 front = rear = -1; 7 } 8 9 int size() 10 { 11 return (rear-front)

陣列連結串列分別實現棧類stack,隊queue

棧(stack)是一種常見資料結構,以後進先出(LIFO)著稱。比如編譯器用棧處理函式呼叫,儲存被呼叫函式的引數和區域性變數。當一個函式呼叫另一個函式時候,新的函式引數和區域性變數被入棧。呼叫結束,佔用的資源從棧釋放。 用陣列實現: class vector{ priva

c++分別陣列連結串列實現棧的操作

棧在實際程式設計中經常會用到,本文利用陣列和連結串列分別實現了棧的操作。 1.陣列方式實現如下: #include<iostream> using namespace std; template <class T> class arraysta

分別陣列連結串列實現

    為了更好的理解棧的原理,本文分別用陣列和連結串列實現了棧,     1 陣列實現棧: /* @ brife:陣列實現棧類 */ #include <Windows.h> #ifndef ARRAYSTACK_H #define ARRAYST

Javascript實現連結串列

github主頁:https://github.com/A15162252289 什麼是連結串列 連結串列儲存有序的元素集合,但不同於陣列,連結串列中的元素在記憶體中不是連續放置的。每個元素由一個儲存元素本身的節點和指向下一個元素的引用組成。 下圖為單向連結串列的示意圖 相對於傳統

陣列模擬連結串列

1.什麼是陣列模擬連結串列:         陣列模擬連結串列是一個什麼呢?就是在某索引處儲存下一個索引。下面舉例說明:                 不知道大家明白了沒有。如果我上面的陣列定義為a[4],那麼我訪問a[0]時,所獲取的就是下一個位置所對應的索引

陣列實現連結串列

#include <iostream> #include <string> using namespace std; class MyListException { public: MyListException(std::string _msg) :msg(_msg) {

陣列實現連結串列的插入查詢刪除功能

假設有100名員工,他們分別在10家公司中,現在要模擬他們的入職(插入)、資訊查詢(查詢)、離職(刪除)等管理操作行為,用陣列來代替連結串列實現,具體程式碼如下:#include "stdafx.h" #include <stdlib.h> #define EM

一元多項式求和的兩種實現陣列連結串列

一元多項式求和一般都是有兩種實現方式,小編下面就附上我對這兩種方式的理解和實現程式碼。 1.陣列實現。這種方式實現一元多項式加法,是把陣列下標當做一元多項式的指數,在陣列中存放係數。這種方式在實現一元多項是加法是通過遍歷陣列下標來獲取指數資訊,通過指數資訊將係數進行相加。利用陣列在實現一元多項式

Python遞迴實現連結串列

題目要求: You must complete and implement the following functions in Recursion.py. Take note of the specified return values and input p

C++實現陣列連結串列的排序演算法

OK,我們經常會用到排序演算法。那麼,常用的排序演算法,除了使用陣列之外,用連結串列又該如何處理呢?下面我們來做個對比: //使用插入排序對陣列進行排序 int *get_order(int *num, int length) { for(int eiter = 1; eiter <

【資料結構與演算法】之棧的基本介紹及其陣列連結串列實現---第四篇

一、棧的基本介紹 1、棧的基本概念 棧是一種限制在一端進行插入和刪除操作的線性表資料結構。棧中有兩個比較重要的操作:push(壓棧:將元素壓入棧頂)和pop(彈棧:從棧頂彈出一個元素)。都滿足先進後出、後進先出的特點! 從圖中可以看出,我們常把棧的上面稱為棧

【資料結構與演算法】之佇列的基本介紹及其陣列連結串列實現---第五篇

一、佇列的基本概念 1、定義 佇列是一種先進先出的線性表。它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,具有先進先出、後進後出的特點。進行插入操作的一端成為隊尾(tail),進行刪除操作的一端稱為隊頭(head)。當佇列中沒有元素時,則稱之為空佇列。 在

佇列類(分別列表和連結串列實現

#!/usr/bin/python3 class QueueUnderflow(ValueError):     pass class ListQueue():  #列表實現迴圈佇列類     def __init__(self, len_

棧類(分別列表和連結串列實現

#!/usr/bin/python3 class StackUnderflow(ValueError):     pass class ListStack():     def __init__(self):      

陣列連結串列實現hashMap程式碼

package hashMap; import com.sun.jdi.Value; /**  * 基於陣列+連結串列的方式去實現HashMap  * @author 蔣子文  *  */ public class ArrayLinkHashMap&l

queue (C++中STL庫常用queue基本用法的實現) ([連結串列],[陣列]的實現)

Queue: 依循先進先出的規則的單調佇列. 下面是用連結串列實現的queue的幾個基本用法和一個clear()的補充用法: #include<stdio.h> /* *Date:2018/10/22 *Author:Fushicho *Name:queue連

棧的實現——連結串列陣列

C語言(列印函式採用的c++): 棧的連結串列實現—— 棧的初始化(建立||清空)、入棧、出棧(獲取棧頂元素) 棧的陣列實現——初始化、入棧、出棧、清空棧 參考資料:《資料結構與演算法分析——C語言描述》 P46 一. 棧的連結串列實現 StackLinkList.