使用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版:

时间: 2024-10-07 01:23:05

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

C--c语言模拟java的linkedList

java的linkedList集合,是一个单链集合,因此只需要知道头,便知道后边接着的全部. 第一步:先把头文件写好 linkedList.h //这是头文件 struct person { int value; struct person * next; }; typedef struct person p; /*addLast从最后一个处添加. 先判断头在不在, 如果头在的话,就循环判断知道找到最后一个,创建实例,添加至最后一个的后面位置处 */ void addLast(p* head,i

Java学习:集合双列Map

数据结构 数据结构: 数据结构_栈:先进后出 入口和出口在同一侧 数据结构_队列:先进先出 入口和出口在集合的两侧 数据结构_数组: 查询快:数组的地址是连续的,我们通过数组的首地址可以找到数组,通过数组的索引可以快速的查找某一个元素. 增删慢:数组的长度是固定的,我们想要增加/删除一个元素,必须创建一个新数组,把原数组的数据复制过来 例: int[] arr = new int[]{1,2,3,4}; 要把数组索引是3的元素删除 必须创建一个新的数组,长度是原数组的长度-1 把原数组的其它元素

王燕 201771010126《面向对象程序设计(java)》第一周学习总结

王燕 201771010126<面向对象程序设计(java)>第一周学习总结 王燕 201771010126<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.com https://www.cnblogs.com/wy201771010126/ 程序设计评测:https://pintia.cn/ a的n次幂 代码托管平台:https://github.com/ wy2017710

张季跃 201771010139《面向对象程序设计(java)》第十六周学习总结

张季跃 201771010139<面向对象程序设计(java)>第十六周学习总结 1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 2.实验内容和步骤 实验1:测试程序并进行代码注释. 测试程序1: l 在elipse IDE中调试运行ThreadTest,结合程序运行结果理解程序: l 掌握线程概念: l 掌握用Thread的扩展类实现线程的方法: l 利用Runnable接口

201771010125王瑜《面向对象程序设计(java)》第十七周学习总结

201771010125王瑜<面向对象程序设计(java)>第十七周学习总结 一 理论知识 1.多线程:多线程是进程执行过程中产生的多条执行线索. 2.进程: 线程是比进程执行更小的单位.线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据.每个线程有它自身的产生.存在和消亡的过程, 是一个动态的概念. 3.线程创建.销毁和切换的负荷远小于进程,又称 为轻量级进程(lightweight process). 4.Java实现多线程    -创建Thread类的子类    -

JavaScript碎片———函数闭包(模拟面向对象)

经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知,如有错误,还请见谅. 具体来说实现模拟面向对象主要是利用JavaScript函数闭包这个概念.由于JavaScript中的每一个function都会形成一个作用域,而如果变量声明在这个域中,那么外部是无法直接去访问,要想访问必须new出一个实例来,相当于Java中class.首先让我们来了解一下pr

2017面向对象程序设计(Java)第二周学习总结

2017面向对象程序设计(Java)第二周学习总结 直系学妹学弟们好!额...不要问我为什么把学妹放前面,我也不知道!我只是你们和蔼可亲的学长一枚而已.也不要问为什么是第二周学习总结而不是第一周,因为第一周学长正在家里吃西瓜吹空调.好了,闲言少叙.我先为你们介绍一下助教的职责,而后再对你们的学习情况进行总结! 身为你们本学期Java课程的助教...之一,我的任务是:指导你们学习,批改我所负责学习小组的实验作业.阅读博文并回复.其他学习小组会有另外三位助教负责.由于我们每周五都会汇总你们的情况,其

使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法

一,LRU算法介绍 LRU算法是最近最少未使用算法.当内存缺页时,总是优先选出距离当前最久未使用的页面换出,并把当前的缺页换入.该算法可用栈模拟实现. 栈顶总是保存当前最近访问的页面号,栈底则总是保存最久未访问的页面号.对于下一个页面,有两种情况: ①命中,则需要:更新栈顶元素.即将当前命中的页面号放到栈顶. ②未命中,这里还需要考虑栈是否满了.1)若栈未满,直接将未命中的页面号放到栈顶即可.2)栈已经满了,则需要选中一页换出(栈底元素是最久未访问的页面),然后再将新页面放入栈顶. 二,代码实现

C++面向对象不同于Java之处总结

这两天较系统的看了下C++的基本用法,对比自己对Java理解,感觉就是C++特性远远多于Java,语法上兼容C,更加贴近系统和底层,对内存操作非常的灵活.如: C++中类的对象可以开辟在栈空间中.Java类的对象都必须用new关键字开辟在堆中: C++的基本数据类型也可以用new开辟在堆中.Java基本数据类型只能开辟在栈中,除非使用包装类包装成对象: C++用new开辟的内存必须手动delete,否则内存泄露.Java则有著名的垃圾回收: C++传参可以传值和传引用,也可以配合指针传对象地址,