1.静态链表是在没有指针的编程语言里对链表的一种实现
2.主要是用数组模拟指针
3.在这里,使用结构体使数组的每一个空间可以存储一个数据元素(date)和一个游标(cur),游标的作用相当于链表的指针域,用于记录下一元素的下标是多少
4.在没有结构体(typedef)的语言中,也可以使用两个并行数组实现此功能

此种结构在编程中不一定能用得到,但是这种思想非常巧妙,非常值得我们学习,不多说,直接上代码,亲测可行,有详细注释

#include<stdio.h>

#define MAXSIZE 1000                //静态链表最大空间容量
typedef int ElemType; //数据类型
typedef int Status; //返回值类型
#define OK 1 //操作成功返回值
#define ERROR 0 //操作失败返回值 typedef struct //静态链表的结构体
{
ElemType date; //结点数据
int cur; //结点游标(相当于链表中的地址)
}StaticLinkList[MAXSIZE]; //表名 /*
静态链表的初始化
第一个位置space[0]的cur指向第一个没有数据的位置空间
最后一个位置space[MAXSIZE-1]的cur指向第一个有数据的位置空间,即头结点
*/
Status InitList(StaticLinkList space)
{
for(int i = ; i < MAXSIZE-; i++) //为数组中的每个位置的游标赋值
space[i].cur = i + ;
space[MAXSIZE-].cur = ; //使最后一个位置的游标为0
return OK;
} /*
模拟链表中的malloc函数,在数组中寻找空闲位置空间作为新结点
*/
int malloc_SLL(StaticLinkList space)
{
int i = space[].cur; //将备用链表的第一个结点位置赋值给i
if(space[].cur) //如果space[0].cur不是0,即备用链表非空
space[].cur = space[i].cur; //将备用链表的下一个空闲位置赋值给space[0]
return i;
} /*获得链表的长度*/
int ListLength(StaticLinkList L)
{
int i, l;
l = ; //记录链表长度
i = MAXSIZE - ; //获得头结点下标
i = L[i].cur; //获得头结点位置
while(i) //如果此下标 != 0
{
l++; //长度加1
i = L[i].cur; //下标后移
}
return l; //返回长度l
} /*
静态链表的插入操作
*/
Status InsertLinkList(StaticLinkList L, int i, ElemType e)
{
int j ,k, l;
k = MAXSIZE-; //获取头结点的下标
if(i < || i > ListLength(L)+) //判断要插入的位置是否合理
return ERROR;
j = malloc_SLL(L); //获得备用链表中的第一个位置下标
if(j) //如果此下标不是0,说明还有空间可用
{
L[j].date = e; //将此下标对应位置的数据域赋值为e
for(l = ; l < i; l++) //遍历链表,寻找i位置之前的结点
k = L[k].cur; //获得此结点的游标
L[j].cur = L[k].cur; //新结点的游标等于i-1位置的游标
L[k].cur = j; //i-1位置的游标等于新结点的游标
return OK; //操作成功
}
return ERROR; //操作失败
} /*模拟free()函数,将删除的结点空间加入备用空间*/
void free_SSL(StaticLinkList space, int i)
{
space[i].cur = space[].cur; //删除位置的游标等于0位置的游标
space[].cur = i; //0位置的游标等于当前结点
} /*静态链表的删除操作*/
Status DelLinkList(StaticLinkList L, int i)
{
int j, k;
if(i < || i > ListLength(L)+) //判断删除的位置是否合理
return ERROR;
k = MAXSIZE - ; //获得头结点的游标
for(j = ; j < i; j++) //寻找i位置
k = L[k].cur; //游标后移
j = L[k].cur; //将要删除的位置下标赋值给j
L[k].cur = L[j].cur; //使删除结点的前一结点的游标指向删除结点的游标
free_SSL(L, j); //释放删除的结点
return OK;
} /*静态链表的遍历操作*/
void PrintLinkList(StaticLinkList L)
{
int i;
int j = MAXSIZE - ; //获得数组最后一个位置的下标
j = L[j].cur; //获得此下标的游标值,即头结点的下标
// printf("长度为%d\n",ListLength(L));
for(i = ; i <= ListLength(L); i++) //遍历此表
{
printf("第%d个结点的数据是:%d\n", i, L[j].date); //输出每个结点的数据
j = L[j].cur; //获得下一结点的游标
}
} void main()
{
StaticLinkList L; //创建链表L
int i, e; //i为元素位置,e为元素内容 while(true)
{
printf("请选择对静态链表的操作:\n");
printf("1.初始化\n");
printf("2.插入\n");
printf("3.删除\n");
printf("4.输出\n");
printf("5.退出\n");
int a;
scanf("%d", &a);
switch(a)
{
case :
if(InitList(L))
printf("初始化成功\n");
else
printf("初始化失败\n");
break;
case :
printf("请输入需要插入的位置:");
scanf("%d", &i);
printf("请输入需要插入的元素:");
scanf("%d", &e);
if(InsertLinkList(L, i, e))
printf("插入成功\n");
else
printf("插入失败\n");
break;
case :
printf("请输入需要删除的位置:");
scanf("%d", &i);
if(DelLinkList(L, i))
printf("删除成功\n");
else
printf("删除失败\n");
break;
case :
PrintLinkList(L);
break;
case :
return;
default:
printf("选择错误\n");
break;
}
}
}

