关于单链表C语言实现的一些疑惑

来源:互联网 发布:python 累计分布函数 编辑:程序博客网 时间:2024/06/06 09:41

单链表的C语言实现如下:

typedef struct node{   //结点类型定义
       DataType data;    //结点的数据域
       struct node *next;//结点的指针域
     }ListNode;

即定义了一个结构体 node,将他重新命名为ListNode~

我的疑惑是,结构体名为 node,但是在结构体的定义中,居然还有一个 node 类型的变量,

相当于在类MyClass中定义一个MyClass类型的私有成员变量~~这点让我很费解,后来才明白,这两者关系其实是不一样的



具体解释

解释一:

struct MyClass
{
        int a;
        MyClass *p
}

不管什么类型的指针,在32位程序里面都是32位四个字节。
所以说这个MyClass已经很明确了,总共8个字节,完全有意义啊


struct MyClass;
 
void main()
{
    MyClass *p = 0;
}

就像这段代码完全合法一样,MyClass具体是什么都不知道,但仍然可以使用它的指针,因为不管它是什么类型的指针,都是四个字节,都是一样的


解释二:

你只要记住一点,编译器很聪明,能够明白你这段代码代表什么意思,就够了,如果再要深究,就只能研究编译原理了。

编译器先看到你定义了结构,然后看见你在这个结构体中又使用了这个结构,因为编译器已经知道这是一个结构体,所以他可以处理这种情况。如果你把结构中的struct node *next; 这一句,替换成}ListNode *next; 编译器就会报错,因为他还没有看见过这个ListNode是什么东西。

另外,你不能在你的结构体中,再定义一个非指针类型的同样的结构体,例如struct node next;(注意,没有星号),这时,编译器也应该报错,为什么,因为这会导致定义的无限延伸!也就是说,这个定义是一个死循环,永远停不下来。


所以说,链表的C语言实现中,之所以能这样使用,是因为里面的那个变量时指针,而指针所占的字节数是已知的(不管什么类型指针,在32位操作系统中,都是占 4 个字节)

0 0
原创粉丝点击