单链表中结构体指针及指针做参数疑点解惑

来源:互联网 发布:淘宝网上怎么买二手货 编辑:程序博客网 时间:2024/05/17 01:31

大二时数据结构学的迷迷糊糊,很多问题没有深究,书上怎么写我就怎么记,没有思考过一些细节。最近考研复习数据结构遇到不少费解的问题,问题很细,可能很多人都会不小心忽视。

单链表的定义

typedef struct LNode{  Elemtype data;  struct LNode *next;}LNode,*LinkList;

首先关于LNode的问题:

为啥要定义两次LNode呢?两次的作用是否相同呢?

答案是不相同!在结构体定义typedef struct A{...}A中,前一个A是结构体标记,后一个A是你定义的一个结构体数据类型。结构体标记没有啥实际作用,其实可以随便取名字,一般用来标记该结构体的某些信息,唯一的用处就是你需要创建一个结构时要会使用到它,比如说

struct A B;//创建一个A这样的结构体,名字叫B

后一个A是你定义的一个结构体数据类型。问题来了,啥叫我定义的一个结构体的一个数据类型?数据类型大家都知道吧,比如说int,double。它们有什么用处?创建它们各自类型的新变量啊,比如说

int a;double b;

同理,现在的A就相当于int,double,我可以直接用它定义一个结构体类型的变量,比如说

A B;//此时B就是一个A类型的结构体了,内含两个成员变量,一个是data,类型是Elemtype(任意数据类型),一个是结构体指针类型的指针 next,
它只能指向同为该结构体类型的某一个节点

在结构体标记很长的时候,直接用结构体类型来创建一个新的结构体变量就会很方便。

但是很多书上把结构体标记跟下面的结构体数据类型写成一样的,就像我上面写的,就会引起很多初学者的误解,以为他们之间必然有什么联系,甚至就应该是相同的。这里我修改掉

typedef struct hello{  Elemtype data;  struct LNode *next;}LNode,*LinkList;

关于*LinkList的问题。

指针不得不说是C、C++语言里面最费解的问题之一了。*LinkList定义了一个struct hello类型的指针,意思是说*LinkList是与LNode不同名字但是同一个类型,其实是等价的。LinkList本质上是一个指向该结构体的指针类型。比如说,我定义一个LinkLIst类型的指针p

LinkList p;
那么这个p就是指向该结构体的一个指针,也就是所谓单链表中的头指针。



原创粉丝点击