最近学习数据结构与算法方面的知识,使用的是C语言,发现一个非常麻烦的问题,如果同一类型的线性表要同时处理多种类型,如int型、char型、double型等等,该如何进行设置,总不能每种类型复制一遍代码然后改个名吧。
你可以将node定义的复杂一点,包括一个变量表示数据类型,然后几种不同类型的数据变量,用的时候先判断类型,再决定往哪个变量赋值或者用哪个变量的值
严蔚敏的书上用的是ElemType,但ElemType一次只能对应一种类型啊,假如我一个线性表需要ElemType为int,另一个线性表需要ElemType为char,该如何进行处理?因为C语言没有模板功能,是不是只能拷贝代码改名字了?要这样处理,就太不优雅了。
你会C++的会话就用template模板,C的话将就吧,只会更复杂。
http://www.cnblogs.com/niniwzw/archive/2009/11/13/1602664.html
不能
strut Elemtype{
int i;char j;double k;
}
吗?
用指针,void * value
可以使用泛型函数指针回调,
union ComplexType
{
char cValue;
int nValue;
float fValue;
double dValue;
};
struct Node
{
ComplexType Value;
int nType;
Node* pNext;
};
节点定义成联合体,再定义枚举类型的变量,
#include
#include
//定义枚举类型
typedef enum Type
{
INT,
CHAR,
DOUBLE,
}Type;
//定义节点的结构体,节点中包含一个共用体,和枚举类型Type,用于判断类型
typedef struct Node
{
union//定义共用体变量
{
char cVaule;
int iValue;
double dValue;
};
Type t;//定义类型变量,根据传入的类型使用共用体内部的变量
struct Node* next;//指向下一个节点的指针
}Node;
//定义链表的结构体
typedef struct LinkList
{
Node* _phead;
}LinkList,*pLinkList;
//举个栗子,只写了生成新节点的函数
Node* BuyNewNode(Type t,char x) //创建一个新结点并返回
{
Node* NewNode = NULL;
NewNode = (Node*)malloc(sizeof(Node));
if (NewNode == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
if (t == INT)//判断类型,然后根据类型选择采用共用体的哪一种元素
{
NewNode->iValue = x;//整型,调用iValue
}
else if (t == CHAR)
{
NewNode->cVaule = x;//char,调用cValue
}
else if (t == DOUBLE)
{
NewNode->dValue = x;//双精度,调用dValue
}
NewNode->next = NULL;
return NewNode;
}