C语言实现--静态链表的操作
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语言实现--静态链表的操作的更多相关文章
- 使用C语言描述静态链表和动态链表
静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链 ...
- 数据结构(C语言版)链表相关操作算法的代码实现
这次实现的是带头结点的单链表的初始化.遍历.创建.插入.删除.判断链表是否为空.求链表长度函数,编译环境是vs2013. 其中插入和删除函数中循环的条件目前还不太明白. #include<ios ...
- 静态链表-C语言实现
1.静态链表是在没有指针的编程语言里对链表的一种实现2.主要是用数组模拟指针3.在这里,使用结构体使数组的每一个空间可以存储一个数据元素(date)和一个游标(cur),游标的作用相当于链表的指针域, ...
- 静态链表 C语言描述
静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4. ...
- 深入浅出数据结构C语言版(5)——链表的操作
上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游 ...
- 数据结构6: 静态链表及C语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
- C语言提高 (6) 第六天 文件(续) 链表的操作
1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...
- C语言之----面向对象的方法实现链表的操作
1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序 ...
- 玩转C语言链表-链表各类操作详解
链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个"头指针"变量,以head表示,它存放一个地址.该地址指向一个元素 ...
随机推荐
- Vue css过渡 和 js 钩子过渡
css过渡 <transition name="slide"> <div v-show="!showChatInput" class=&quo ...
- leetcode-222完全二叉树的节点个数
题目 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置. ...
- 在CentOS上安装Singularity高性能容器
什么是singularity容器 Singularity是劳伦斯伯克利国家实验室专门为大规模.跨节点HPC和DL工作负载而开发的容器化技术.具备轻量级.快速部署.方便迁移等诸多优势,且支持从Docke ...
- QA职责
- 【Oracle】Script to Collect DRM Information (drmdiag.sql) (文档 ID 1492990.1)
脚本对应如下: The following (drmdiag.sql) is a script to collect information related to DRM (Dyanamic Reso ...
- Electron小白入门自学笔记(一)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14297176.html 一.从Hello Electron开始 创建一个空的文件夹, ...
- 洛谷P1198 [JSOI2008]最大数(线段树/单调栈)
题目链接: https://www.luogu.org/problemnew/show/P1198 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询 ...
- hive窗口函数/分析函数详细剖析
hive窗口函数/分析函数 在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时 ...
- Dubbo中的统一契约是如何实现的?
写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...
- 2020 CSP&NOIP 游记
CSP初赛 CSP初赛 Day -1 早上打了模拟赛,T2寒假正好做过,然而还是还是被踩Orz,郑外NB!.中午出校吃了大盘鸡和拉面,还带回来了三瓶可乐. 初赛知识点看了两页不(看)想(不)看(懂)了 ...