数据结构 静态链表

数据结构 静态链表做一个豁达而努力的自己 静态链表的定义 用数组来代替指针数组元素 由 data 和 cur 组成 data 为数据域 cur 代替 next 指针存放的是下一个后继节点的下标 称 cur 为游标 用数组描述的链表成为静态链表 顺序表的静态链表存储结构 defineMAXSIZ nbsp nbsp 这里必须加结构体名称 不加的话只能在主函数声明一个结构体数组 不能在其它函数参

做一个豁达而努力的自己。

静态链表的定义:用数组来代替指针数组元素,由data和cur组成,data为数据域,cur代替next指针存放的是下一个后继节点的下标,称cur为游标,用数组描述的链表成为静态链表。

顺序表的静态链表存储结构:

#define MAXSIZE 1000

typedef struct Node    //这里必须加结构体名称,不加的话只能在主函数声明一个结构体数组,不能在其它函数参数里声明

{

    ElemType data;

    int cur;

}StaticLinkList[MAXSIZE];    

要点:数组的第一个元素和最后一个元素作为特殊元素处理,不存放数据;我们把未使用过的元素称为备用链表;数组第一个元素的cur存放的则是备用链表第一个节点的下标,最后一个元素则存放的是第一个有数值元素的下标,相当于头结点。

静态链表的优缺点:优点是在插入和删除时,自己只需要修改游标,,,缺点是没能解决连续分配空间带来表长难确定,失去了随机存取的特性。

代码:

