zoukankan      html  css  js  c++  java
  • 使用C模拟面向对象实现如java的LinkedList集合(好精彩)

    我们都知道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版:

  • 相关阅读:
    2019-2020-1 20175335 20175303 20175304 20275327 实验三 并发程序
    2019-2020-1 20175304 20175303 20175327 20175335 实验二 固件程序设计
    2018-2019-1 20175304 20175303 20175327 20175335 实验一 开发环境的熟悉
    2019-2020-1 20175312 20175333 实验四 外设驱动程序设计
    实验三 并发程序
    2019-2020-1 20175312 20175321 20175333 实验三-并发程序
    2019-2020-1 20175312 20175321 20175333 实验二 固件程序设计
    2019-2020-1 20175312 20175321 20175333 实验一 开发环境的熟悉
    # 2019-2020-1 20175333曹雅坤 《信息安全系统设计基础》第四周学习总结
    2019-2020-1 20175333《信息安全系统设计基础》第三周学习总结
  • 原文地址:https://www.cnblogs.com/nimendezaige/p/4914250.html
Copyright © 2011-2022 走看看