美文网首页
1.3 静态链表

1.3 静态链表

作者: 瓜尔佳Anthony | 来源:发表于2019-01-30 21:24 被阅读0次

静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。

使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间"一对一"的逻辑关系通过一个整形变量(称为"游标",和指针功能类似)维持(和链表类似)。

静态链表中,除了数据本身通过游标组成的链表外,还需要有一条连接各个空闲位置的链表,称为备用链表。

备用链表的作用是回收数组中未使用或之前使用过(目前未使用)的存储空间,留待后期使用。也就是说,静态链表使用数组申请的物理空间中,存有两个链表,一条连接数据,另一条连接数组中未使用的空间。

通常,备用链表的表头位于数组下标为 0(a[0]) 的位置,而数据链表的表头位于数组下标为 1(a[1])的位置。

静态链表中设置备用链表的好处是,可以清楚地知道数组中是否有空闲位置,以便数据链表添加新数据时使用。比如,若静态链表中数组下标为 0 的位置上存有数据,则证明数组已满。

静态链表的实现及基本操作

#include "stdafx.h"
#define SIZE 6

typedef struct {
    char data;
    int cursor;
}component;

//将结构体数组中所有分量链接到备用链表中
void reserveArr(component *array);
//初始化静态链表
int initArr(component *array);
//输出函数
void displayArr(component * array, int body);
//从备用链表上摘下空闲节点的函数
int mallocArr(component * array);

//初始化备用链表
void reserveArr(component *array) {
    for (int i = 0; i < SIZE; i++) {
        array[i].cursor = i + 1;
    }
    array[SIZE - 1].cursor = 0;
}

//从备用链表获取空间
int mallocArr(component *array) {
    int i = array[0].cursor; //获取第一个空闲节点的位置
    if (array[0].cursor) {
        array[0].cursor = array[i].cursor; //第一个空闲节点后移
    }
    return i;
}

//备用链表回收空间
void freeArr(component *array, int add) {
    array[add].cursor = array[0].cursor;
    array[0].cursor = add;
}

// 向静态链表赋值
int initArr(component *array) {
    reserveArr(array);
    int headPointer = mallocArr(array);
    int tailPointer = headPointer;
    for (int i = 1; i < 4; i++) {
        int j = mallocArr(array);
        array[tailPointer].cursor = j;
        array[j].data = 'a' + i - 1;
        tailPointer = j;
    }
    array[tailPointer].cursor = 0;
    return headPointer;
}

void displayArr(component * array, int pointer) {
    int tempPointer = pointer;
    while (array[tempPointer].cursor){
        printf("%c, %d \n", array[tempPointer].data, array[tempPointer].cursor);
        tempPointer = array[tempPointer].cursor;
    }
    printf("%c, %d \n", array[tempPointer].data, array[tempPointer].cursor);

}


//增
void insertArr(component * array, int headPointer, int add, char data) {
    int tempPointer = headPointer;
    for (int i = 1; i < add; i++) {
        tempPointer = array[tempPointer].cursor;
    }
    int insert = mallocArr(array);
    array[insert].cursor = array[tempPointer].cursor; 
    array[insert].data = data;
    array[tempPointer].cursor = insert;
}


//删
void deleteArr(component *array, int pointer, char a) {
    int tempPointer = pointer; 
    while (array[tempPointer].cursor) {
        tempPointer = array[tempPointer].cursor;
        if (tempPointer == 0) {
            printf("could not find this element in the chain\n");
            return;
        }
    }
    int del = tempPointer;
    tempPointer = pointer;
    while (array[tempPointer].cursor != del) {
        tempPointer = array[tempPointer].cursor;
    }
    array[tempPointer].cursor = array[del].cursor;
    freeArr(array, del);
}

//查
int selectElem(component *array, int pointer, char elem) {
    int tempPointer = pointer;
    while (array[tempPointer].cursor != 0) {
        if (array[tempPointer].data == elem) {
            return tempPointer;
        }
        tempPointer = array[tempPointer].cursor;
    }
    return -1;
}

//改
void amendElem(component * array, int pointer, char oldElem, char newElem) {
    int add = selectElem(array, pointer, oldElem);
    if (add == -1) {
        printf("could not find this element in the chain\n");
        return;
    }
    array[add].data = newElem;
}


int main() {
    component array[SIZE];
    int pointer = initArr(array);
    printf("静态链表:\n");
    displayArr(array, pointer);

    printf("在第3的位置上插入结点‘e’:\n");
    insertArr(array, pointer, 3, 'e');
    displayArr(array, pointer);

    printf("删除数据域为‘a’的结点:\n");
    deleteArr(array, pointer, 'a');
    displayArr(array, pointer);

    printf("查找数据域为‘e’的结点的位置:\n");
    int selectAdd = selectElem(array, pointer, 'e');
    printf("%d\n", selectAdd);

    printf("将结点数据域为‘e’改为‘h’:\n");
    amendElem(array, pointer, 'e', 'h');
    displayArr(array, pointer);

    return 0;
}

相关文章

  • 1.3 静态链表

    静态链表,也是线性存储结构的一种,它兼顾了顺序表和链表的优点于一身,可以看做是顺序表和链表的升级版。 使用静态链表...

  • 静态链表及C#实现

    静态链表 静态链表是用数组模拟动态链表。 静态链表结构描述 首先,静态链表使用数组来模拟动态链表。数组存放一个节点...

  • 线性表的静态链表

    静态链表定义 静态链表的增删

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • C语言实现静态链表

    静态链表(单链表的一种形式) 有时,也可以借用一维数组来描述线性链表,我们称这种链表为静态链表。 静态链表需要实现...

  • 动态链表与静态链表

    动态链表与静态链表 1. 静态链表 静态链表概述 从他的意义上讲,静态链表像是对没有指针的语言缺陷而产生这么一个补...

  • 数据结构(静态链表的基础操作)

    静态链表的基础操作的前提是已经成功创建静态链表的基础上 静态链表中添加元素 加入将元素4添加到上静态链表中第3个位...

  • [数据结构]第二章线性表(6)——静态链表

    静态链表 什么是静态链表? 定义一个静态链表 方法1: 方法2: 验证方法2的定义方法 基本操作 总结反思 源码 ...

  • 静态链表——数据结构预习

    其实一般有单链表的话,应该用不着静态链表。然而并不是什么编程语言都有指针,这时静态链表可以起到单链表的作用。静态链...

  • Java实现静态链表

    今天复习到静态链表。自己简单实现了静态链表的基本操作,记录一下

网友评论

      本文标题:1.3 静态链表

      本文链接:https://www.haomeiwen.com/subject/wzqhsqtx.html