最近几个月在备考专升本,未来半年以内应该都不会更新java有关的内容了(专升本不考这个,且没时间学别的了),未来主要会更新C语言,数据结构(C语言版),数据库这三个.
更新这篇文章原因是,在我学到数据结构定义一个链表的时候没看懂,重新翻看了C语言的书也是没看懂这些代码,又询问了哈工大的学长,专升本的同学,老师,才搞明白:结构体变量的定义和初始化有很多种方法,而且他们有细微的差别,是我之前没了解到了,下面我按照typedef的有无,来简述一下两种结构体定义的区别和写法:
第一种:普通方法
创建结构体并给结构体取别名为Boy,利用Boy类型新定义一个lao_wang变量
//创建结构体并给结构体取别名为Boy,利用Boy类型新定义一个lao_wang变量
typedef struct boy
{
int age;
int telephone[11];
}Boy;
Boy lao_wang;
上面的代码定义了一种struct boy类型,然后用typedef 给其起一个别名 Boy .
并且定义了一个这种类型的变量。
注意:如果没有 typedef , 每次定义结构体变量,变量名前要加 struct boy.
这种写法相当于:
struct boy
{
int age;
int telephone[11];
};
typedef struct boy Boy;
和第一种写法的区别是:这种写法是先定义结构体类型,后为结构体类型取别名,而第一种写法是定义结构体类型和取别名是同时进行的.
第二种:没有typedef,且不为结构体设置别名 的方法(也是我之前主要疑惑的点)
struct boy
{
int age;
int telephone[11];
}lao_wang;
需要注意的是,这里的lao_wang和第一种定义方法中起别名的位置相同,但是,在这种方法中,lao_wang并不是这个结构体boy的别名,而是利用struct boy新建的一个变量,是一个变量哦.
这个写法相当于:
struct boy
{
int age;
int telephone[11];
};
struct boy lao_wang;
因为没有 typedef , 所以每次定义结构体变量,变量名前要加 struct boy.
那么,回到我们最开始研究的问题:数据结构里单链表的定义和表示:
typedef struct node
{
int age;
struct node* next;
}Node, * Linklist;// 等价于 struct node , struct node *
typedef struct node
{
int age;
struct node* next;
}Node;
typedef Node* Linklist;
上面代码块中的 Linklist 是什么意思呢?
其实就相当于给 Node *(struct node) 起了一个别名。给指向 Node 结构体的指针重新起了一个新的小名。