13 靜態單鏈表的實現

2021-10-22 15:22:34 字數 1959 閱讀 8051

觸發條件:長時間使用單鏈表物件頻繁增加和刪除資料元素

可能的結果:堆空間產生大量的記憶體碎片,導致系統執行緩慢

在「單鏈表」的內部增加一片預留的空間,所有的node物件都在這篇空間中動態建立和動態銷毀。

通過模板定義靜態單鏈錶類(staticlinklist)

在類中定義固定大小的空間(unsigned char [ ])

重寫create 和 destroy函式,改變記憶體的分配和歸還方式

在node類中過載operator new ,用於在指定記憶體上建立物件

#ifndef staticlinklist_h

#define staticlinklist_h

#include

"linklist.h"

namespace dragonlib};

unsigned

char m_space[

sizeof

(snode)

* n]

;int m_used[n]

; node*

create()

}return ret;

}void

destroy

(node* pn)}}

public

:staticlinklist()

}int

capacity()

};}#endif

// staticlinklist_h

#include

#include

"staticlinklist.h"

using

namespace std;

using

namespace dragonlib;

intmain()

trycatch

(const exception& e)

for(list.

move(0

);!list.

end(

);list.

next()

)return0;

}

插入五個資料元素之後,再次插入會拋異常:

我們來看看insert()函式:

bool

insert

(int i,

const t& e)

else

}return ret;

}

我們可以發現裡面有個create()函式,我們再來深入看看:

virtual node*

create()

我們發現它是乙個虛函式,我們在linklist的子類中對他進行實現,這是物件導向裡多型的典型應用!

node*

create()

}return ret;

}

此時n是5,我們要在第六個位置插資料,當然不行!所以拋異常

linklist中封裝create和destroy函式的意義?

為靜態鍊錶staticlinklist的實現做準備。staticlinklist與linklist的不同僅在於鍊錶結點記憶體分配上的不同;因此,將僅有的不同封裝於父類和子類的虛函式中。

順序表與單鏈表相結合後衍生出靜態單鏈表

靜態單鏈表是linklist的子類,擁有單鏈表的所有操作

靜態單鏈表在預留的空間中建立結點物件

靜態單鏈表適合於頻繁增刪資料元素的場合(最大元素個數固定)

靜態單鏈表

之前我們說過如果頻繁增刪資料元素,我們應該選擇單鏈表就可以,但是如果資料元素的最大個數固定,那麼就需要靜態單鏈表,而且動態單鏈表如果長時間使用單鏈表物件頻繁增加和刪除資料元素,堆空間產生大量的記憶體碎片,導致系統執行緩慢,所謂單鏈表就是 順序表 單鏈表 靜態單鏈表 設計思路 在 單鏈表 的內部增加一...

C 實現靜態單鏈表的例項

c 實現靜態單鏈表的例項 利用陣列實現的靜態單鏈表,與嚴蔚敏書實現略有不同,不另設 空間。有任何bug或錯誤,希望各位朋友多多反饋 感激不盡 author moyiii mail lc09 vip.qq.com 靜態鍊錶實現,僅作學習之用,當然如果 你想拿去用,隨你好啦。include using ...

單鏈表的實現

include includetypedef struct node 定義鍊錶 snode snode creat 建立鍊錶的函式 q next null return head int length snode head 測鍊錶的結點數 return i void display snode he...