数据结构 静态链表

数据结构 静态链表做一个豁达而努力的自己 静态链表的定义 用数组来代替指针数组元素 由 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 接口学习

    你应该知道接口是一种契约,它与实现方式无关但是类,即使是抽象类,你都能自定义成员变量,而成员变量往往就与实现方式有关。这一点的实际意义不大。但是有一点,类会暴露太多不必要,甚至不能暴露的东西,你

    2021年12月22日
    50
  • Java中常见的类加载器及双亲委派机制的原理

    相信不少的同学在面试的时候会被问到一个词:双亲委派,懂得同学懂,不懂的同学可能会尴尬一笑,那么今天咱们就来聊聊这个问题的原理,首先我们需要了解一下java中常见的几种类加载器。一、Java中常见的类加载器1.BootstrapClassLoader纯C++实现的类加载器,没有对应的Java类,主要加载的是jre/lib/目录下的核心库2.ExtClassLoader类的全名是…

    2022年4月9日
    32
  • 下列python语句的输出结果是print_下列 Python语句的输出结果是「建议收藏」

    下列python语句的输出结果是print_下列 Python语句的输出结果是「建议收藏」【填空题】遍历输出文件所有行。f=open(“d:\\r2.txt”,”r”)whileTrue:str=print(str,end=”)ifnotstr:breakf.close()【填空题】Pyhon语句序列”s1=’redhat’;print(str.upper(s1))”的运行结果是?【单选题】下列语句中,()在Python中是非法的。【单选题】执…

    2025年6月16日
    2
  • 优化算法——人工蜂群算法(ABC)

    优化算法——人工蜂群算法(ABC)一、人工蜂群算法的介绍人工蜂群算法(ArtificialBeeColony,ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化算法,其直观背景来源于蜂群的采蜜行为,蜜蜂根据各自的分工进行不同的活动,并实现蜂群信息的共享和交流,从而找到问题的最优解。人工蜂群算法属于群智能算法的一种。二、人工蜂群算法的原理1、原理标准的ABC算法通过模拟

    2022年5月23日
    245
  • height:100%失败

    height:100%失败

    2022年1月1日
    41
  • php 中使用cURL发送get/post请求,上传图片,批处理

    php 中使用cURL发送get/post请求,上传图片,批处理

    2021年10月29日
    39

发表回复

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

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