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. 微信小程序项目转换为uni-app项目

    一.它是谁? [miniprogram-to-uniapp]转换微信小程序"项目为uni-app项目.原则上混淆过的项目,也可以进转换,因为关键字丢失,不一定会完美. 二.它的原理是什么? ...

  2. update 表名 set 某列名=now() where user in('user1','user2','user3');

    update 表名  set 某列名=now() where user in('user1','user2','user3');

  3. 【Linux】NFS搭建及使用详解

    环境:CentOS release 6.8 server  192.168.25.100 client1 192.168.25.101 client2 192.168.25.102 1.服务端操作 1 ...

  4. 【Python】在CentOS6.8中安装pip9.0.1和setuptools33.1

    wget https://bootstrap.pypa.io/ez_setup.py python ez_setup.py install --如果这个文件安装需要下载的文件无法下载的话,手动下载,放 ...

  5. 转发:[服务器]SSL安装证书教程

    [服务器]SSL安装证书教程   来自阿里云教程 Tomcat服务器安装SSL证书 安装PFX格式证书 https://help.aliyun.com/document_detail/98576.ht ...

  6. LeetCode938. 二叉搜索树的范围和

    题目 1 class Solution { 2 public: 3 int sum = 0; 4 int rangeSumBST(TreeNode* root, int low, int high) ...

  7. Netty学习:伪共享

    目录 Netty中的伪共享 伪共享的原理以及介绍 Netty中的伪共享 先说为什么知道这个概念吧,期初看Netty源码的时候,看到了NioEventLoop的构建,其中有这么一句代码: private ...

  8. window安装nvm

    先说一下背景,最近做的两个项目一个是祖传angularjs1.X版本另一个是react hooks结合tailwindcss,前者angularjs的node版本比较低,而tailwindcss的no ...

  9. 每月一更的《HelloGitHub》第 58 期,来啦!

    HelloGitHub 分享 GitHub 上有趣.入门级的开源项目.欢迎大家: 贡献代码 宣传你觉得优秀的项目 Star 项目️ 本月刊是每月 28 号更新,再见月刊就是年后了.在这里提前祝大家:新 ...

  10. kubernetes用户权限管理工具permission-manager

    Permission Manager Permission Manager是一个为Kubernetes RBAC和用户管理提供Web UI的项目,为Kubernetes权限管理提供友好的可视化界面. ...