[数据结构]freebasic实现动态单链表
前言
首先,感谢勇芳为我们提供了强大的编辑器vfb。这是我在csdn上第一次发关于freebasic的博客。因为我是一名初三学生,没有时间系统学习fb,以下代码有不规范的还请各位大佬指出[真诚]
(转载请标明出处)
百度百科对链表的定义
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
单链表的模型
单链表模型如下图所示[图片来自网络]
实现思路
freebasic支持指针,但又不像C++支持new关键字,刚开始,我想用调用API申请堆内存的方法实现,但此种方法过于繁琐。联系到fb支持调用c函数的特点,我想到了malloc函数。
我们定义链表节点类型为LNode,包括一个_next指针和数据域data。用malloc函数每次申请大小为sizeof(LNode)的内存,通过List_Create()方法生成链表头指针pHead,之后就可以愉快的进行各种方法的编写了
malloc函数讲解
百度上对malloc的解释比较生僻难懂,这里我讲解一下我的思路。malloc就是动态地申请一块指定大小内存,并返回其指针(void指针)。因为是void*类型,如果我们想操作这块内存就要进行类型转换,也就要用到Cast(欲转换成的类型,变量)将void指针转换成LNode ptr。
想要使用malloc必须包含以下库
#Include Once "crt\stdlib.bi"
LNode类型
Type LNode_data As Long_next As LNode Ptr
End Type
List_Create()的实现
先上代码
Function List_Create() As LNode Ptr Dim As LNode Ptr pHead,pTailpHead = Cast(LNode Ptr, malloc(SizeOf(LNode)))If (pHead = Null) ThenList_Create = Null End If pTail = pHeadpTail-> _next = NullList_Create = pTail
End Function
首先定义头指针,并为其申请内存空间,pHead=Null是对malloc是否申请成功的特判,其实这里的Ptail指针完全不需要(尾指针的next为Null),这里这样写是为了让大家更好地理解这个过程(链表头指针与尾指针重叠,链表为空)
List_AddNode(_data)的实现
与Create函数原理类似,此函数是向链表尾部添加一个节点。
Function List_AddNode(pHead As LNode Ptr, _data As Long) As BOOL Dim As LNode Ptr pDim As LNode Ptr newN p = pHead Do While p-> _next <> Nullp = p-> _next Loop newN = Cast(LNode Ptr, malloc(SizeOf(LNode)))newN-> _data = _datanewN-> _next = p-> _next p-> _next = newN List_AddNode =True
End Function
先通过一个while循环获取尾指针,再将尾指针的next指向新节点,新节点的next赋值为Null,将数值data存进新节点。大功告成。
List_DeleteAll(pHead)的实现
有创造就有销毁,此函数的功能是释放所有链表节点。
Function List_DeleteAll(pHead As LNode Ptr) As BOOL Dim As LNode Ptr p,qp = pHead-> _next q = pHead free(q)Do While p-> _next <> Nullq = pp = p-> _next free(q) Loop free(p)List_DeleteAll =True
End Function
感谢强大的C,我们再次需要调用C函数。free()函数的作用就是释放一个指针。这里通过循环逐个释放,其余原理同上,不过多解释。
List_InsertNode(pHead,id,_data)的实现
将_data插入指定链表的第id位置
Function List_InsertNode(pHead As LNode Ptr, id As Long, _data As Long) As BOOLDim As LNode Ptr p=pHeadDim As Long iFor i = 1 To id -1p = p-> _next Next iDim As LNode Ptr qq = pDim As LNode Ptr inodeinode = Cast(LNode Ptr, malloc(SizeOf(LNode)))p = p-> _next inode-> _next = pq-> _next = inodeinode-> _data = _dataList_InsertNode = True
End Function
这里我主要讲解一下插入的过程。因为要插入到id位置,也就是向第id-1个节点后插入(在第id个节点前插入)。所以,我们先用循环获取第id-1个节点的指针,并用指针q存下,再获取当前第id个节点的指针。新节点的next指针指向p,q的next指向inode,此时inode节点即为第id个节点。
List_DeleteNode(pHead,id)的实现
删除指定位置的节点,原理互逆
Function List_DeleteNode(pHead As LNode Ptr, id As Long) As BOOLDim As LNode Ptr p=pHeadDim As Long i For i = 1 To id-1p = p-> _next Next iIf p = Null Then Return False End If Dim As LNode Ptr qq = pp = p-> _next q-> _next = p-> _next free(p)List_DeleteNode =True
End Function
拓展:获得链表长度函数的实现
遍历一遍,即可得出长度
Function List_GetLength(pHead As LNode Ptr) As Long Dim As LNode Ptr p=pHeadDim As Long ii = 0Do While p-> _next <> Nullp = p-> _next i=i+1Loop List_GetLength = i
End Function
总结
当然,这里还有很多功能我没有实现(比如find函数),特殊情况的判断也不全面,但原理都是一致的。希望广大fb爱好者能在我的基础上完善链表的操作,同时提高编程技术。
[数据结构]freebasic实现动态单链表相关推荐
- 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)
前言 C语言的指针真的很强大,万能指针更强大,可以指向任意类型的数据.在上篇博客 数据结构与算法:单链表(超详细实现)中用C语言实现了单链表的相关算法,不过却有局限性 只能针对某一种数据类型还是不够强 ...
- 数据结构与算法之单链表
数据结构与算法之单链表 //链表的实现/*实现单链表的 构建.数据添加.数据删除(返回元素所在位置).数据查找(返回元素所在的位置)的算法设计:*/ //链表的实现/*实现单链表的 构建.数据添加.数 ...
- 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)
数据结构上机测试2-1:单链表操作A Time Limit: 1000ms Memory limit: 4096K 有疑问?点这里^_^ 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头 ...
- 数据结构(二)——单链表的头插与尾插
一.引言 上篇文章我们知道了顺序表的缺点: 插入和删除操作需要移动大量元素. 数组的大小不好确定. 存储分配需要一整段连续的存储空间,不够灵活,造成很多碎片(空闲的空间得不到利用). 所以我们就引入了 ...
- 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)
数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...
- 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。
创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...
- 设计一代码,逆置带头结点的动态单链表L
有两种方法: 一是:用头插法建立单链表,自然而然就实现了逆置的动态链表. 代码: #include<stdio.h> #include<malloc.h> typedef in ...
- 数据结构与算法:单链表(超详细实现)
实现算法预览 这次博主写的单链表主要实现了以下算法.所有功能可进行循环运行测试.欢迎各位指正. LinkList.h #pragma once #ifndef __LINKLIST_H__ #defi ...
- 数据结构与算法之单链表(1)
在说头插法建立单链表之前,先补充几个知识点: 用typedef定义类型:意思就是可以用typedef声明新的类型名来代替已有的类型名. 例如: typedef struct { int month; ...
最新文章
- Ubuntu使用远程桌面
- 高性能JavaScript笔记三(编程实践)
- 【Linux】【服务器】 CentOS7下安装MySQL详细过程步骤
- how is our custom css style inserted to html
- Mongo客户端MongoVUE的基本使用
- [蓝桥杯历届试题] 欧拉与鸡蛋
- 蘑菇街2019校招题目总结
- .net测试学习--理解.net测试选项
- orb特征描述符 打开相机与图片物体匹配
- numpy数组某一行求和 python_【Python】No.2 Numpy和Matplotlib初体验
- 计算机字体颜色太浅,我的打印机打字太淡,如何调,打印的字就能够颜色
- 记录虚拟机安装黑苹果
- 听说你还在使用破解版Pycharm?
- 软件公司团队管理方法思考
- Docker Engine 安装时遇到的坑
- The Things Network LoRaWAN Stack V3 学习笔记
- 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)
- Android Studio笔记4.2 安卓触摸事件
- SX126x-数字接口SPI和控制功能
- 【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)