實(shí)現(xiàn):你的多態(tài)你做主
當(dāng)你真正開(kāi)始著手做這個(gè)工作的時(shí)候,你會(huì)發(fā)現(xiàn)把數(shù)據(jù)放入鏈表中的操作和普通的存放 int 類(lèi)型的鏈表的實(shí)現(xiàn)并沒(méi)有什么大的區(qū)別,很方便。但是當(dāng)你要把已經(jīng)存進(jìn)去的數(shù)據(jù)讀取出來(lái)的時(shí)候,就有一點(diǎn)麻煩了。對(duì)于 void * 類(lèi)型的指針,編譯器只知道它里面存儲(chǔ)了一個(gè)地址,但是關(guān)于這個(gè)地址里的數(shù)據(jù)類(lèi)型,編譯器是沒(méi)有任何概念的。畢竟我們不能指望編譯器什么都知道,什么都能替你做好,所以存進(jìn)去的數(shù)據(jù)的類(lèi)型,作為程序員的我們必須清楚的知道,并且在取出這個(gè)數(shù)據(jù)的時(shí)候,用這一類(lèi)型的指針來(lái)對(duì) void * 做強(qiáng)制類(lèi)型轉(zhuǎn)換。
為了方便的做到這一點(diǎn),我采取的方法是在 Node 結(jié)構(gòu)體中增加一個(gè)標(biāo)識(shí)數(shù)據(jù)類(lèi)型的域,并用一個(gè)枚舉類(lèi)型來(lái)存放這些數(shù)據(jù)類(lèi)型。這時(shí)的 linkList.h 如下所示:
#ifndef LINKLIST_H
#define LINKLIST_H
typedef struct Node* linkList;
enum dataType
{
INT,
DOUBLE,
CHAR,
STRING
};
struct Node // 鏈表節(jié)點(diǎn)
{
void *data; // 存儲(chǔ)的數(shù)據(jù)指針
int dataType; // 存儲(chǔ)數(shù)據(jù)類(lèi)型
linkList next; // 指向下一個(gè)鏈表節(jié)點(diǎn)
};
linkList initialLinklist(); // 初始化鏈表
linkList newLinkList (void *data, int dataType); // 建立新節(jié)點(diǎn)
void insertFirst(linkList h, void *data, int dataType); // 在已有鏈表的表頭進(jìn)行插入節(jié)點(diǎn)操作
void linkListOutput(linkList h); // 輸出鏈表中數(shù)據(jù)到控制臺(tái)
#endif
初始化鏈表,代碼如下:
linkList initialLinklist()
{
linkList link = (linkList*)malloc(sizeof(*link));
link->data = NULL;
link->dataType = -1;
link->next = NULL;
return link;
}
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |