1
2
3
4
5
/*结构体类型定义*/
struct student{
    int num;
    char sex;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*结构体变量定义*/
/*结构体类型定义后,仅表示增加了一种结构类型,没有分配内存空间,需要定义相应类型变量才能使用*/

/*法1:定义结构类型,在定义结构变量*/
struct student{
    int num;
    char sex;
};
struct student st1, st2; //每次定义必须写全struct student

/*法2:定义结构类型同时定义结构变量*/
struct student{
    int num;
    char sex;
}st1,st2,st[50];

/*法3:不定义结构类型标识符,直接定义结构变量*/
struct{
    int num;
    char sex;
}st1,st2;
/*法3的缺点在于由于没有直接指定结构类型名,以后如需再定义这种类型的结构变量,必须把结构类型定义再写一遍*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*结构变量的初始化*/
/*在定义结构变量的同时可以对它初始化*/
struct student{
    int num;
    char sex;
}stu = {56,'男'};

struct student stu2 = {56,'女'}; 

/*注意,这种赋值语句只能在定义时使用,以后要赋值,必须对结构体的单个成员逐一赋值*/
/*没有被赋值的成员,默认初始为0*/

/*结构变量成员的引用*/
stu2.num
1
2
3
4
5
6
7
/*结构体指针*/
struct student{
  int num;
  char sex;
}stu1, *p=&stu1;

p->num; (*p).num; stu1.num;  //三种引用方法
1
2
3
4
5
6
/*C++里的struct*/
struct student{
    int num;
    char sex;
};
student x; //定义结构变量时不需要struct关键字,其他都相同
1
2
3
4
5
6
7
8
9
/*typedef struct*/
typedef struct student{
    int num;
    char sex;
}stu; //类型名
stu stu1; //为student结构体类型起了别名叫stu,可以省略struct

/*注意!使用typedef起别名,标签student 可有可无,结构体变量 位置变为该 类型名 */
/*在C++实际上作用不大*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Node {
    int data;
    struct Node *nextptr;
};

/*等价于*/
typedef struct Node pNode;
struct Node {
    int data;
    pNode *nextptr; //此时取好别名了,可以用pNode
};

/*等价于*/
typedef struct Node {
    int data;
    struct Node *nextptr; //此时还没取别名,还不能用pNode
}pNode;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct BiTNode{
    TElemType  data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
/* 为BiTNode 起了别名叫BiTNode 虽然是一样的名字,但是用了typedef以后可以省略struct */
/* 为BiTNode* 起了别名叫BiTree 以后就可以用BiTree表示指向BiTNode类型的指针 */

/*
为什么取BiTree的名字?
因为用这个指针来代表整个二叉树!
为什么可以?
因为只要根节点的指针确定,那么整棵树就可以被找到了
*/

/*
链表同理!定义如下!
*/
typedef struct Node{
	int data;
    struct Node* next;
}Node,*Linklist;
1
2
3
4
5
6
/* 上述都是C语言的写法,下面介绍C++的写法*/
struct BiTNode{
    int  data;
    BiTNode *lchild,*rchild;
};
typedef BiTNode* BiTree; //或者不要!直接就用BiTNode *
1
2
3
4
5
6
/*值得注意的是,无论是c/c++,但凡在struct后出现的是变量名,typedef struct后出现的是类型名*/
struct BiTNode{
    int  data;
    BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
/*我最先以为在C++中,这定义了一个BiTNode类型和BiTree类型,实际上定义的是一个叫做BiTNode的BiTNode类型变量和一个叫做BiTree的BiNode类型指针变量*/

总结

1
2
3
4
5
6
/* 说了一大堆,总结出最实用的是!以后写程序,就用这个陈越的定义方法*/
typedef struct Node{
	int data;
    struct Node* next;
}Node,*Linklist;
/*多熟悉这种方式!!!!!!!*/