静态链表-C语言实现的更多相关文章

  1. 静态链表 C语言描述

    静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...

  2. 静态链表C语言数据结构

    静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...

  3. 使用C语言描述静态链表和动态链表

    静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...

  4. 数据结构6: 静态链表及C语言实现

    本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...

  5. C语言实现--静态链表的操作

    1,我们研究数据结构的操作,第一要弄懂它的结构体表示(也就是结构体特点).第二要清楚它的初始化和撤销过程.对于静态链表首先分析它的特点:一是采用静态存储方式,二是没有指针.静态链表就是不用指针来表示链 ...

  6. 【数据结构】单链表&&静态链表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...

  7. 静态链表过程演示及代码实现(A - B) U (B - A)

    静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为Elem ...

  8. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  9. java与数据结构(2)---java实现静态链表

    结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...

随机推荐

  1. 《吊打面试官》系列-Redis终章_凛冬将至、FPX_新王登基

    你知道的越多,你不知道的越多 点赞再看,养成习惯 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联 ...

  2. DOM增删改替换

    一.在创建元素的时候为什么要把创建元素到也页面写到后面?   要求:创建一个div,在div中创建10个span. var div = document.createElement("div ...

  3. html5 svg实现不规则形状图片触发事件

    html5 svg实现不规则形状图片触发事件<pre><!DOCTYPE html><html lang="en"> <head> ...

  4. 微软的分布式应用框架 Dapr

    微服务架构已成为构建云原生应用程序的标准,微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合和独立部署,但是这种方法的成本很高,需要了解和熟练掌握分布式系统.为了使用所有开发人员能够使用任何 ...

  5. 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

    本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

  6. Centos 6/7 常用命令总结 (基础)

    Centos 6/7 常用命令总结 (基础): 参考链接:https://www.cnblogs.com/linhaifeng/p/6045600.html 目录介绍: a) bin目录:用来存放常用 ...

  7. 树莓派debian配置lamp[解决Apache不显示php网页]

    Apache + MySql + Php. 1.安装Apache Apache可以用下面的命令来安装 sudo apt-get install apache2 Apache默认路径是/var/www/ ...

  8. 关于html与css的标签及属性(text文本属性、背景background属性、表格标签table、列表、)

    text文本属性1.颜色 colorcolor:red: 2.文本缩进text-indant属性值 num+px text-indant:10px:3.文本修饰 text-decoration属性值: ...

  9. spark和 mapreduce的比较

    网上查阅一些资料,收集整理如下: 1. 通用性 spark更加通用,spark提供了transformation和action这两大类的多个功能api,另外还有流式处理sparkstreaming模块 ...

  10. Redis 工具 redis-port 使用

    redis-port 是一个 Redis 工具,通过解析 rdb 文件,实现 Redis 主节点和从节点的数据同步.   摘要: 一个可以将redis主从集群,cluster上的数据实时迁移到 cod ...