昨日**了一篇如何構建c++通用鍊錶的文章,自己對c++不熟悉,看了許久沒有看明白這到底是如何實現的。於是打算不管三七二十一了,直接硬搬硬套。不過後來有個比較懂c++的同學幫我看了程式給我講解了那個程式是如何實現的通用鍊錶。
(注:只看來 c++類實現的方法)
該方法採用了c++硬編碼的方式實現通用鍊錶。我們常用的鍊錶,每乙個節點都是包含資料區及指標區。但是為了通用,也就是資料區並不確定,因此,程式在寫鍊錶節點的struct時只分配了指標區,但是,這樣乙個鍊錶就相當與一條指標指向一條指標,完全沒有資料是沒有意義的。那麼,它是如何實現通用鍊錶的呢?首先來講解它的增加節點。在增加節點函式中,傳入引數資料的指標及資料的長度。分配乙個新的節點newlist。通過語句
newlist = (pnd_list)malloc(datasize+sizeof(nd_list));來強行擴大節點newlist所佔的記憶體大小,擴大的大小即為傳入的資料的大小,然後將資料賦值到此擴大的區域。在進行刪除的時候,應分別將該節點刪除,同時,將擴大的記憶體區域清空。
雖然這樣的方法能夠實現想要的目標,但是,總覺得比較蠻橫。
於是自己想到了乙個類繼承的方法實現。
就是鍊錶的節點類中的資料區域存放的不是簡單的資料,而是指向class nodedate的指標。用自己想要的資料繼承這個你哦的date,就可以實現想要的通用鍊錶了。
參看://節點包含資料類的基類
class nodedate ;
//點的節點類
class nodevertex :public nodedate
; //邊的節點類
class nodesegment :public nodedate
; //三角形的節點類
class node******** : public nodedate
; //節點類,注此節點是指標節點,指向nodedate
class node
;//鍊錶類
class list
{ public:
//建構函式;
list();
//析構函式
~list();
//清空整個鍊錶
void deleteall();
//鍊錶復位,使第乙個節點成為當前節點
void reset();
//判斷鍊錶是否為空
bool isempty();
//判斷當前節點是否為最後乙個節點
bool isend();
//返回當前節點的下乙個節點,並使其成為當前節點
node nextnode(); /
/返回當前節點中指標pnd所指向的nodedate
nodedate currentnode();
//向鍊錶中插入乙個節點,使其稱為當前節點
bool insert(nodedate nd);
//返回鍊錶的大小 int size();
nodedate remove();
//返回當前節點的指標
node cursor();
protected:
private:
node *head;
node *tail;
node *pointer;
int length;
通用鍊錶 通用鍊錶的基本使用
1.1雙向鍊錶指標域 從圖中可以看出雙向鍊錶的前向指標指向前乙個結點的首位址,後向指標指向下乙個節點的首位址,並且指標型別相同,且只能指向與自己型別相同的結構體。1.2通用鍊錶指標域 從圖中可以看出通用鍊錶的前向指標指向前乙個結點的指標域的首位址,後向指標指向下乙個節點的指標域的首位址,所以在不同的...
通用C 鍊錶(linux思想)
通用 c鍊錶,適合任意型別 標頭檔案定義mylist.h define poison pointer delta 0 define list poison1 void 0x00100100 poison pointer delta define list poison2 void 0x0020020...
(鍊錶構建)鍊錶逆序
一直煉表頭結點指標head,將鍊錶逆序。不可申請額外空間 include using namespace std struct listnode int main 實際最終執行的 include using namespace std struct listnode 這個建構函式有點沒看懂,是一種什...