使用C模拟面向对象实现如java的LinkedList集合(好精彩)

我们都知道C是一个面向过程的语言,怎么模拟面向对象呢?

大家不要忘了结构体这东西,说起来和类还是有些相似的

首先我们得理解一下什么叫做链表,就像一队人排队一个连着一个,你找到第一个就能知道下一个

如果不清楚,大家可以去看看java的LinkedList集合

接下来就会带大家实现和LinkedList一模一样的集合

首先,为了好理解,先使用java编写再改编成C的版本

链表是一个一个节点连着一起的,所以我们首先创建一个实体类Node(其中使用到了泛型,如果有疑问可以查看我的另一编关于泛型的文章)

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

这个Value表示这个节点的值,由于我们做的是双链表,就有说自己有自己的上一个(up)和下一个(next)两个属性

为了模拟LinkedList 我们看看使用他的语法

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

既然LinkedList有这些方法,我们也创建一个自己的集合  叫做  MyLinkedList 

首先得有三个成员变量来记录

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

我们也使用到泛型,然后下面是每一个方法的具体实现

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

删除这里就像一排人排成一纵队,你准备要走了你就跟你前面的人说:"我要走了,你的后面的不再是我,是我后面这位"

然后再对后面的说:"你的前面不再是我,是我前面这位",其实就是赋2个值罢了

使用C模拟面向对象实现如java的LinkedList集合(好精彩) 

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

说了这么多,还没讲到C,接下来才是java转C的重要时刻:

注意对照着看,你会发现有点面向对面的样子,由于C没有泛型,所以我们模拟的集合只能装int类型的数据

首先是Node类,可是C没有类,但有结构体,就这样做;

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

看出其中的相同和不同了吗?initNode方法其实就等于类的构造方法,其中的malloc() 在C中就是开辟内存空间的意思

唯一的缺陷就是C没有封装这一特性,构造方法写在外面,而且没有private等修饰符来控制访问

接下来就是MyLinkedList的代码,这里C的结构体里就有方法了哦!

由于有些字是关键字不能用作函数名,所以对照java版有些不同,不过也很容易看出来

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

我们可以再结构体里放函数的指针,这样就能通过这个结构体调用方法啦,java版:list.save(1)  C版: list->save(1) 

因为刚才我们也说了,C没有封装的概念所以方法只能写在结构体外面,也因为这点所以没有this这种东西

所以我们的成员变量

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

只能写成 C的全局变量

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

这个是个缺陷,我们定义的List *list 可以当成this来用,而且no用来记录

然后是我们的构造方法,由于结构体里的成员不能初始化,只能写一个相当于构造方法的来初始化

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

实际上就是开辟空间,把对应的方法指针赋值到结构体成员里

下面提供添加的方法实现,其他的自己对照java版举一反三

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

最后对照java版和C版的调用方法,你会发现,完全一样,只是C没有泛型

java版:

使用C模拟面向对象实现如java的LinkedList集合(好精彩)

C版:

使用C模拟面向对象实现如java的LinkedList集合(好精彩)