静态链表

C++静态链表的实现(包括各操作的成员函数)

[亡魂溺海] 提交于 2020-03-04 10:29:49
静态链表是用数组描述的链表,其实是为了给没有指针的语言设计的单链表的方法。尽管可能用不上,但这种思考方式是还是很巧妙的,利用游标来实现指针的作用,应该理解这种思想以备不时之需 ,网上找的c++代码基本都有c的痕迹,就自己学了一天,其中加了大量的注释,希望对其他初学者有所帮助 1 #include<iostream> 2 #include<ctime> 3 #include<cstdlib> 4 using namespace std; 5 #define MAXSIZE 1000 6 7 #ifndef LIST_H 8 #define LIST_H 9 class node{//创建结点结构,包括数据和游标,游标记录下一个元素所对应的下标 10 public: 11 int cur; 12 int data; 13 }; 14 15 class List{ 16 public: 17 List();//无参数的构造函数 18 bool CreateList(int size);//初始链表 19 int new_sl();//模仿普通链表的new分配内存空间 20 void delete_sl(int i);//模仿普通链表的delete释放内存空间,这个形参i代表链表中将要释放的元素的下标 21 void ClearList();//清空链表 22 bool ListEmpty

建立简单的静态链表

你离开我真会死。 提交于 2020-02-08 16:55:00
1 #include <stdio.h> 2 struct student 3 { 4 int num; 5 float score; 6 struct student*next; 7 }; 8 int main() 9 { 10 struct student a,b,c,*head,*p; 11 a.num=10101;a.score=89.5; 12 b.num=10103;b.score=90; 13 c.num=10103;c.score=90; 14 head=&a; 15 a.next=&b; 16 b.next=&c; 17 c.next=NULL; 18 p=head; 19 do{ 20 printf("%ld%5.1f\n",p->num,p->score); 21 p=p->next; 22 }while(p!=NULL); 23 return 0; 24 } head指向a的结点,a.next指向b的结点·······c.next=null是为了不让其指向任何存储单元 需要定义一个指针变量来接受head的地址 本程序所有节点都是在程序中定义的所以用完后不能释放,为静态链表 来源: https://www.cnblogs.com/ZJK132/p/12283764.html

线性表--顺序表--静态链表(八)

痴心易碎 提交于 2020-01-28 23:53:30
写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书。 很感谢能有这样一个平台让我能够在这里分享所学所感。 我喜欢编程,喜欢代码,喜欢去做一个程序员。 努力学习,争取多年后,给亲人更好的生活。 QQ/WX:2506897252 欢迎交流。 文章目录 1.介绍 2.备用链表 3.图示工作流程 4.代码实现 (1)初始化空闲链表 (2)分配结点 (3)存储数据 (4)遍历数据 (5)收回结点 5.程序演示 6.运行结果 1.介绍 前面的链表都是使用指针类型实现的,并且都是由系统提供的函数malloc和free动态实现,被称之为动态链表,像C,C++,java是拥有“指针”这类数据类型的,不需要使用静态链表,而对于BASIC,FORTRAN之类的高级语言中,并没有提供“指针”这类数据类型,若要继续采用链表作为数据的存储结构,只能采用数组来模拟实现链表,所以下面的知识是针对没有“指针”类型的高级语言而用数组设计的拥有链表存储结构的静态链表。一起往下看。 图1是空闲数组,使用静态链表存储数据时,虽然和顺序表一样,数据都被存储在数组中,但是存储位置是随机的,并使用游标找到找到下一个存储的数据,游标为0代表着链表到头,如图2所示。 2.备用链表 只有一条数据链表是不行的,这样没有考虑对已释放空间的回收,只拿出来用,却不记谁在用,这样在经过多次插入和删除后

(三)数据结构之静态链表

