数据结构 2-3-4 静态链表
一、概念
静态链表相当于混合了数组和链表,单独的链表,使用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 静态链表相关推荐
- 静态链表和数组的区别
读<大话数据结构> 在学习静态链表时候,觉得他和数组神似,于是就搜一搜他们的区别哇. 静态链表的C实现和核心点(基于数据结构 严蔚敏)
- c语言 静态链表插入排序,数据结构C语言版 表插入排序
西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...
- 【数据结构】线性表的链式表示-循环单链表、循环双链表、静态链表
循环单链表 从任何一个结点出发都能访问到链表的每一个元素 判空条件不是头节点的后继指针是否为空,而是它是否等于头指针 有时对单链表常做的操作实在表头和表尾进行的,此时可对循环单链表不设头指针而仅设尾指 ...
- c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...
「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...
- Scratch 与C语言实现数据结构静态链表的建立及操作
Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...
- 静态链表(C++实现)——基于数据结构(沈俊版)(初学者食用)
静态链表(C++实现)--基于数据结构(沈俊版) 初学数据结构,不喜勿喷.欢迎大佬们指正! 静态链表是利用数组来模拟存储空间来实现链表的,如果为数组中每一个元素附加一个链接指针(数组下标),就形成静态 ...
- 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)
目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生.这个标题是随手打上去的,感觉还蛮顺口,就这样了. 这个学期在学[数据结构与算法],而这是我面对的第一个实验题.因 ...
- C语言实现STL静态链表,先进后出的数据结构-栈 一
1. 栈的概念 在开始前,请牢记这句话:栈是一种先进后出的数据结构. 栈(stack)是限定仅在表的一端进行操作的数据结构,请联系我们前文所学的,设想一个单链表我们只能够对其链表的表尾结点进行操作,而 ...
- 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...
- java静态链表_数据结构笔记:静态链表(C语言)
void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...
最新文章
- js字符串转化为方法调用
- halcon知识:【2】二维码原理
- 关于负载均衡的三种传输模式(反向代理,透传,三角)
- python md5_Python提取MD5
- 异常处理:你不可能总是对的 - 零基础入门学习Python032
- 世界大学生超算竞赛正式启动,再次引发全球关注
- php如何控制用户数,PHP统计当前在线用户数实例讲解
- 虚拟化四路服务器,IDC:4路及8路服务器现状未来趋势分析
- 疫苗接种率低?不用怕,互联网公司给出解决之道
- PowerShell自动部署IIS站点(Windows Server 2008 R2)
- Las Vegas利用ParkPad(基于ArcPad)实现公园资产管理
- 无U盘安装系统(到固态硬盘)教程
- PCAP学习笔记二:pcap4j源码笔记
- Ubuntu下键盘输入错乱问题,输入自动变为希腊字母和符号
- PyQt5教程(一)
- go项目部署服务器保姆级教程(带图)
- elasticsearch 如何保证数据一致性?
- 无线电通信天线增益的计算
- 微信浏览器中唤醒APP到指定页
- 基于Java的校园二手交易平台
热门文章
- RAC RMAN备份
- LinkedBlockingQueue1.8源码
- ascii码和unicode
- QuantLib 金融计算——随机过程之概述
- Leetcode811.Subdomain Visit Count子域名访问计数
- Djang(在前端仿DjangoAdmin同样效果)
- SpringMVC_跟踪请求
- IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1
- Eclipse 基于接口编程的时候,快速跳转到实现类的方法(图文)
- 摘自缪雪峰的博客的JavaScript个人笔记(3)