静态链表的C实现(基于数据结构 严蔚敏)
静态链表是利用一维数组实现逻辑上的单链表结构,结点的逻辑上相邻但物理位置上不一定相邻,因为内存分配上是一次性的,故称为静态。
特点:
- 预先需要一片连续的存储空间;
- 非随机存取;
- 无现成的“内存”分配和回收函数,得自己实现;
- 最多存储MAXSIZE - 1个数据;
核心包含了两个链表:
- 数据链表(初始化完成后需记住头结点,一般为数组的第1个分量)
- 备用的空闲链表(数组的第0个分量是备用链表的头结点)
- 注意逻辑位序和物理位序,实际上并没有利用物理位序的使用操作,牢牢记住它只是一个单链表
这两个链表都需要自己维护。
核心函数 :
- "内存"申请函数 int Malloc_SL();该函数返回申请的结点下标。
- "内存"释放函数void Free_SL(int k);释放逻辑位序k。
注意函数:
- void InitSpace_SL();该函数初始化链表空间,不做其他操作;
- int InitList_SL(SLinkList *h);该函数初始化数据链表并返回数据链表的头结点,这个头结点h非常重要,书本上没有这个函数的介绍,导致有些人搞不懂对数据链表的操作该如何进;
Status.h文件
- #ifndef STSTUS_H
- #define STSTUS_H
- #define TRUE 1 //真
- #define FALSE 0 //假
- #define YES 1 //是
- #define NO 0 //否
- #define OK 1 //通过
- #define ERROR 0 //错误
- #define SUCCESS 1 //成功
- #define UNSUCCESS 0 //失败
- #define INFEASIBLE -1 //不可行
- #define OVERFLOW -2 //堆栈上溢
- #define UNDERFLOW -3 //堆栈下溢
- typedef int Status;
- #define PressEnter \
- {\
- fflush(stdin);\
- printf("Press Enter...");\
- getchar();\
- fflush(stdin);\
- }
- #endif
StaticLinkedList.h文件
- #ifndef STATICLINKEDLIST_H_
- #define STATICLINKEDLIST_H_
- #include "Status.h"
- #define MAXSIZE 30
- typedef int ElementType;
- typedef int SLinkList;
- typedef struct
- {
- ElementType data;
- int cur;
- }Component[MAXSIZE];
- //初始化,将一维数组Space中各分量链成一个大的备用空间
- void InitSpace_SL();
- //为插入的输入申请空间,从备用空间取得一个结点,返回分配结点下标
- int Malloc_SL();
- //将下标为k的空闲结点回收
- void Free_SL(int k);
- //初始化静态链表,建立头结点,返回头结点下标
- int InitList_SL(SLinkList *h);
- //置空
- Status ClearList_SL(SLinkList h);
- //销毁
- void DestroyList_SL(SLinkList* h);
- //判空
- Status ListEmpty_SL(SLinkList h);
- //求长
- int ListLength_SL(SLinkList h);
- //取值
- //h--头结点,i--逻辑位置(1->maxsize-2),e--返回值
- Status GetElem_SL(SLinkList h, int i, ElementType* e);
- //返回元素e的位序
- int LocateElem_SL(SLinkList h, ElementType e);
- //前驱
- //找值为cur_e的结点的前一个结点的值
- Status PriorElem_SL(SLinkList h, ElementType cur_e, ElementType* pre_e);
- //后继
- Status NextElem_SL(SLinkList h, ElementType cur_e, ElementType* next_e);
- //插入
- //在逻辑上第i个位置前插入数据,使其成为第i个位置
- //i从1开始
- Status ListInsert_SL(SLinkList h, int i, ElementType e);
- //删除
- Status ListDelete_SL(SLinkList h, int i, ElementType* e);
- //遍历
- Status ListTraverse_SL(SLinkList h, void(Visit)(ElementType));
- #endif
StaticLinkedList.cpp文件
- #include "stdafx.h"
- #include <cstdlib>
- #include "StaticLinkedList.h"
- //定义静态链表空间
- Component Space;
- void InitSpace_SL()
- { //初始化备用空间,形成备用链表
- for (size_t i = ; i < MAXSIZE - ; ++i) //将0号单元做备用空间的起始结点
- {
- Space[i].cur = i + ; //各空间结点逻辑上首尾相连
- }
- Space[MAXSIZE - ].cur = ; //最后一个结点下标指向NULL = 0,相当于链表的尾指针
- }
- int Malloc_SL()
- {
- int i = Space[].cur;
- if (Space[].cur)
- {
- //将申请到的空间从备用链表空间中断开,并为下一个空闲结点做准备,即将下一个空闲结点链接到s[0]下
- Space[].cur = Space[i].cur;
- return i; //返回申请到的空间下标
- }
- return ; //申请失败返回0
- }
- void Free_SL(int k)
- {
- Space[k].cur = Space[].cur; //将k结点的下个结点置为备用链表的第一个结点
- Space[].cur = k; //将K结点置为备用空间的第一个结点
- }
- 38 int InitList_SL(SLinkList * h)
- 39 {
- 40 *h = Malloc_SL(); //创建头结点
- 41 if (!(*h))
- 42 {
- 43 exit(OVERFLOW); //空间已满
- 44 }
- 45
- 46 Space[*h].cur = 0; //头结点游标置为0
- 47 return OK;
- 48 }
- Status ClearList_SL(SLinkList h)
- {
- int p;
- if (!h)
- {
- return ERROR;
- }
- p = Space[h].cur; //p指向第一个结点
- while (p)
- {
- Space[h].cur = Space[p].cur; //从数据链表首结点开始删除
- Free_SL(p);
- p = Space[h].cur;
- }
- return OK;
- }
- void DestroyList_SL(SLinkList * h)
- {
- ClearList_SL(*h);
- Free_SL(*h); //释放头结点
- *h = ;
- }
- Status ListEmpty_SL(SLinkList h)
- {
- if (h && !Space[h].cur)
- {
- return TRUE;
- }
- return FALSE;
- }
- int ListLength_SL(SLinkList h)
- {
- if (!h)
- {
- exit(OVERFLOW);
- }
- int count, p;
- count = ;
- p = Space[h].cur;
- while (p)
- {
- count++;
- p = Space[p].cur;
- }
- return count;
- }
- Status GetElem_SL(SLinkList h, int i, ElementType * e)
- {
- //-2 去掉备用头结点和数组溢出两个
- if (!h || i < || i > MAXSIZE - )
- {
- return ERROR;
- }
- int count, p;
- count = ;
- p = Space[h].cur;
- while (p)
- {
- count++; //先++,从第一个逻辑位置开始,count很重要,寻找操作都需要count计数
- if (count == i)
- {
- *e = Space[p].data;
- return OK;
- }
- p = Space[p].cur;
- }
- return ERROR;
- }
- int LocateElem_SL(SLinkList h, ElementType e)
- {
- int k, count;
- count = ;
- if (h && Space[h].cur) //不为空表
- {
- k = Space[h].cur;
- while (k && Space[k].data != e)
- {
- count++;
- k = Space[k].cur;
- }
- if (k)
- {
- return count;
- }
- }
- return ;
- }
- Status PriorElem_SL(SLinkList h, ElementType cur_e, ElementType * pre_e)
- {
- int p, q;
- if (h)
- {
- p = Space[h].cur;
- if (p && Space[p].data != cur_e)
- {
- q = Space[p].cur;
- while (q && Space[q].data != cur_e)
- {
- p = q; //用p记住前驱
- q = Space[q].cur;
- }
- if (q)
- {
- *pre_e = Space[q].data;
- return OK;
- }
- }
- }
- return ERROR;
- }
- Status NextElem_SL(SLinkList h, ElementType cur_e, ElementType * next_e)
- {
- int p;
- if (h)
- {
- p = Space[h].cur;
- if (p && Space[p].data != cur_e)
- {
- p = Space[p].cur;
- if (p && Space[p].cur)
- {
- p = Space[p].cur;
- *next_e = Space[p].data;
- return OK;
- }
- }
- }
- return ERROR;
- }
- Status ListInsert_SL(SLinkList h, int i, ElementType e)
- {
- if (!h)
- {
- return ERROR;
- }
- int count, k, p;
- if (i > ) //
- {
- count = ;
- k = h;
- while (k && count < i - ) //找到逻辑插入位置的前一个位置
- {
- count++;
- k = Space[k].cur;
- }
- if (k) //找到第i-1个元素位置
- {
- p = Malloc_SL();
- if (!p)
- {
- return ERROR;
- }
- Space[p].data = e;
- Space[p].cur = Space[k].cur;
- Space[k].cur = p;
- return OK;
- }
- }
- return ERROR;
- }
- Status ListDelete_SL(SLinkList h, int i, ElementType * e)
- {
- if (!h)
- {
- return ERROR;
- }
- int count, k, p;
- if (i > )
- {
- count = ;
- k = h;
- while (k && count < i -) //找到删除位置的前一个位置
- {
- count++;
- k = Space[k].cur;
- }
- if (k && Space[k].cur) //找到第i-1个元素却不是尾结点
- {
- p = Space[k].cur; //p指向第i结点
- *e = Space[p].data;
- Space[k].cur = Space[p].cur;
- Free_SL(p);
- return OK;
- }
- }
- return ERROR;
- }
- Status ListTraverse_SL(SLinkList h, void(Visit)(ElementType))
- {
- if (!h)
- {
- return ERROR;
- }
- int p = Space[h].cur;
- while (p)
- {
- Visit(Space[p].data);
- p = Space[p].cur;
- }
- return OK;
- }
Main函数
- void PrintElem(ElementType e)
- {
- printf("%d ", e);
- }
- int main()
- {
- SLinkList h; //数据链表头结点,全局
- ElementType e;
- int i;
- printf("初始化静态链表的备用空间Space....");
- InitSpace_SL();
- printf("\n");
- PressEnter;
- printf("初始化静态链表头结点H,申请空间....");
- InitList_SL(&h);
- printf("\n");
- PressEnter;
- ListEmpty_SL(h) ? printf("h为空!\n") : printf("h不为空!\n");
- printf("\n");
- PressEnter;
- for (size_t j = ; j < ; ++j)
- {
- printf("在h第%d个位置插入%d\n", j, * j);
- ListInsert_SL(h, j, * j);
- printf("\n");
- }
- printf("h中的元素为:h=");
- ListTraverse_SL(h, PrintElem);
- printf("\n");
- PressEnter;
- printf("h的长度为%d\n", ListLength_SL(h));
- printf("\n");
- PressEnter;
- ListDelete_SL(h, , &e);
- printf("删除h中第 4 个元素 %d,用Free_SL释放空间....", e);
- printf("\n");
- PressEnter;
- printf("删除后h中的元素为:h=");
- ListTraverse_SL(h, PrintElem);
- printf("\n");
- PressEnter;
- printf("元素8在h中的位序为%d\n",LocateElem_SL(h,));
- printf("\n");
- printf("清空h前:");
- ListEmpty_SL(h) ? printf("h为空!\n") : printf("h不为空!\n");
- ClearList_SL(h);
- printf("清空h后:");
- ListEmpty_SL(h) ? printf("h为空!\n") : printf("h不为空!\n");
- printf("\n");
- PressEnter;
- printf("销毁h前:");
- h ? printf("h存在!\n") : printf("h不存在!\n");
- DestroyList_SL(&h);
- printf("销毁h后:");
- h ? printf("h存在!\n") : printf("h不存在!\n");
- printf("\n");
- PressEnter;
- return ;
- }
静态链表的C实现(基于数据结构 严蔚敏)的更多相关文章
- [数据结构]严蔚敏版(C数据结构)配套实现程序111例
以下为根据严蔚敏版数据结构的示例和概念实现的程序 目录 一.严蔚敏版(C数据结构)配套实现程序111例 1.数组与字符串 2.栈与队列 3.链表LinkList 4.树与二叉树 5.排序相关算法 6. ...
- 基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过
白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B ...
- 【Java】 大话数据结构(3) 线性表之静态链表
本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...
- 【数据结构】单链表&&静态链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 单链表(Singly Linked List ) 1.1 什么是单链表? 单链表是一种链式存储的结构.它动态的为节点分配存 ...
- Java数据结构-线性表之静态链表
静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...
- java与数据结构(2)---java实现静态链表
结点类 1 //结点类 2 class Node<T> { 3 private T data; 4 private int cursor; 5 6 Node(T data, int cur ...
- 静态链表C语言数据结构
静态链表就是将数组实现单链表: int Malloc_SLL(StaticLinkList space) { int i = space[0].cur;//取得第一个头节点的下标 if( space[ ...
- 数据结构6: 静态链表及C语言实现
本节继续介绍线性表的另外一种链式表示——静态链表.(前面介绍的链表称为 动态链表 ). 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成 ...
- 基于C++的STL的vector实现静态链表,要求包含插入,删除,和查找功能
//main.cpp部分 #include"List.cpp" int main() { StaticList<int> SL; SL.Insert(,); SL.In ...
随机推荐
- JavaScript的作用域
JavaScript的作用域主要是指函数的作用域,在进行结果判断的时候十分重要,如果不清楚作用域,便很有可能导致拿不到预期的结果,也就无法顺利的进行程序的编写,在经历了一系列的学习和了解之后,对相关知 ...
- c# 图解泛型List<T>, HashTable和Dictionary<TKey,TValue>
前辈在代码中使用了HashTable,由于我用的比较少,不能理解,为什么不用Dictionary?看了源码以及查阅资料,总结如下: 首先看看它们的继承体系: 我把list<T>的继承体系也 ...
- TypeScript入门知识三(函数新特性)
一,Rest and Spread操作符: 用来声明任意数量的方法参数也就是"..."操作符 输出结果: 18 jajj 89 function test (a, b, c) { ...
- Linux shell 脚本(二)
转载请标明出处: http://blog.csdn.net/zwto1/article/details/45078837: 本文出自:[明月的博客] 五.字符串处理 1.子串截取操作: 路径分割: ...
- Javascript 基础知识2017-03-17
JavaScript语法 1.单行注释:// 多行注释:*/ 2.基本数据类型: int 整数型 (不等于四舍五入,把小数舍去) string 字符型 ...
- java--计时器
计时器 一.窗口化 public class Pro extends JFrame{ private JTextField textField = new JTextField(45);//系统时间文 ...
- java 三种工厂模式
一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...
- [Bzoj 2547] [Ctsc2002] 玩具兵
2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 317 Solved: 152[Submit][Status] ...
- Eclipse安卓开发环境搭建
前提,Java SDK和Eclipse搭建完毕 下载android SDK并安装 (官网:http://sdk.android-studio.org/ ) 找到安装目录,运行“SDK Manager. ...
- 大数据 --> 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...