别说谁变了你拦得住时间么 提交于 2020-01-25 01:00:25
数据结构之静态链表 什么是静态链表 注意事项 实际应用 源码 ending 1. what is 静态链表 静态链表也是链表的一种。顾名思义,静态链表与可动态开辟存储空间的动态链表相对立,它占用一段连续的存储空间,并且静态链表的 “指针” 是用整型数字代表下标来表示的,并不是真正的指针。 2. 注意事项 它的存储空间大小是刚开始就决定好的,虽然在存储空间占满时可以按增量扩大空间,但仍是 相对“静态” 的。一般来讲以宏定义规定初始规模以及每次的空间增量。 # define MAXSIZE 1000 # define INCREASE 10 //根据情况自定义 静态链表中为了实际操作方便实际上同时存在着两个链表,一个是用户存入的数据链接的链表,一个是备用空间(只未被使用或者被删除的空间)链接得到的链表。 每次插入元素时,从备用空间中拿出一个使用 。同理 删除元素时,同时将其加入备用空间中待用 。能够更好的管理静态链表。 如第二点所说,存储空间0号单元一般用来当作备用空间链表头节点,1号单元一般当作数据链表头节点, 不用于存储数据 。 3. 实际应用 既然这么麻烦那么实际应用在什么情况? 首先我们得知道不是所有编程语言都有指针操作,所以在很多高级编程语言当中想要实现链表功能就需要用到静态链表。 4. 源码 # include <iostream> # include <windows.h

大话数据结构系列之静态链表(四)

牧云@^-^@ 提交于 2020-01-23 08:10:07
文章目录 定义 组成 静态链表的插入元素 存在意义 静态链表的优缺点 代码实现( C 、Java ) 定义 组成 让数组的元素都是由两个数据域组成,data 和 cur。 数组的每个下标都对应一个 data 和一个 cur。数据域 data,用来存放数据元素;而游标 cur 相当于单链表中的 next 指针,存放该匀速的后继在数组中的下标。 静态链表的插入元素 例子: 新增元素丙,并插入到下标为3的位置 操作步骤: 在实际数组中是在编号为7的地方直接放置丙元素,数据域的下标置为3 将元素 乙 的数据域下标置为 7,那么在进行遍历时,它会首先找到编号为 7 的丙元素。 然后在依据 丙 元素的数据域下标,找到了编号为 3 的元素丁,如此完成了数据的插入 存在意义 静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能力的方法。 静态链表的优缺点 优点 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了顺序存储结构中插入和删除操作需要移动大量元素的缺点。 缺点 没有解决连续存储分配带来的表长难以确定的问题。 失去了顺序存储结构随机存取的特性(及在查询时的时间复杂度为 O[n] ) 代码实现( C 、Java ) C 语言 #include "string.h" #include "ctype.h" #include "stdio.h" #include "stdlib

静态表 (C语言实现静态链表) ------- 算法笔记002

好久不见. 提交于 2020-01-18 21:55:30
概念理解 在c语言中我们可以通过创建结构体和指针来建立一个链表,但是有的编程语言不支持指针,如java,直接将指针封装起来。在这种编程语言的背景下我们创建一个链表可以通过数组的方式来模拟,称之为静态链表。为何说是静态的呢》因为数组模拟的链表的长度是固定的。 静态链表的结构 游标 数据 下标 1 A 0 我们可以理解为一组结构体数组来模拟链表的情况 静态链表的创建插入原理图 静态链表实现增删的原理图 程序代码 静态链表的初始化 //结构体定义 typedef struct { int data ; int cur ; } List , StaticList [ MaxNumOfNode ] ; //初始化链表 void init ( StaticList space ) { int index ; for ( index = 0 ; index < MaxNumOfNode ; index ++ ) { space [ index ] . cur = index + 1 ; space [ index ] . data = - 1 ; } space [ MaxNumOfNode - 1 ] . cur = 0 ; } 初始化数值2000 //put初始值2000 void startPutData ( StaticList space ) { int i ; int count =

静态链表常见题型总结