#include <iostream> #include <cstdlib> using namespace std; #define MAXSIZE 1000 typedef struct Node { int data; //数据域 int cur; //游标 }StaticLinkList[MAXSIZE]; //静态链表的初始化 void InitList(StaticLinkList space) { int i; for(i = 0; i < MAXSIZE - 1; i++) space[i].cur = i + 1; space[MAXSIZE - 1].cur = 0; //个人觉得这里完全可以改为1,因为创建的时候也是要改为1的,,, } //静态链表的创建 void CreateLink(StaticLinkList space) { int n, mov; mov = MAXSIZE - 1; space[mov].cur = 1; cout << "请输入元素个数:"; cin >> n; cout << "输入int型数据:" << endl; while(n--) { mov = space[mov].cur; cin >> space[mov].data; } space[0].cur = space[mov].cur; space[mov].cur = 0; } //静态链表的输出 void PutList(StaticLinkList space) { int mov; mov = MAXSIZE - 1; while(space[mov].cur) { mov = space[mov].cur; cout << space[mov].data << endl; } } //为静态链表分配备用空间 int MallocspaceList(StaticLinkList space) { int i; i = space[0].cur; if(space[0].cur) space[0].cur = space[i].cur; return i; } //静态链表的长度 int LengthList(StaticLinkList space) { int mov, i; mov = MAXSIZE - 1; i = 0; while(space[mov].cur) { mov = space[mov].cur; i++; } return i; } //静态链表的插入 bool InsertList(StaticLinkList space, int i, int e) { if(i < 1 || i > LengthList(space)) return false; int n, mov; mov = MAXSIZE - 1; n = MallocspaceList(space); if(n) { space[n].data = e; for(int j = 1; j < i; j++) mov = space[mov].cur; space[n].cur = space[mov].cur; space[mov].cur = n; } return true; } //为静态链表释放节点 void FreeList(StaticLinkList space, int n) { space[n].cur = space[0].cur; //将第一个备用节点连接到释放节点的后面 space[0].cur = n; //数组第一个元素的cur存放要释放节点的下标 } //静态链表的删除 bool DeleteList(StaticLinkList space, int i) { if(i < 1 || i > LengthList(space)) return false; int mov, n; mov = MAXSIZE - 1; for(int j = 1; j < i; j++) mov = space[mov].cur; n = space[mov].cur; //获取删除节点的下标 space[mov].cur = space[n].cur; //将要删除的节点的前一个与后一个节点连接起来 FreeList(space, n); //释放节点 return true; } //静态链表的读取 bool GetList(StaticLinkList space, int i, int &e) { if(i < 1 || i > LengthList(space)) return false; int mov; mov = MAXSIZE - 1; for(int j = 1; j <= i; j++) mov = space[mov].cur; e = space[mov].data; return true; } //菜单 void menu() { cout << "1.静态链表的初始化" <<endl; cout << "2.静态链表的创建" <<endl; cout << "3.静态链表当前的长度" <<endl; cout << "4.静态链表的读取" <<endl; cout << "5.静态链表的插入" <<endl; cout << "6.静态链表的删除" <<endl; cout << "7.静态链表的输出" <<endl; cout << "0.退出静态链表" <<endl; } int main() { StaticLinkList space; int i, e, n, num = -1; while(num) { system("cls"); menu(); cout << "请输入选项:"; cin >> num; switch(num) { case 1: InitList(space); cout << "初始化成功" << endl; break; case 2: CreateLink(space); cout << "创建成功" << endl; break; case 3: cout << "当前静态链表的长度为:" << LengthList(space) << endl; break; case 4: cout << "请输入要读取的位置:"; cin >> i; n = GetList(space, i, e); if(n == 0) cout << "读取失败" << endl; else cout << "数据为:" << e << endl; break; case 5: cout << "请输入要插入的位置:"; cin >> i; cout << "请输入要插入的int型元素:"; cin >> e; n = InsertList(space, i, e); if(n == 0) cout << "插入失败" << endl; else cout << "插入成功" << endl; break; case 6: cout << "请输入要删除的位置:"; cin >> i; n == DeleteList(space, i); if(n == 0) cout << "删除失败" << endl; else cout << "删除成功" << endl; break; case 7: cout << "数据元素:" << endl; PutList(space); case 0: break; default : cout << "没有所选项" << endl; } system("pause"); } return 0; } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ICEM对装配体进行网格划分实例「建议收藏」

    ICEM对装配体进行网格划分实例「建议收藏」1.建立简单的装配体,保存为stp格式注:solidworks2016开始无法打开或保存为其他格式(igs,stp).从某一个网页上看到的攻略可以了(衷心感谢)注册表HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer:建立一个RemappedElevatedProxiesPolicy,并赋值为1.然后点开安装包

    2022年5月9日
    194
  • directshow使用说明_ug对电脑的配置要求

    directshow使用说明_ug对电脑的配置要求另外,DirectX9.0c已经将DShow分离出去了,下载时请选DirectX9.0b或者一下再是配置DirectShow的VC开发环境一.第一步,设置INCLUDE及LIB目录 在把dxsdk中提供的baseclass编译通过后,用四种方式编译,会分别生成四个lib,一般只用到了 其中的Debug和Release文件,在tool|option|vc++dir

    2022年10月11日
    3
  • asp语法教程_如何编程

    asp语法教程_如何编程ASP编程基本语句(一)Access+asp编制网站是属于动态网站,是通过把要编制的内容写入数据库里,在通过读取数据库的内容显示出来,学习目的:学会数据库的基本操作。数据库的基本操作无非是:查询记

    2022年8月6日
    10
  • 堆积柱形图_excel堆叠图分层怎么做

    堆积柱形图_excel堆叠图分层怎么做今天我们用reportservice开发堆积图,先上个图,见上方。1.新建rdlc文件,工具箱图片,新建一个图标类型(三维堆积圆柱图),然后把三维效果去掉就0了。2.绑定数据源(事先最好新建一个x

    2022年8月2日
    4
  • Python自动化运维之路-01

    Python自动化运维之路-01python的主要应用python的擅长领域学python有没有前途?python的语言排名语言选择运维会了开发后可以干什么?python的最大优势就是什么都能做。课程概述毕业目标周五

    2022年7月4日
    27
  • Jedis 连接Redis 集群[通俗易懂]

    Jedis 连接Redis 集群[通俗易懂]1.Jedis实现了连接Redis集群的操作,但是操作Redis集群的API是JedisCluster,和单机版api不一致(Jedis);2.创建JedisCluster需要一个Set集合,Set集合的每一个元素是HostAndPort;JedisCluster实际上可以根据一个节点的IP和端口号自动发现集群中的其它节点;代码:packagecom.etoak;importredis.clients.jedis.HostAndPort;importredis.client

    2025年10月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号