在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列.
1 /*定义单链表结点类型*/ 2 3 typedef char ElemType; 4 5 typedef struct dNode {//声明单链表结点类型 6 7 ElemType data; 8 9 struct dNode *next; //指针域 }LNode, *LinkList;
//定义此结构体变量struct dNode a或LNode a;定义此结构体的指针struct dNode *p或LNode *p或LinkList p都是没区别的 /*在链表的末端插入新的节点,建立链表*/
注意点:
指针域定义了指向自己所在结构体类型的指针.这部分很容易错写,一种是漏写struct,要记住此时你声明next的时候typedef还没定义呢,哪来的dNode?如果不写struct,不管你是写dNode还是LNode结果都只有一种:后面根本编译不下去,错误一堆!此时还没定义完结构体呢!这也说明不能用LNode *next;总之要在结构体内定义指向自己的指针非得加上struct不可!
对于太多自学的人这条可能很有现实意义了.我相信有不少人会把指针域的dNode还}后的LNode连带最开头的dNode三个搞混.因为很多编程书上都给他们取一样的名字!好吧,如果照书上抄代码还没错.这里把struct dNode{}这部分看成整体,typedef就是给这个整体取别名的,我取的是LNode;与此同时给这个整体的指针取了LinkList作别名.
因此我们就有我在注释里写的2种定义结构体变量和3种定义结构体指针的方式.
指针域那个是dNode不是后面的LNode,很简单后者只是别名,前者是真正的结构体名.如果你把这句写成struct LNode *next编译是能通过的,但是有潜在危机.定义完上述代码后,我又有了如下操作 LinkList p,head; head->next = p; 发现警告 warning C4133: “=”: 从“LinkList”到“LNode *”的类型不兼容!然后我将错写的struct LNode *next改回struct dNode *next就没警告了.