版权声明:本文参考了严蔚敏的《 数据结构》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!
1 typedef的作用
typedef的作用就是对已有的对象(包括但不限于基本数据类型、自定义的数据类型和对象等)起一个别名格式为typedef 原对象名 别名
2 严蔚敏《数据结构》中的结构体
首先严蔚敏的《数据结构》采用的C与CPP混合,比如传引用是CPP中的,C中并没有。
2.1 C中定义结构体的原本方式
C中定义结构体的原本方式应该是(这里用定义单链表为例):
struct Linknode
{
int data;
struct linknode *next;
};
但由于c中定义结构体变量时必须在结构体名前面加上关键字struct才行:struct 结构体名 结构体变量名;
,如果不加C就会将结构体名认为是是一个未定义的变量。所以在每次定义结构体变量时都要写一次关键字struct
,为了避免麻烦,就使用了typedef struct linknode linknode
,意思是给struct linknode
起一个别名叫linknode
,以后定义结构体变量时就可以采用常规定义变量的方法linknode L
,而不必再加一个关键字struct
。而在书中是把定义结构体与给它起别名写在一起的,也就是说
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode linknode;
与
typedef struct Linknode
{
int data;
struct linknode *next;
}linknode;
是等效的,两种写法都可以。
采用上面两种写法时即可以采用 struct linknode L
或者linknode L
都可以的,但在某些定义结构体时可以省去结构体名的情况中如果省去结构名体则不能采用前一种定义方法,如:
typedef struct
{
int data[50];
int length;
}sqList;
这里就不能再使用struct sqList L
来定义顺序表表L,特别要注意的是
typedef struct Linknode
{
int data;
struct linknode *next;
}linknode;
与
struct Linknode
{
int data;
struct linknode *next;
}linknode;
是不同的,前一个”linknode ”是一个结构体,而后一个”linknode”则是一个在定义结构体顺便定义了的变量,同样的
typedef struct
{
int data[50];
int length;
}sqList;
与
struct
{
int data[50];
int length;
}sqList;
中的“sqList”也是不同的。前者是结构体名,而后者是结构体变量名。
注意:使用typedef 对已有对象起别名更深层的原因在于在较大的程序中,如果使用基础类型来定义变量,后来有又需要改变这些变量的类型时,必须一个一个的去改,而如果使用了typedef,则只需要在typedef语句中更改原基础类型名,如:
typedef int elemtype;
int main()
{
elemtype a;
elemtype b;
elemtype c;
……
elemtype z;
}
与
int main()
{
int a;
int b;
int c;
……
int z;
}
作用虽然一样,但现在要求将变量a到z全部变为char型,第一种只需将typedef int elemtype
改为typedef char elemtype
,只需修改一次即可,而第二种则需逐行的去更改,需要修改26次。在变量很多时,这是无法想象的工作。
2.2 C++中定义结构体的方式
C++中定义结构体的原本方式应该是(这里用定义单链表为例):
struct Linknode
{
int data;
struct linknode *next;
};
但与c不同,c++中定义结构体变量时可以在结构体名前面加上关键字struct也可不加:struct 结构体名 结构体变量名;
和结构体名 结构体变量名;
都可以。举例说来:
struct Linknode
{
int data;
struct linknode *next;
};
与
struct Linknode
{
int data;
linknode *next;
};
是等效的,两种写法都可以。
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode linklist;
与
struct Linknode
{
int data;
struct linknode *next;
};
typedef linknode linklist;
也是等效的。
同C一样,C++某些情况下也可以省去结构体名,其情况和前面说的c中的情况是一样的。
2.3 严蔚敏《数据结构》中的结构体指针
C和C++中定义结构体指针的方式都是结构体 *指针名
以上面的例子来说:
应该是
typedef struct Linknode
{
int data;
struct linknode *next;//c++中此句话的struct可以省略
}linkList;
int main()
{
linkList *L;
……
}
但在严蔚敏的数据结构中我们还可以看见另外一种定义指针的方式
typedef struct Linknode
{
int data;
struct linkList *next;
}*linkList;
int main()
{
linkList L;
……
}
这里前面的L和后面的L都是指向结构体的指针,原因用其原本形式来说明:
上面的原始的句子应该是
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode linkList;
int main()
{
linkList *L;
……
}
和
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode* linkList;
int main()
{
linkList L;
……
}
这里的
typedef struct linknode linkList;
linkList *L;
与
typedef struct linknode* linkList;
linkList L;
是等价的,typedef struct linknode* linkList;
就是对struct linknode*
起了一个别名,避免了以后定义指针时候每次都需要输入一个“*”的麻烦。
3 总结
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode linknode;
与
typedef struct Linknode
{
int data;
struct linknode *next;
}linknode;
等价的。
typedef struct Linknode
{
int data;
struct linkList *next;
}*linkList;
int main()
{
linkList L;
……
}
和
struct Linknode
{
int data;
struct linknode *next;
};
typedef struct linknode* linkList;
int main()
{
linkList L;
……
}
也是等价的。
版权声明:本文参考了严蔚敏的《 数据结构》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!