实现:你的多态你做主
当你真正开始着手做这个工作的时候,你会发现把数据放入链表中的操作和普通的存放 int 类型的链表的实现并没有什么大的区别,很方便。但是当你要把已经存进去的数据读取出来的时候,就有一点麻烦了。对于 void * 类型的指针,编译器只知道它里面存储了一个地址,但是关于这个地址里的数据类型,编译器是没有任何概念的。毕竟我们不能指望编译器什么都知道,什么都能替你做好,所以存进去的数据的类型,作为程序员的我们必须清楚的知道,并且在取出这个数据的时候,用这一类型的指针来对 void * 做强制类型转换。
为了方便的做到这一点,我采取的方法是在 Node 结构体中增加一个标识数据类型的域,并用一个枚举类型来存放这些数据类型。这时的 linkList.h 如下所示:
#ifndef LINKLIST_H
#define LINKLIST_H
typedef struct Node* linkList;
enum dataType
{
INT,
DOUBLE,
CHAR,
STRING
};
struct Node // 链表节点
{
void *data; // 存储的数据指针
int dataType; // 存储数据类型
linkList next; // 指向下一个链表节点
};
linkList initialLinklist(); // 初始化链表
linkList newLinkList (void *data, int dataType); // 建立新节点
void insertFirst(linkList h, void *data, int dataType); // 在已有链表的表头进行插入节点操作
void linkListOutput(linkList h); // 输出链表中数据到控制台
#endif
初始化链表,代码如下:
linkList initialLinklist()
{
linkList link = (linkList*)malloc(sizeof(*link));
link->data = NULL;
link->dataType = -1;
link->next = NULL;
return link;
}