一、概念

静态链表相当于混合了数组和链表,单独的链表,使用next指针指向内存空间中下一个节点的位置来实现连接的,而数组中是用相对位置来实现,将二者混合,保留指向下一个的指针,但这个指针不是指针,而是下一个节点所在数组位置的下标,相当于在一个数组内实现了链表的操作。

二、定义

静态链表节点的定义只做出了一个改动,指向下一个的不再是指针,而是一个整形变量,这个变量用于记录下一个节点所在位置的数组下标。

struct LNode{int num;int next;
};

三、代码实现

静态链表的实现,最麻烦的点在于分配和收回节点。

一般链表中,想新建一个节点只需要使用malloc函数,从内存分配一个就完事了,想释放用free函数,几句代码的事情,但是在静态链表中就不一样了,所有节点的分配都是在一个数组中进行的,基本思路就是还没使用的节点就放在空节点链上,已经使用的放在头结点链上。

为了方便分配节点,不仅需要一个头结点,还需要一个空头节点。初始化时,所有的节点都是空节点,所以将其连接起来,让每个节点都指向自己相邻的下一个节点,最后一个节点指向0表示空,这条链表就是空间点链表。当需要添加数据时,从空节点链表头部摘一个下来,这个操作并不难,由于操作都是基于数组下标的,可以直接使用数字来操作,返回摘下节点数组中的下标,这就是节点的分配。释放节点也是一个道理,把要删除的节点从链表上删除,之后这个节点相当于一个孤立点,将其再接回空节点链表的头部,使用头插法,顺便将节点上的数据归零,就实现了节点的回收。

int MallocNode()
{int tar=space[0].next;if(space[0].next)space[0].next=space[tar].next;return tar;
}void FreeNode(int tar)
{space[tar].next=space[0].next;space[tar].num=0;space[0].next=tar;
}

其余操作上,基本上就是把指针的相关操作换成了数组下标。直接上代码。

