C语言中的线性表如果既要处理int型,又要处理char型,该如何进行设置

最近学习数据结构与算法方面的知识,使用的是C语言,发现一个非常麻烦的问题,如果同一类型的线性表要同时处理多种类型,如int型、char型、double型等等,该如何进行设置,总不能每种类型复制一遍代码然后改个名吧。

8个回答

你可以将node定义的复杂一点,包括一个变量表示数据类型,然后几种不同类型的数据变量,用的时候先判断类型,再决定往哪个变量赋值或者用哪个变量的值

St_One_Lip
Code of King 回复ShamsangPo: 的确如此,这样是会浪费一定的空间,但是一个表里面可能有多种类型,我觉得类型是一定要被标记的
接近 3 年之前 回复
ShamsangPo
ShamsangPo 你这样处理的话,节点会非常臃肿,空间利用率很低,而且增加了判断逻辑,对执行效率也有影响。
接近 3 年之前 回复

严蔚敏的书上用的是ElemType,但ElemType一次只能对应一种类型啊,假如我一个线性表需要ElemType为int,另一个线性表需要ElemType为char,该如何进行处理?因为C语言没有模板功能,是不是只能拷贝代码改名字了?要这样处理,就太不优雅了。

qq_31828515
皓皓松 用联合体可以省点空间,插入生成的节点的时候只要进行一个类型判断就可以了。
接近 3 年之前 回复

你会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;
}

qq_31828515
皓皓松 上述代码在VS2013下编译通过,可以解决空间浪费的问题,只要插入的时候进行类型判断即可
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!