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

2,静态链表的结构体定义

1 #define MAX 100
2
3 typedef struct
4 {
5 int data; //数据域的类型可以是任意的基类型,包括数组
6 int cur;
7 }component, slinklist[MAX]

3,静态链表的初始化示意图

4,静态链表的操作集合,与单链表一致,均在头文件defs.h中。此头文件在前面文章中已经写出。

5,初始化操作的实现

 1 #include"defs.h"
2
3 void InitList(slinklist s)
4 {
5 int i;
6 L[MAX-1].cur = 0; //令链表头结点为空
7
8 for (i=0; i<MAX-2; i++) //其余元素构成备用链表
9 L[i].cur = i+1;
10 L[MAX-2].cur = 0; //备用链表最后一个元素置为空
11 }

InitList.c

6,静态链表撤销操作的实现,原理就是将链表从第一个元素至最后一个元素插入到备用链表第一个元素前

 1 #include"defs.h"
2
3 void DestroyList(slinklist s)
4 {
5 int i = L[MAX-1].cur;
6 L[MAX-1].cur = 0; //令头结点指向空
7
8 int k = L[0].cur;
9 L[0].cur = i; //令备用链表头结点指向链表第一个结点
10
11 int j; //用j来记录链表最后一个结点的位序
12 while (i)
13 {
14 j = i;
15 i = L[i].cur; //第i个结点的指针域为空,结束循环,j记录了最后一个结点
16 }
17 L[j].cur = k; //令链表最后一个结点指向备用链表第一个结点
18 }

DestroyList.c

7,静态链表清空操作和撤销操作是一致的。
8,判断空操作。ListEmpty.c

1 #include"defs.h"
2
3 int ListEmpty(slinklist s)
4 {
5 if (L[MAX-1].cur == 0)
6 return 0; //返回0代表为空
7 else
8 return 1; //非0代表不为空
9 }

ListEmpty.c

9,求链表长度操作.

 1 #include"defs.h"
2
3 int ListLength(slinklist s)
4 {
5 int i, j=0;
6 i = L[MAX-1].cur; //i指向第一个结点
7
8 while (i) //最后一个结点的指针域为空,结束循环
9 {
10 ++j;
11 i = L[i].cur;
12 }
13 return j;
14 }

ListLength.c

10,取元素操作.

 1 #include"defs.h"
2
3 int GetElem(slinklist s, int i, int *e)
4 {
5 int j=1, k = L[MAX-1].cur;
6 if (i<1 || i>ListLength(s)) //判断位置是否合理
7 exit(0);
8 while (k && j<i) //找到第i个位置
9 {
10 ++j;
11 k = L[k].cur;
12 }
13 *e = L[k].data;
14 return 0;
15 }

GetElem.c

11,查找元素操作实现.

 1 #include"defs.h"
2
3 int LocateElem(slinklist s, int e)
4 {
5 int i = L[MAX-1].cur;
6 int j = 0;
7 while (i)
8 {
9 ++j; //j作为计数器
10 if (L[i].data == e)
11 return j;
12 i = L[i].cur;
13 }
14 return 0;
15 }
16
17 //i仅是表示其元素的数组下标值,并不是位序

LocateElem.c

12,求前驱操作实现.

 1 #include"defs.h"
2
3 int PriorElem(slinklist L, int cur_e, int *pri_e)
4 {
5 int i = L[MAX-1].cur;
6 int j;
7 while (i)
8 {
9 j = L[i].cur;
10 if (j && L[j].data == cur_e)
11 {
12 *pri_e = L[i].data;
13 return 0;
14 }
15 i = j;
16 }
17 return 0;
18 }

PriorElem.c

13,求后继操作的实现

 1 #include"defs.h"
2
3 int NextElem(slinklist L, int cur_e, int *nex_e)
4 {
5 int i = L[MAX-1].cur;
6 int j;
7 while (i)
8 {
9 j = L[i].cur;
10 if (j && L[i].data == cur_e)
11 {
12 *nex_e = L[j].data;
13 return 0;
14 }
15 i = j;
16 }
17 return 0;
18 }

NextElem.c

14,Malloc函数实现

 1 //因为没有指针,没有动态分配函数,所以要自己实现
2
3 #include"defs.h"
4
5 int Malloc(slinklist L) //释放备用链表第一个结点
6 {
7 int i = L[0].cur;
8 if (i == 0) //备用链表为空,无法分配,退出
9 exit(0);
10 L[0].cur = L[i].cur; //备用链表头结点,指向备用链表第二个结点
11 return i;
12 }

15,Free函数实现

1 #include"defs.h"
2
3 void Free(slinklist L, int k) //将位置为k的空闲结点释放
4 { //即插入到备用链表第一个结点前
5 L[k].cur = L[0].cur;
6 L[0].cur = k;
7 }
8
9 //Malloc、Free均是对备用链表的操作

16,静态链表插入操作实现

 1 #include"defs.h"
