我们都知道C是一个面向过程的语言,怎么模拟面向对象呢?
大家不要忘了结构体这东西,说起来和类还是有些相似的
首先我们得理解一下什么叫做链表,就像一队人排队一个连着一个,你找到第一个就能知道下一个
如果不清楚,大家可以去看看java的LinkedList集合
接下来就会带大家实现和LinkedList一模一样的集合
首先,为了好理解,先使用java编写再改编成C的版本
链表是一个一个节点连着一起的,所以我们首先创建一个实体类Node(其中使用到了泛型,如果有疑问可以查看我的另一编关于泛型的文章)
这个Value表示这个节点的值,由于我们做的是双链表,就有说自己有自己的上一个(up)和下一个(next)两个属性
为了模拟LinkedList 我们看看使用他的语法
既然LinkedList有这些方法,我们也创建一个自己的集合 叫做 MyLinkedList
首先得有三个成员变量来记录
我们也使用到泛型,然后下面是每一个方法的具体实现
删除这里就像一排人排成一纵队,你准备要走了你就跟你前面的人说:"我要走了,你的后面的不再是我,是我后面这位"
然后再对后面的说:"你的前面不再是我,是我前面这位",其实就是赋2个值罢了
说了这么多,还没讲到C,接下来才是java转C的重要时刻:
注意对照着看,你会发现有点面向对面的样子,由于C没有泛型,所以我们模拟的集合只能装int类型的数据
首先是Node类,可是C没有类,但有结构体,就这样做;
看出其中的相同和不同了吗?initNode方法其实就等于类的构造方法,其中的malloc() 在C中就是开辟内存空间的意思
唯一的缺陷就是C没有封装这一特性,构造方法写在外面,而且没有private等修饰符来控制访问
接下来就是MyLinkedList的代码,这里C的结构体里就有方法了哦!
由于有些字是关键字不能用作函数名,所以对照java版有些不同,不过也很容易看出来
我们可以再结构体里放函数的指针,这样就能通过这个结构体调用方法啦,java版:list.save(1) C版: list->save(1)
因为刚才我们也说了,C没有封装的概念所以方法只能写在结构体外面,也因为这点所以没有this这种东西
所以我们的成员变量
只能写成 C的全局变量
这个是个缺陷,我们定义的List *list 可以当成this来用,而且no用来记录
然后是我们的构造方法,由于结构体里的成员不能初始化,只能写一个相当于构造方法的来初始化
实际上就是开辟空间,把对应的方法指针赋值到结构体成员里
下面提供添加的方法实现,其他的自己对照java版举一反三
最后对照java版和C版的调用方法,你会发现,完全一样,只是C没有泛型
java版:
C版: