C/C++ 单链表的游标实现(完整代码)
单链表的游标实现(数组)
不使用任何指针类型,利用游标实现单链表的基本操作
#include <iostream> using namespace std; using PtrToNode = int; using List = PtrToNode; using Position = PtrToNode; constexpr int SpaceSize = 10; struct Node { PtrToNode data; Position next; }; //使用全局的数组 Node CursorSpace[SpaceSize]; //初始化链表 void InitializeCursorSpace(); //为游标链表分配内存 static Position CursorAlloc(); //释放内存 static void CursorFree(const Position& p); //插入数据 void insert(const PtrToNode& data, Position P); //测试一个链表是否为空 bool empty(List L); //P是否是链表的末尾 bool Last(Position P); //返回表L中data的位置 Position Find(PtrToNode data, List L); //返回表中data的前一个位置 Position FindPrevNode(PtrToNode data, List L); //删除链表节点 void DeleteNode(PtrToNode data, List L); //删除链表 void DeleteList(List L); //遍历链表 void Travel(List L); int main() { InitializeCursorSpace(); Position L = CursorAlloc(); insert(1, L); insert(3, L); insert(5, L); Position L1 = CursorAlloc(); insert(2, L1); insert(4, L1); insert(6, L1); cout << empty(L1) << endl; Position pL = Find(5, L); Position pPrevL = FindPrevNode(5, L); //DeleteNode(4,L1); Travel(L); DeleteList(L1); return 0; } void InitializeCursorSpace() { for (int i = 0; i < SpaceSize; i++) { CursorSpace[i].data = 0; CursorSpace[i].next = (i + 1) % SpaceSize; } } static Position CursorAlloc() { Position p; p = CursorSpace[0].next; CursorSpace[0].next = CursorSpace[p].next; CursorSpace[p].next = 0; return p; } void insert(const PtrToNode& data, Position P) { Position tempCell; tempCell = CursorAlloc(); if (tempCell == 0) { cout << "Out of Space!\n"; } CursorSpace[tempCell].data = data; CursorSpace[tempCell].next = CursorSpace[P].next; CursorSpace[P].next = tempCell; } bool empty(List L) { return CursorSpace[L].next == 0; } bool Last(Position P) { return CursorSpace[P].next == 0; } Position Find(PtrToNode data, List L) { Position p; p = CursorSpace[L].next; while (p && CursorSpace[p].data != data) { p = CursorSpace[p].next; } return p; } Position FindPrevNode(PtrToNode data, List L) { Position p = L; Position tempCell = CursorSpace[p].next; while (CursorSpace[tempCell].data!=data && tempCell) { tempCell = CursorSpace[tempCell].next; p = CursorSpace[p].next; } return p; } void DeleteNode(PtrToNode data, List L) { Position p, tempCell; p = FindPrevNode(data, L); if (!Last(p)) { tempCell = CursorSpace[p].next; CursorSpace[p].next = CursorSpace[tempCell].next; //CursorFree(tempCell); } } void DeleteList(List L) { Position p = CursorSpace[L].next; Position tempCell = p; while (tempCell) { p = CursorSpace[p].next; CursorFree(tempCell); if (p == 0) { break; } tempCell = p; } CursorSpace[L].next = 0; } void Travel(List L) { Position p = CursorSpace[L].next; while (p) { cout << CursorSpace[p].data << " "; p = CursorSpace[p].next; } } static void CursorFree(const Position& p) { CursorSpace[p].next = CursorSpace[0].next; CursorSpace[p].data = 0; CursorSpace[0].next = p; }
本文来自博客园,作者:hugeYlh,转载请注明原文链接:https://www.cnblogs.com/helloylh/p/17209640.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)