2
3 int ListInsert(slinklist L, int i, int e)
4 {
5 int k = L[MAX-1].cur; //k指向第一个结点
6 int j = 1, m, s;
7
8 if (i<1 || i>ListLength(L)+1) //判断位置是否合理
9 exit(0);
10
11 while (k && j<i-1) //找到第i-1个位置
12 {
13 ++j;
14 k = L[k].cur;
15 }
16 m = L[k].cur; //m指向第i个位置
17
18 s = Malloc(L); //分配一个结点s
19 L[s].data = e;
20 L[s].cur = L[m].cur;
21 L[k].cur = s;
22 return 0;
23 }

ListInsert.c

17,静态链表删除操作的实现

 1 #include"defs.h"
2
3 int ListDelete(slinklist L, int i, int *e)
4 {
5 int k = L[MAX-1].cur;
6 int j = 1, m;
7 if (i<1 || i>ListLength(L)) //判断位置是否合理
8 exit(0);
9
10 while (k && j<i-1) //找到第i-1个位置
11 {
12 ++j;
13 k = L[k].cur;
14 }
15 m = L[k].cur; //m指向第i个位置
16 *e = L[m].data;
17 L[k].cur = L[m].cur;
18 Free(L, m); //将空闲结点m释放到备用链表中
19 }

ListDelete.c

18,遍历静态链表操作实现

 1 #include"defs.h"
2
3 void TravelList(slinklist L)
4 {
5 int j = 0;
6 int i = L[MAX-1].cur;
7
8 while (i)
9 {
10 ++j;
11 printf("第%d个结点为:%d\n", j, L[i].data);
12 i = L[i].cur;
13 }
14 }

TravelList.c

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

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

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

  2. 数据结构(C语言版)链表相关操作算法的代码实现

    这次实现的是带头结点的单链表的初始化.遍历.创建.插入.删除.判断链表是否为空.求链表长度函数,编译环境是vs2013. 其中插入和删除函数中循环的条件目前还不太明白. #include<ios ...

  3. 静态链表-C语言实现

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

  4. 静态链表 C语言描述

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

  5. 深入浅出数据结构C语言版(5)——链表的操作

    上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游 ...

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

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

  7. C语言提高 (6) 第六天 文件(续) 链表的操作

    1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...

  8. C语言之----面向对象的方法实现链表的操作

    1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序 ...

  9. 玩转C语言链表-链表各类操作详解

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个"头指针"变量,以head表示,它存放一个地址.该地址指向一个元素 ...

随机推荐

  1. Solon rpc 之 SocketD 协议 - 消息应答模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  2. 美业黑科技 ▏肌肤管家SkinRun V3S智能肌肤测试仪,实现“护肤”私人定制

    肌肤如同身体,也需要定时的"健康检查",但仅凭肉眼难以窥见深层的肌肤问题.而现在,肌肤管家SkinRun前沿黑科技护肤测试仪--SkinRun V3S便能帮助用户对症下药.肌肤管家 ...

  3. C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻

    这是道哥的第014篇原创 目录 一.前言 二.变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 5.1 指针变量自身的值 5.2 获取指针变量 ...

  4. (一)React Ant Design Pro + .Net5 WebApi:先搞定服务器,顺手装个Nginx

    腾讯云搞定服务器,具体过程就不赘述了,文档都有,咨询客服或者自行百度,体验一下过程. 一. 服务器 1. 云服务器 cvm 1核2G centos8.0 2. 域名注册 www.homejok.com ...

  5. CF76A Gift

    题目描述 有一个国家有N个城市和M条道路,这些道路可能连接相同的城市,也有可能两个城市之间有多条道路. 有一天,有一伙强盗占领了这个国家的所有的道路.他们要求国王献给他们礼物,进而根据礼物的多少而放弃 ...

  6. ORM动态表达式树查询

    前言 接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层. 业务层创建返回值模型的IQUERY后,再使用参数条件表达式.最后进行延迟查询. 代码实现 参数模型Demo ...

  7. 如何配置 Slf4j

    一,前言 日常开发中经常需要在控制台输出一些信息,如果这些东西不加管理,那么很容易就被输出信息淹没.幸好,我们有日志相关的库来帮助我们格式化控制台的输出. 这篇文章将介绍如何配置 Slf4j 及其具体 ...

  8. (11)-Python3之--os模块

    1.模块介绍 os模块是路径处理模块,它提供了多数操作系统的功能接口函数.当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件.目录打交道 ...

  9. 记一次Nginx反向代理500的排查记录

    今天公司项目遇到一个奇怪的问题,记录一下. 注: 数据已经过脱敏处理,未暴露公司具体的IP等数据. TLDR; 项目简单介绍 用 Vue + ElementUI 实现的后台项目(以下简称:a-proj ...

  10. 找出10000内的素数 CSP

    "Problem: To print in ascending order all primes less than 10000. Use an array of processes, SI ...