(三)数据结构之静态链表

别说谁变了你拦得住时间么 提交于 2020-01-25 01:00:25

数据结构之静态链表

  • 什么是静态链表
  • 注意事项
  • 实际应用
  • 源码
  • ending

1. what is 静态链表

静态链表也是链表的一种。顾名思义,静态链表与可动态开辟存储空间的动态链表相对立,它占用一段连续的存储空间,并且静态链表的 “指针” 是用整型数字代表下标来表示的,并不是真正的指针。

2. 注意事项

  1. 它的存储空间大小是刚开始就决定好的,虽然在存储空间占满时可以按增量扩大空间,但仍是 相对“静态” 的。一般来讲以宏定义规定初始规模以及每次的空间增量。
#define MAXSIZE 1000
#define INCREASE 10 //根据情况自定义
  1. 静态链表中为了实际操作方便实际上同时存在着两个链表,一个是用户存入的数据链接的链表,一个是备用空间(只未被使用或者被删除的空间)链接得到的链表。每次插入元素时,从备用空间中拿出一个使用 。同理 删除元素时,同时将其加入备用空间中待用 。能够更好的管理静态链表。
  2. 如第二点所说,存储空间0号单元一般用来当作备用空间链表头节点,1号单元一般当作数据链表头节点,不用于存储数据

3. 实际应用

既然这么麻烦那么实际应用在什么情况?
首先我们得知道不是所有编程语言都有指针操作,所以在很多高级编程语言当中想要实现链表功能就需要用到静态链表。

4. 源码

#include<iostream>
#include<windows.h>
#include<memory>
using namespace std;
//----------------静态链表表示和实现--------------//


//  线性静态单链表的表示和实现
#define elemtype int
#define OK 0
#define MAXSIZE 1000
typedef struct {
    elemtype data;
    int iter; //指示下标,等效指针
} elem, StaticList[MAXSIZE]; //0是备用空间头节点,1是已用空间头节点
//  建立静态单链表L,通过输入向其中存储元素,再通过输入指定删除或者插入位置进行操作
void demo(StaticList &L, int &head, int &tail) //head表示L的头指针
{
    tail = head = 1;
    int head_ = 0, i; //备用空间链表头节点

    L[0].iter = 2;
    for (int var = 2; var < MAXSIZE - 1;) //  首先将全部节点链接到备用空间中
        L[var].iter = ++var;
    int num;
    cin >> num;
    for (i = 2; i < num + 2; ++i) { //  输入num个数据
        cin >> L[i].data;
        L[tail].iter = i;
        tail = i;
        L[0].iter = L[tail].iter; //    从备用空间中剔除
    }
    L[tail].iter = 0; //输入存储完成

    //  在第i个元素的位置插入e,假设num >= 3
    int pos, times, mark;
    cin >> i; //插入位置
    elemtype e;
    pos = L[0].iter; //从备用空间中取出一位
    L[pos].data = e;
    L[0].iter = L[L[0].iter].iter;
    for (mark = 1, times = 0; times < i - 1; ++times, mark = L[mark].iter) ; //定位到要插入的前一位
    int tmp_ = L[mark].iter;
    L[mark].iter = pos;
    L[pos].iter = tmp_;

    //  删除第i个位置的元素
    cin >> i; //删除位置,假设合法
    for (mark = 1, times = 0; times < i - 1; ++times, mark = L[mark].iter) ; //定位到要插入的前一位
    tmp_ = L[i].iter; //记录删除元素位置
    L[i].iter = L[L[i].iter].iter;
    pos = L[0].iter;    //记录备用空间第一位
    L[0].iter = tmp_;
    L[tmp_].iter = pos; //链接到备用空间
}
int main()
{
    //---------------------
    //  调用上述函数等操作
    //---------------------
    system("pause");
    return 0;
}

5. ending

之前对静态链表理解不是很深,甚至有点偏差,理清思路之后好多了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!