鍊錶中鏈入物件

2021-04-16 23:06:42 字數 2712 閱讀 7023

似乎你也注重到了,不管怎麼定義,似乎乙個鍊錶中的物件都是同一型別的。而實際上,這也是必須的,否則,返回節點中的資料這樣的函式的返回值的型別是什麼呢?但是,人的要求是無止境的……(省略本人感慨若干百字)。

達到這個目標的原理其實很簡單,只要把不同型別的物件變成同樣的型別就可以了。看下面的結構定義:

struct mobject

;將乙個物件鏈入鍊錶時,將指向這個物件的指標賦給p,同時記錄物件型別。當取得這個節點的時候,根據objecttype的值來確定p指的物件型別,從而還原指標型別,也就得到了原來的物件。

後面講到的廣義表實際上採用的就是這種方法。顯而易見的,這樣的mobject支援的物件是預先確定的,你將自己維護objecttype列表,每新增一種型別的支援,你需要在objecttype列表中給出它的替代值,然後在相應的switch(objecttype)給出這種型別的case語句。很煩人是吧,下面給出另一種方法,其實還是這個原理,不同的是,把這個煩人的工作交給編譯器了。

還記得前邊強調的原則嗎,為什麼我們將不同型別的物件放在乙個鍊錶中呢?很顯然,我們想達到這樣的乙個效果:比如說,我們在乙個鍊錶中儲存了三角形,直線,圓等圖形的引數,我們希望對某個節點使用draw()方法,就重繪這個圖形;使用get()則得到這個圖形的各個引數;使用put()則修改圖形的引數。可以看出,這些不同的物件實際上有同樣的行為,只是實現的方法不同。

#ifndef shape_h

#define shape_h

class shape

;virtual ~shape(){};

};#endif

【說明】定義乙個抽象基類,有兩個行為,input()為輸入圖形引數,print()為列印圖形引數。圖省事,只是簡單的說明問題而已。

#ifndef point_h

#define point_h

class point

void get()

virtual ~point(){};

private:

int x;

int y;

};#endif

【說明】點的類定義與實現。

#ifndef circle_h

#define circle_h

#include "shape.h"

#include "point.h"

void print()

virtual ~circle(){};

private:

int radius;

point center;

};#endif

【說明】圓的類定義與實現。繼續shape類的行為。

#ifndef line_h

#define line_h

#include "shape.h"

#include "point.h"

class line : public shape

void print()

virtual ~line(){};

private:

point point1;

point point2;

};#endif

【說明】直線類的定義與實現。繼續shape的行為。

#ifndef listtest_h

#define listtest_h

#include

#include "list.h"

#include "circle.h"

#include "line.h"

void listtest_mobject()

#endif

class shapelist : public list

};【閒話】不知你是不是對這樣的語句shape *p = *a.next();p->print();不甚理解,還覺得有點羅嗦。那你試試這樣的語句*a.next()->print();能不能編譯通過

鍊錶的入環結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。以下為分析過程為 左程雲 程式設計師 面試指南 it名企演算法與資料結構題目最優解 中的解析 如果乙個鍊錶沒有環,那麼遍歷鍊錶一定可以遇到鍊錶的終點 如果鍊錶中有環,那麼遍歷鍊錶就永遠在環裡轉下去了。如何找到第乙個入環結點,具...

鍊錶,迴圈鍊錶,雙向鍊錶,判環和入環點

總結鍊錶相關練習題 鍊錶在計算機中記憶體的分配是不連續的,但是每個節點都有乙個指向下乙個節點的next引用,雙向鍊錶還有乙個指向前乙個節點的prev引用 只要獲得鍊錶的頭,那麼剩下的元素都很容易獲取了。所以鍊錶的每個節點有2個組成部分,乙個是存放資料的資料域,乙個是指向前驅或後繼的引用。public...

牛客網刷題之鍊錶入環點 刪除鍊錶中重複節點

題目一描述 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。題目分析 鍊錶是否有環使用兩種方式進行判斷 參考牛客網左神演算法課 1.將鍊錶使用hash進行儲存,如果兩個節點有相同的hash值則表明鍊錶有環 2.使用雙指標,定義乙個快指標和乙個慢指標,快指標每次走兩步,慢指標...