一、前言
在考研的过程中总是能看到书上许多数据结构的定义用到了结构体,但是我发现书上的代码一般偏向于应用在大型的软件之中,对于typedef其实在解释数据结构上面没有什么作用,但是在简化代码方面发挥了巨大作用。那为什么引入typedef?为什么有些struct后面跟结构标记,有一些又使用匿名定义?以下内容是我在看了c语言圣经——大黑书得到的启发。一定要跟着下面的思路自己思考,可以说对于考研里面出现结构体的地方你不会看不懂!希望大家多点赞和关注,说实话真的是为了帮助在考研路上有困惑的同学!
二、结构体的定义
一定要记住,结构体的定义,如果你写成下面两种形式,系统并不会为这个结构体分配内存空间。
struct { int x; int y; };
struct之后有一个可选字段,我们称之为结构标记(用于代表花括号内部的声明),所以我们经常看到下面的定义:
struct point{ int x; int y; };
那么 point={ int x; int y },这样做的好处就是我可以把定义和声明分离,因为每次定义都写point内部的结构声明太麻烦了,所以我们发挥懒人的属性,一次定义,后面一直能使用。
//我要定义一个三个坐标点A,B,C //法一: struct {int x;int y} A; struct {int x;int y} B; struct {int x;int y} C; //法二: struct point{ int x; int y; }; struct point A,B,C;
是不是还是觉得不够简便,是不是struct也不想写,对了,这就是为什么书上还要有typedef的原因了。必须提醒一下,此时typedef还没有登场,struct后面花括号紧跟着的是一个结构名(就是法一里面的A,B,C),这个非常重要,当有了typedef之后情况就完成不一样了。
三、定义一个结构体变量的标准格式
struct{......} A;
记住这个格式,这种定义我们可以认为【结构体定义+声明】一起完成了,当然此时为结构变量A分配了存储空间(可以联想struct{.......}=int,那么是不是相当于定义了一个int a,a变量当然会分配存储空间),当然结构名可以有多个,如下
struct{......} A,B,C;
上面不是引入了结构标记了吗,那{........}这一部分是不是可以用结构标记来代替,从而有了以下形式:
struct point A,B,C;
这也就解释了为什么用了结构标记,struct还是不能省略,那么为什么书上怎么代码里面定义一个结构体变量的时候没有struct呢?答案就是引入了typedef别名。
四、引入typedef之后
记住下面两个代换即可
typedef A B; B=A; //无论A多么复杂 typedef A *B; B=A *; //无论A *多么复杂
①第一个代码——线性表的顺序存储
#define MaxSize 50 typedef struct{ int data[MaxSize]; int length; } SqLsit;
第一步:SqList=struct{ int data[MaxSize]; int length; } SqList是别名,不是结构名,千万注意 !!!!
第二步:怎么定义一个线性表的变量呢?看上面标准格式的第一个【struct{........} A;】用第一步的替换之后是不是就是 SqList A;这就可以定义一个变量名为A的结构。那为什么这里不用结构标记呢,其实我们用第一步代换可以发现,好像没有必要,我把花括号里面的内容都用一个别名替换了,那我还需要结构标记干嘛!
①第二个代码——二叉树的链实存储第一步:①BiTNode = struct BiTNode{ int data ; struct BiTNode *lchild , *rchild; }typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;
②BiTree = struct BiTNode{ int data ; struct BiTNode *lchild , *rchild; } *
第二步:定义结构体变量:BiTNode A;
定义结构体变量指针:①BiTNode *A;
②BiTree A;(其实我很少这样写,有时候还会忘记是指针,只是书上都是这样写,写代码从理解上,个人推荐上面①)
关键一步:为什么这里就出现了结构标记?发现没有,因为在结构体内部用到了结构体本身的指针变量,如果不给一个结构标记,编译器不知道这个结构体指针是什么,也不好在定义变量的时候分配内存空间。
五、总结
凡是结构体内部用不到结构体本身时——用不用结构标记都一样(一般不会画蛇添足),可以去王道书上看看栈的定义;
反之内部出现自身的定义——一定要有个结构标记,告诉编译器要给我开辟一个多大的存储空间。
真的希望对大家有帮助,这个格式调了半天,可能效果不好,因为都是自己码的,编译器也没有提示,可能会有些错误,希望大家指正。