数据结构定义问题1typedef
1、实际是把结构体的定义和新类型的定义合在一起了。跟下面这样写是等价的,可能会好理解一点:
struct CSNode
{
TElemType data;
struct CSNode *firstchild,*nextsibling;
};
typedef struct CSNode CSNode,*CSTree;
上面先定义一个结构体struct CSNode,然后再定义出一个自定义数据类型CSNode,*CSTree;你如果不定义数据类型如果要声明一个结构体变量则要struct CSNode node,声明结构体变量的指针则要
struct CSNode *pnode;但如果使用自定义...全部
1、实际是把结构体的定义和新类型的定义合在一起了。跟下面这样写是等价的,可能会好理解一点:
struct CSNode
{
TElemType data;
struct CSNode *firstchild,*nextsibling;
};
typedef struct CSNode CSNode,*CSTree;
上面先定义一个结构体struct CSNode,然后再定义出一个自定义数据类型CSNode,*CSTree;你如果不定义数据类型如果要声明一个结构体变量则要struct CSNode node,声明结构体变量的指针则要
struct CSNode *pnode;但如果使用自定义类型则只要CSNode node, CSTree pnode就可以了,在一定程度上简化了书写,使程序更简洁更容易理解。
2、void insert(LinkList p;int x),在函数内部会生成一个p的副本,在函数内部都是对p的这个副本操作,虽然你在函数内部有插入元素x和可能外部的p并没有真正插入元素x,除非LinkList是指针类型,严重不推荐这种用法。
void insert(LinkList &p;int x),函数内部用的p也就是外部传进来的p,两者完全一样,所以这样操作是可行,如果你是用C++推荐这种用法,如果是C语言则不支持引用,不支持这种用法。
void insert(LinkList *p;int x),函数得到的是指针类型但如果你LinkList本身就是一个节点类型,则函数在队列头插入x可能会出错,若果LinkList不是节点类型则不会出错。
3 LinkList s 是定义一个LinkList 的类型,如果调用上面的
void insert(LinkList &p;int x) 函数插入元素x则可以写成
insert(s, x),调用 void insert(LinkList *p;int x)要写成
insert(&s,int x)
LinkList *s 是定义一个指向LinkList的类型,即LinkList类型的指针 如果调用上面的void insert(LinkList *p;int x)函数插入元素x则可以写成insert(s;x)不能调用insert(LinkList &p;int x)
4 s=(LinkList)malloc(sizeof(Node));
s=(LinkList *)malloc(sizeof(Node));
要看LinkList是不是指针类型,如果不是,前者是错误的后者的s也必须是(LinkList *)型,malloc(sizeof(Node))是向系统申请一个Node的空间返回Node节点的首地址,LinkList *)是将其强制转化为LinkList *型。
。收起