似乎你也注重到了,不管怎麼定義,似乎乙個鍊錶中的物件都是同一型別的。而實際上,這也是必須的,否則,返回節點中的資料這樣的函式的返回值的型別是什麼呢?但是,人的要求是無止境的……(省略本人感慨若干百字)。
達到這個目標的原理其實很簡單,只要把不同型別的物件變成同樣的型別就可以了。看下面的結構定義:
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.使用雙指標,定義乙個快指標和乙個慢指標,快指標每次走兩步,慢指標...