Deadly 提交于 2019-12-27 00:34:20
静态链表 首先,静态链表的原理是Hash,即通过建立一个结构体数组,使用下标去访问数组元素; 一般化步骤: 1)定义静态链表 struct Node{ int add;//节点地址 typedef data;//数据域 int next;//指针域 XXX ; // 节点某性质,具体问题,具体分析 }node[maxn]; 2) 静态链表初始化 for(int i=0;i<maxn;i++){ node[i].XXX=false;//自行初始化为所需 } 3) 常见逻辑处理 1:由于可能存在无效节点,因此需 计数统计 (eg:对于节点是否在链表上,遍历链表时将XXX置true标记即可) int p=begin,cnt=0; while(p!=-1){ node[p].XXX=true; p=node[p].next; cnt++; } cnt可用于控制节点输出个数。 2:有时为了访问方便,需将链表元素 移置左端 处理,一种简单的操作直接排序就好。 那怎么排序呢,第一标尺是节点是否有效,第二、~~等标尺按题目要求。 则原先结构体可以这样定义: struct Node{ int add,val,next; bool flag; friend bool operator <(const Node &a,const Node &b){ //两个参数必须声明为友元函数 if(a.flag=

静态链表、循环链表、双向链表(C代码实现)

本小妞迷上赌 提交于 2019-12-22 05:34:18
静态链表 对于没有指针的编程语言,可以用数组替代指针,来描述链表。让数组的每个元素由data和cur两部分组成,其中cur相当于链表的next指针, 这种用数组描述的链表叫做静态链表 ,这种描述方法叫做游标实现法。我们对数组的第一个和最后一个元素做特殊处理,不存数据。让数组的第一个元素cur存放第一个备用元素(第一个未被占用的元素)下标,而数组的最后一个元素cur存放第一个有值的元素下标,相当于头结点作用。空的静态链表如下图 当存放入一些数据时("甲""乙""丁""戊""己""庚"),静态链表为: 静态链表的插入操作 在静态链表第三个位置插入"丙"后,结果如下: 静态链表中要解决的是:如何用静态模拟动态链表结构的存储空间的分配,需要时申请,无用时释放。 其主要的思想: 我们自己定义一个内存分配函数,如Malloc_SLL(StaticLinkList space) 1 //插入元素时,分配空间的下标(从备用链表中去取出) 2 int Malloc(StaticLinkList L) 3 { 4 int i = L[0].cur; //获取备用链表的下标 5 if (i) //链表不为空 6 L[0].cur = L[i].cur; //将第一位的游标改成备用链表的下表+1 7 return i; 8 } 然后再修改游标表示,如上图 代码附上: 1 //静态链表中i位置插入一个元素

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

半腔热情 提交于 2019-12-02 05:18:43
静态链表说明 使用数组来实现链式存储结构,目的是方便在不设指针类型的高级程序设计语言中使用链式结构 c语言定义数据结构 #define MAX_SIZE 1000 // 所有的类型都统一定义为ElemType typedef int ElemType; typedef struct { ElemType data; int cur; } component, LinkList[MAX_SIZE]; 存储结构如下图所示 静态链表的工作原理 静态链表重点是在构建两个链表:备用链表(空闲的节点)和数据链表(已被使用的节点),下面来讨论一下两条链表是如何工作的 初始化链表,处标记颜色为空闲列表不可用时,其余所有的都属于备用链表(空闲的节点) 插入部分数据,静态链表同时产生备用链表(空闲的节点)和数据链表(已被使用的节点) 将上图结构分解一下,如下图 插入数据演示图 删除数据演示图 代码实现(A - B) U (B - A) 核心代码 void difference(LinkList &S1, int head) { ElemType temp, tail = head; // A = { 1, 2, 3, 4, 5}, B = { 4, 5, 6, 7, 8} int m = 5, n = 5; // Build the first collection for (int j = 1; j

静态链表实现

喜夏-厌秋 提交于 2019-11-29 10:14:56
注意事项: 这里用k申请空间,i遍历空间。 静态链表是利用游标来模拟指针,把固定分配的内存分成备用链表和链表两大块,在利用自制的malloc和free函数申请释放备用空间时,实现离散存储。 基本操作和动态链表实际上差不多,不过一个是利用p = p->next一个是使用i = L[i].cur来实现指针的后移。 初始化链表时,链表只有最后一个空间的cur是0, 意味是头指针,并没有任何分配的空间。备用链表的头指针是空间的第一个位置,最后一个指针的cur也是0。 0 在静态链表中也意味着NULL; 使用动态链表思维,cur成员可以看成指针,里面存的哪个单元的下标,就相当于指向哪个单元。 #include<stdio.h> #include<stdlib.h> typedef struct { int data; int cur; }component, SLinkList[100]; int Malloc(SLinkList space) { int i = space[0].cur; if (i) space[0].cur = space[i].cur; return i; } void Free(SLinkList space, int k) { space[k].cur = space[0].cur; space[0].cur = k; } void Creat