前言

首先,感谢勇芳为我们提供了强大的编辑器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实现动态单链表相关推荐

  1. 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)

    前言 C语言的指针真的很强大,万能指针更强大,可以指向任意类型的数据.在上篇博客 数据结构与算法:单链表(超详细实现)中用C语言实现了单链表的相关算法,不过却有局限性 只能针对某一种数据类型还是不够强 ...

  2. 数据结构与算法之单链表

    数据结构与算法之单链表 //链表的实现/*实现单链表的 构建.数据添加.数据删除(返回元素所在位置).数据查找(返回元素所在的位置)的算法设计:*/ //链表的实现/*实现单链表的 构建.数据添加.数 ...

  3. 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000ms   Memory limit: 4096K  有疑问?点这里^_^ 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头 ...

  4. 数据结构(二)——单链表的头插与尾插

    一.引言 上篇文章我们知道了顺序表的缺点: 插入和删除操作需要移动大量元素. 数组的大小不好确定. 存储分配需要一整段连续的存储空间,不够灵活,造成很多碎片(空闲的空间得不到利用). 所以我们就引入了 ...

  5. 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)

    数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...

  6. 已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值x为的结点插入到表L中,使L仍然有序。

    创建链表,main函数中通过while循环找出该插入的位置,插入.应注意L头节点位置的变化,利用一个ptr来记录L的头节点. /*已知带头结点的动态单链表L中的结点是按整数值递增排列的,试写一算法将值 ...

  7. 设计一代码,逆置带头结点的动态单链表L

    有两种方法: 一是:用头插法建立单链表,自然而然就实现了逆置的动态链表. 代码: #include<stdio.h> #include<malloc.h> typedef in ...

  8. 数据结构与算法:单链表(超详细实现)

    实现算法预览 这次博主写的单链表主要实现了以下算法.所有功能可进行循环运行测试.欢迎各位指正. LinkList.h #pragma once #ifndef __LINKLIST_H__ #defi ...

  9. 数据结构与算法之单链表(1)

    在说头插法建立单链表之前,先补充几个知识点: 用typedef定义类型:意思就是可以用typedef声明新的类型名来代替已有的类型名. 例如: typedef struct { int month; ...

最新文章

  1. Ubuntu使用远程桌面
  2. 高性能JavaScript笔记三(编程实践)
  3. 【Linux】【服务器】 CentOS7下安装MySQL详细过程步骤
  4. how is our custom css style inserted to html
  5. Mongo客户端MongoVUE的基本使用
  6. [蓝桥杯历届试题] 欧拉与鸡蛋
  7. 蘑菇街2019校招题目总结
  8. .net测试学习--理解.net测试选项
  9. orb特征描述符 打开相机与图片物体匹配
  10. numpy数组某一行求和 python_【Python】No.2 Numpy和Matplotlib初体验
  11. 计算机字体颜色太浅,我的打印机打字太淡,如何调,打印的字就能够颜色
  12. 记录虚拟机安装黑苹果
  13. 听说你还在使用破解版Pycharm?
  14. 软件公司团队管理方法思考
  15. Docker Engine 安装时遇到的坑
  16. The Things Network LoRaWAN Stack V3 学习笔记
  17. 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)
  18. Android Studio笔记4.2 安卓触摸事件
  19. SX126x-数字接口SPI和控制功能
  20. 【办公类-22-02】周计划系列(2)-生成“主题知识”(提取旧docx指定段落的内容,写入EXCLE模板,再次生成新docx)

热门文章

  1. ensp,交换机端口聚合——网络工程
  2. 清新雅致述职报告PPT模板
  3. c语言编程题兔子产子问题,C语言兔子产子问题
  4. 光纤通道光模块与以太网光模块区别
  5. R语言xcms处理质谱数据
  6. Java基础之02 动态代理模式172 173 类加载器原理分析
  7. 安全性测试:以用户登录为例
  8. python之父guido-Python之父Guido谈Python的未来
  9. oracle中取反_mysql 取反
  10. 普朗克定律:不同温度下黑体的光谱辐射强度按波长分布的规律Matlab画图