#include<bits/stdc++.h>
using namespace std;
struct LNode{int num;int next;
};
#define MAXSIZE 50
struct LNode space[MAXSIZE];
int head;
int l;
int MallocNode()
{int tar=space[0].next;if(space[0].next)space[0].next=space[tar].next;return tar;
}void FreeNode(int tar)
{space[tar].next=space[0].next;space[tar].num=0;space[0].next=tar;
}void buttominsert(int n)
{for(int i=0;i<n;i++){int temp=MallocNode();scanf("%d",&space[temp].num);space[temp].next=0;space[l].next=temp;l=space[l].next;space[head].num++;}
}void headinsert(int n)
{for(int i=0;i<n;i++){int temp=MallocNode();scanf("%d",space[temp].num);space[temp].next=space[head].next;space[head].next=temp;space[head].num++;}
}
void print()
{int s=space[head].next;while(s){printf("%d ",space[s].num);s=space[s].next;}printf("\n");printf("The length of the list is %d\n",space[head].num);
}
void init()
{for(int i=0;i<MAXSIZE-1;i++)space[i].next=i+1;space[MAXSIZE-1].next=0;head=MallocNode();l=head;space[head].num=0;space[head].next=0;
}
bool Delete(int tar)
{if(tar<0||tar>=space[head].num)return false;int p,q;p=head;while(tar--)p=space[p].next;q=space[p].next;space[p].next=space[space[p].next].next; FreeNode(q);space[head].num--;return true;
}
void delmode()
{int tar;printf("Input the location that you want to delete:");scanf("%d",&tar);if(!Delete(tar-1))printf("Delete failed\n");elseprintf("Delete succeed\n");
}
bool insert(int tar,int num)
{if(tar<0||tar>space[head].num||tar>=MAXSIZE)return false;int temp=MallocNode();space[temp].num=num;int p=head;while(tar--)p=space[p].next;space[temp].next=space[p].next;space[p].next=temp;space[head].num++;return true;
}
int search(int tar)
{int cnt=0;int temp=space[head].next;while(temp){if(space[temp].num==tar)return cnt;cnt++;temp=space[temp].next;}return -1;
}
void insmode()
{int tar,num;printf("Input the location and num that you want to insert:");scanf("%d %d",&tar,&num);if(!insert(tar-1,num))printf("Insert failed\n");elseprintf("Insert succeed\n");
}
void seamode()
{int tar;printf("Input the number you want to search:");scanf("%d",&tar);int ans=search(tar);if(ans==-1)printf("Find failed\n");elseprintf("The target is at the %d\n",ans+1);
}
int main()
{init();int n,tar,num,choice=-1;printf("Input the amount of elements:");scanf("%d",&n);buttominsert(n);//headinsert(n);print();while(choice!=0){printf("1-delete\n");printf("2-insert\n");printf("3-show\n");printf("4-search\n");printf("0-exit\n");printf("Choice the function you want:");scanf("%d",&choice);switch(choice){case 1:delmode();break;case 2:insmode();break;case 3:print();break;case 4:seamode();break;case 0:break;default:printf("input error!");break;} }   return 0;return 0;}

四、优缺点分析

个人感觉,静态链表是活在题目里的链表,使用静态链表单纯是为了考试,没什么实际使用价值,链表的有点就在于其灵活性,可以无限延长而不会出现溢出,但是静态链表将链表限制在了数组里,也就是说一旦节点数超过了数组上限就会溢出,而且空节点链表和数据链表的头结点还要各自占用一个节点的位置,能用的节点就少了两个,与其在数组里面用下标指来指去,倒不如直接用数组实现线性表或者指针在内存上移动来的实在。

数据结构 2-3-4 静态链表相关推荐

  1. 静态链表和数组的区别

    读<大话数据结构> 在学习静态链表时候,觉得他和数组神似,于是就搜一搜他们的区别哇. 静态链表的C实现和核心点(基于数据结构 严蔚敏)

  2. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  3. 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表

    循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...

  4. c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...

    「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...

  5. Scratch 与C语言实现数据结构静态链表的建立及操作

    Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...

  6. 静态链表(C++实现)——基于数据结构(沈俊版)(初学者食用)

    静态链表(C++实现)--基于数据结构(沈俊版) 初学数据结构,不喜勿喷.欢迎大佬们指正! 静态链表是利用数组来模拟存储空间来实现链表的,如果为数组中每一个元素附加一个链接指针(数组下标),就形成静态 ...

  7. 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)

    目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生.这个标题是随手打上去的,感觉还蛮顺口,就这样了. 这个学期在学[数据结构与算法],而这是我面对的第一个实验题.因 ...

  8. C语言实现STL静态链表,先进后出的数据结构-栈 一

    1. 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构. 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而 ...

  9. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  10. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

最新文章

  1. js字符串转化为方法调用
  2. halcon知识:【2】二维码原理
  3. 关于负载均衡的三种传输模式(反向代理,透传,三角)
  4. python md5_Python提取MD5
  5. 异常处理:你不可能总是对的 - 零基础入门学习Python032
  6. 世界大学生超算竞赛正式启动,再次引发全球关注
  7. php如何控制用户数,PHP统计当前在线用户数实例讲解
  8. 虚拟化四路服务器,IDC:4路及8路服务器现状未来趋势分析
  9. 疫苗接种率低?不用怕,互联网公司给出解决之道
  10. PowerShell自动部署IIS站点(Windows Server 2008 R2)
  11. Las Vegas利用ParkPad(基于ArcPad)实现公园资产管理
  12. 无U盘安装系统(到固态硬盘)教程
  13. PCAP学习笔记二:pcap4j源码笔记
  14. Ubuntu下键盘输入错乱问题,输入自动变为希腊字母和符号
  15. PyQt5教程(一)
  16. go项目部署服务器保姆级教程(带图)
  17. elasticsearch 如何保证数据一致性?
  18. 无线电通信天线增益的计算
  19. 微信浏览器中唤醒APP到指定页
  20. 基于Java的校园二手交易平台

热门文章

  1. RAC RMAN备份
  2. LinkedBlockingQueue1.8源码
  3. ascii码和unicode
  4. QuantLib 金融计算——随机过程之概述
  5. Leetcode811.Subdomain Visit Count子域名访问计数
  6. Djang(在前端仿DjangoAdmin同样效果)
  7. SpringMVC_跟踪请求
  8. IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1
  9. Eclipse 基于接口编程的时候,快速跳转到实现类的方法(图文)
  10. 摘自缪雪峰的博客的JavaScript个人笔记(3)