- 外文名
- data structure
- 具体指向
- 特定关系的数据元素的集合
- 有关技术
- 检索算法和索引技术
- 中文名
- 数据结构
- 解 释
- 计算机存储、组织数据的方式
-
数据结构:八大数据结构分类
2018-09-05 18:23:28数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都...本文目录:
数据结构分类
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。
常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:
每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。1、数组
数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。
int[] data = new int[100];data[0] = 1;
优点:
1、按照索引查询元素速度快
2、按照索引遍历数组方便缺点:
1、数组的大小固定后就无法扩容了
2、数组只能存储一种类型的数据
3、添加,删除的操作慢,因为要移动其他的元素。适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况。2、栈
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以,栈常应用于实现递归功能方面的场景,例如斐波那契数列。3、队列
队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队,示例图如下:
使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。4、链表
链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。
链表的优点:
链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快;缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,非常耗时。适用场景:
数据量较小,需要频繁增加,删除操作的场景5、树
树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点有零个或多个子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
在日常的应用中,我们讨论和用的更多的是树的其中一种结构,就是二叉树。
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。
2、左子树和右子树是有顺序的,次序不能颠倒。
3、即使某结点只有一个子树,也要区分左右子树。二叉树是一种比较有用的折中方案,它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
扩展:
二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等,这些数据结构二叉树的基础上衍生了很多的功能,在实际应用中广泛用到,例如mysql的数据库索引结构用的就是B+树,还有HashMap的底层源码中用到了红黑树。这些二叉树的功能强大,但算法上比较复杂,想学习的话还是需要花时间去深入的。6、散列表
散列表,也叫哈希表,是根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
记录的存储位置=f(key)
这里的对应关系 f 成为散列函数,又称为哈希 (hash函数),而散列表就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里,这种存储空间可以充分利用数组的查找优势来查找元素,所以查找的速度很快。
哈希表在应用中也是比较常见的,就如Java中有些集合类就是借鉴了哈希原理构造的,例如HashMap,HashTable等,利用hash表的优势,对于集合的查找元素时非常方便的,然而,因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构,其示例图如下:
从图中可以看出,左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。哈希表的应用场景很多,当然也有很多问题要考虑,比如哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃。
7、堆
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),满足前者的表达式的成为小顶堆,满足后者表达式的为大顶堆,这两者的结构图可以用完全二叉树排列出来,示例图如下:
因为堆有序的特点,一般用来做数组中的排序,称为堆排序。8、图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
按照顶点指向的方向可分为无向图和有向图:
图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构,这里不做展开,读者有兴趣可以自己学习深入。 -
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
2019-09-10 23:27:18又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥...先看效果图(在线电脑尝试地址http://biggsai.com/maze.html):
起因
又到深夜了,我按照以往在公众号
写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满!
超越妹妹时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个小游戏啥的!
当我码完字准备睡觉时:写不好别睡觉!
分析
如果用数据结构与算法造出东西来呢?
- 什么东西简单容易呢?我百度一下,我靠,这个鸟游戏原来不好搞啊,得接触一堆不熟悉的东西,搞不来搞不来。
有了(
灵光一闪
),写个猜数字游戏,问他加减乘除等于几。- 超越妹妹又不是小孩子,糊弄不过去。
经过一番折腾,终于在半夜12点确定写迷宫小游戏了。大概弄清楚其中的几个步骤。
大概是:
- 画线—>画迷宫(擦线)—>方块移动、移动约束(不出界不穿墙)—>完成游戏。
画线(棋盘)
对于html+js(canvas)画的东西,之前学过javaswing应该有点映像。在html中有个
canvas
的画布,可以在上面画一些东西和声明一些监听(键盘监听)。对于迷宫来说,那些线条是没有属性的,只有
位置x,y
,你操作这个画布时候,可能和我们习惯的面相对象思维不一样。所以,在你设计的线或者点的时候,记得那个点、线在什么位置,在后续划线还是擦线还是移动的时候根据这个位置进行操作。<!DOCTYPE html> <html> <head> <title>MyHtml.html</title> </head> <body> <canvas id="mycanvas" width="600px" height="600px"></canvas> </body> <script type="text/javascript"> var aa=14; var chess = document.getElementById("mycanvas"); var context = chess.getContext('2d'); // var context2 = chess.getContext('2d'); // context.strokeStyle = 'yellow'; var tree = [];//存放是否联通 var isling=[];//判断是否相连 for(var i=0;i<aa;i++){ tree[i]=[]; for(var j=0;j<aa;j++){ tree[i][j]=-1;//初始值为0 } } for(var i=0;i<aa*aa;i++){ isling[i]=[]; for(var j=0;j<aa*aa;j++){ isling[i][j]=-1;//初始值为0 } } function drawChessBoard(){//绘画 for(var i=0;i<aa+1;i++){ context.strokeStyle='gray';//可选区域 context.moveTo(15+i*30,15);//垂直方向画15根线,相距30px; context.lineTo(15+i*30,15+30*aa); context.stroke(); context.moveTo(15,15+i*30);//水平方向画15根线,相距30px;棋盘为14*14; context.lineTo(15+30*aa,15+i*30); context.stroke(); } } drawChessBoard();//绘制棋盘 // var mymap=new Array(36); // for(var i=0;i<36;i++) // {mymap[i]=-1;} </script> </html>
实现效果
画迷宫
随机迷宫怎么生成?怎么搞?一脸懵逼。
- 因为我们想要迷宫,那么就需要这个迷宫出口和入口有连通路径,你可能压根不知道迷宫改怎么生成,用的什么算法。小声BB:用并查集(不相交集合)。
迷宫和不相交集合有什么联系呢?(
规则
)- 之前笔者在前面数据结构与算法系列中曾经介绍过并查集(不相交集合),它的主要功能是森林的合并,不联通的通过并查集能够快速将两个森林合并,并且能够快速查询两个节点是否在同一个森林中!
而
我们的随机迷宫
:在每个方格都不联通的情况下,是一个棋盘方格,这也是它的初始状态。而这个节点可以跟邻居可能相连,也可能不相连。我们可以通过并查集
实现。具体思路为:(主要理解并查集)
- 1:定义好不想交集合的基本类和方法(
search,union
等)
2:数组初始化,每一个数组元素都是一个集合,值为-1
3:随机查找一个格子(一维数据要转换成二维,有点麻烦),在随机找一面墙(也就是找这个格子的上下左右),还要判断找的格子出没出界。
具体在格子中找个随机数m——>随机数m在二维中的位置[m/长,m%长]
——>这个二维的上下左右随机找一个位置p[m/长+1,m%长]
或[m/长-1,m%长]
或[m/长,m%长+1]
或[m/长,m%长-1]
——>判断是否越界
4:判断两个格子(一维数组编号)是否在一个集合(并查集查找)。如果在,则重新找,如果不在,那么把墙挖去
5:把墙挖去有点繁琐,需要考虑奇偶判断它那种墙(上下还是左右,还要考虑位置),然后擦掉。(根据数组转换成真实距离)。具体为找一个节点,根据位置关系找到一维数组的号位用并查集判断是否在一个集合中。
6:最终得到一个完整的迷宫。直到第一个(1,1)和(n,n)联通停止。虽然采用随机数找墙,但是效果并不是特别差。其中要搞清一维二维数组的关系。一维是真实数据,并查集操作。二维是位置。要搞懂转化!
注意:避免混淆,搞清数组的地址和逻辑矩阵位置。数组从0开始的,逻辑上你自己判断。别搞混淆!
主要逻辑为:while(search(0)!=search(aa*aa-1))//主要思路 { var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 var neihbour=getnei(num); if(search(num)==search(neihbour)){continue;} else//不在一个上 { isling[num][neihbour]=1;isling[neihbour][num]=1; drawline(num,neihbour);//划线 union(num,neihbour); } }
那么在前面的代码为
<!DOCTYPE html> <html> <head> <title>MyHtml.html</title> </head> <body> <canvas id="mycanvas" width="600px" height="600px"></canvas> </body> <script type="text/javascript"> //自行添加上面代码 // var mymap=new Array(36); // for(var i=0;i<36;i++) // {mymap[i]=-1;} function getnei(a)//获得邻居号 random { var x=parseInt(a/aa);//要精确成整数 var y=a%aa; var mynei=new Array();//储存邻居 if(x-1>=0){mynei.push((x-1)*aa+y);}//上节点 if(x+1<14){mynei.push((x+1)*aa+y);}//下节点 if(y+1<14){mynei.push(x*aa+y+1);}//有节点 if(y-1>=0){mynei.push(x*aa+y-1);}//下节点 var ran=parseInt(Math.random() * mynei.length ); return mynei[ran]; } function search(a)//找到根节点 { if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点 { return search(tree[parseInt(a/aa)][a%aa]);//不能压缩路径路径压缩 } else return a; } function value(a)//找到树的大小 { if(tree[parseInt(a/aa)][a%aa]>0)//说明是子节点 { return tree[parseInt(a/aa)][a%aa]=value(tree[parseInt(a/aa)][a%aa]);//不能路径压缩 } else return -tree[parseInt(a/aa)][a%aa]; } function union(a,b)//合并 { var a1=search(a);//a根 var b1=search(b);//b根 if(a1==b1){} else { if(tree[parseInt(a1/aa)][a1%aa]<tree[parseInt(b1/aa)][b1%aa])//这个是负数(),为了简单减少计算,不在调用value函数 { tree[parseInt(a1/aa)][a1%aa]+=tree[parseInt(b1/aa)][b1%aa];//个数相加 注意是负数相加 tree[parseInt(b1/aa)][b1%aa]=a1; //b树成为a树的子树,b的根b1直接指向a; } else { tree[parseInt(b1/aa)][b1%aa]+=tree[parseInt(a1/aa)][a1%aa]; tree[parseInt(a1/aa)][a1%aa]=b1;//a所在树成为b所在树的子树 } } } function drawline(a,b)//划线,要判断是上下还是左右 { var x1=parseInt(a/aa); var y1=a%aa; var x2=parseInt(b/aa); var y2=b%aa; var x3=(x1+x2)/2; var y3=(y1+y2)/2; if(x1-x2==1||x1-x2==-1)//左右方向的点 需要上下划线 { //alert(x1); // context.beginPath(); context.strokeStyle = 'white'; // context.moveTo(30+x3*30,y3*30+15);// // context.lineTo(30+x3*30,y3*30+45); context.clearRect(29+x3*30, y3*30+16,2,28); // context.stroke(); } else { // context.beginPath(); context.strokeStyle = 'white'; // context.moveTo(x3*30+15,30+y3*30);// // context.lineTo(45+x3*30,30+y3*30); context.clearRect(x3*30+16, 29+y3*30,28,2); // context.stroke(); } } while(search(0)!=search(aa*aa-1))//主要思路 { var num = parseInt(Math.random() * aa*aa );//产生一个小于196的随机数 var neihbour=getnei(num); if(search(num)==search(neihbour)){continue;} else//不在一个上 { isling[num][neihbour]=1;isling[neihbour][num]=1; drawline(num,neihbour);//划线 union(num,neihbour); } } </script> </html>
实现效果:
方块移动
这部分我采用的方法不是动态真的移动,而是一格一格的跳跃。也就是当走到下一个格子将当前格子的方块擦掉,在移动的那个格子中再画一个方块。选择方块是因为方块更方便擦除,可以根据像素大小精准擦除。
另外,再移动中要注意不能穿墙、越界。那么怎么判断呢?很好办,我们再前面会判断两个格子是否联通,如果不连通我们将把这个墙拆开。再拆的时候把这个墙的时候记录这两点拆墙可走即可(数组)
另外,事件的监听上下左右查一查就可以得到,添加按钮对一些事件监听,这些不是最主要的。
为了丰富游戏可玩性,将方法封装,可以设置关卡(只需改变迷宫大小)。这样就可以实现通关了。另外,如果写成动态存库那就更好了。
结语
在线尝试地址,代码直接查看网页源代码即可!
笔者前端能力和算法能力有限,写的可能不是特别好,还请见谅!当然,笔者欢迎和一起热爱学习的人共同进步、学习!欢迎关注笔者公众号:bigsai,后台回复java、数据结构、爬虫、springboot等有
精心准备资料一份
。如果感觉不错,欢迎关注、点赞!蟹蟹! -
数据结构
2018-02-07 00:47:381. 什么是数据结构算法+数据结构=程序设计 数据结构是由数据和结构两方面组成,下面举一个例子可以让大家很快地理解数据结构:比如我们实验楼的课程管理系统,每一门课程由课程号、课程名、类别、作者等组成,每门...1. 什么是数据结构
算法+数据结构=程序设计
数据结构是由数据和结构两方面组成,下面举一个例子可以让大家很快地理解数据结构:比如我们实验楼的课程管理系统,每一门课程由课程号、课程名、类别、作者等组成,每门课的课程号是唯一的,但不同的课程可能属于同一个类别,或者是同一个作者写的,由此我们可以建立一张按课程号顺序排列的课程表和两张按类别和作者名顺序排列的索引表,如下图所示,这样我们就可以按课程号或课程名或类别或作者名快速地找到我们想要学的那门课程。
在这个例子中,数据就是课程、类别和作者,结构就是课程与类别和作者的关系,它体现了一种最简单的线性关系,除了线性结构外,还有集合结构和更为复杂的树形结构和图结构,简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科,,学好数据结构可以使计算机更高效地工作。
2. 数据的逻辑结构和物理结构
数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。一、数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
- 1.集合
- 数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
- 2.线性结构
- 数据结构中的元素存在一对一的相互关系;
- 3.树形结构
- 数据结构中的元素存在一对多的相互关系;
- 4.图形结构
- 数据结构中的元素存在多对多的相互关系。
二、数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。
数据的物理结构是数据结构在计算机中的表示(又称映像),它包括数据元素的机内表示和关系的机内表示。由于具体实现的方法有顺序、链接、索引、散列等多种,所以,一种数据结构可表示成一种或多种存储结构。
数据元素的机内表示(映像方法): 用二进制位(bit)的位串表示数据元素。通常称这种位串为节点(node)。当数据元素有若干个数据项组成时,位串中与个数据项对应的子位串称为数据域(data field)。因此,节点是数据元素的机内表示(或机内映像)。
关系的机内表示(映像方法):数据元素之间的关系的机内表示可以分为顺序映像和非顺序映像,常用两种存储结构:顺序存储结构和链式存储结构。顺序映像借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。非顺序映像借助指示元素存储位置的指针(pointer)来表示数据元素之间的逻辑关系。3. 常用结构
- 数组
- 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
- 栈
- 是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
- 队列
- 一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。
- 链表
- 是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
- 树
- 是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。 (2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。 - 图
- 图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
- 堆
- 在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
- 散列表
- 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。
-
数据结构——线性表—— 2016_10_13
2016-10-13 23:09:08自己做的,只有插入和删除,不过基本原理就这样数据结构之线性表(C语言版)
#include<stdio.h> #include<stdlib.h> #define List_Init_Size 100 #define LISTINCREMENT 10 //定义线性表结构 typedef struct{ int *elem; int length; int Listsize; }Sqlist; //初始化线性 void InitList_sq(Sqlist *L){ (*L).elem=(int *)malloc(List_Init_Size*sizeof(int)); if(!(*L).elem) exit(0); (*L).length=0; (*L).Listsize=List_Init_Size; } //插入线性表 void ListInsert_sq(Sqlist * L,int i,int e){ int *newbase; int *p,*q; if( i<1||i>(*L).length+1) exit(0); if((*L).length>=(*L).Listsize){ //注意:此处的>=是严蔚敏书上说的。其实==也行,因为length是递增的。我在VC++6.0上实验通过。 newbase=(int *)realloc((*L).elem,((*L).Listsize+LISTINCREMENT)*sizeof(int)); if(!(*L).elem) printf("meiyou\n"); (*L).elem=newbase; (*L).Listsize+=LISTINCREMENT; } q=&((*L).elem[i-1]); for(p=&((*L).elem[(*L).length-1]);p>=q;p--) *(p+1)=*p; *q=e; (*L).length++; } //删除节点 void Listdel_sq(Sqlist *L,int i){ int *q,*p; if((i<1)||(i>(*L).length)) exit(0); q=&((*L).elem[i-1]); for(p=&((*L).elem[(*L).length-1]);q<=p;q++) *(q)=*(q+1); (*L).length--; } //打印线性表 void Listprint_sq(Sqlist * L){ int i; for(i=1;i<=(*L).length;i++) { printf("%d ",(*L).elem[i-1]); printf("%d\n",&(L->elem[i-1])); //输出变量地址 } } //主函数 int main(){ Sqlist M; int i,k,x,y; InitList_sq(&M); printf(" 初始化线性表.......\n"); for(i=1;i<=12;i++) ListInsert_sq(&M,i,i); printf("十二个数字的线性表已经建立\n"); Listprint_sq(&M); printf("~~~~~~~~~~~请输入序号进行操作:\n"); printf("1:插入 2:删除 3:退出\n"); scanf("%d",&k); while(k!=3){ switch(k) { case 1: printf("请输入要插入元素的位置和值\n"); scanf("%d%d",&x,&y); ListInsert_sq(&M,x,y); Listprint_sq(&M); break; case 2: printf("请输入要删除元素的位置\n"); scanf("%d",&x); Listdel_sq(&M,x); Listprint_sq(&M); break; default: printf("非法输入\n"); } printf("~~~~~~~~~~~~~~~~~~~请输入序号进行操作:\n"); printf("1:插入 2:删除 3:退出\n"); scanf("%d",&k); } exit(0); return 0; }
程序运行图:
2016_10_13
-
数据结构与算法——从零开始学习(一)基础概念篇
2018-12-06 18:47:42数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合用计算机存储、组织数据的方式。数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 为什么要学数据结构? 首先,因为数据结构作为... -
数据结构基础概念篇
2017-11-14 13:44:24数据结构一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。数据:所有能被输入到计算机中,且能... -
C++数据结构——栈
2018-06-25 21:54:49C++数据结构——栈 最近计划再复习一遍数据结构,看到一篇博客:https://www.cnblogs.com/QG-whz/p/5170418.html#_label0。 1、栈(Stack)是一种线性存储结构,它具有如下特点: ... -
C++数据结构——队列
2018-06-26 22:20:30C++数据结构——队列参考博客:http://www.cnblogs.com/QG-whz/p/5171123.htmlhttp://www.169it.com/article/2718050585107790752.html1、队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:(1)队列中... -
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
2019-11-22 13:50:09大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据... -
数据结构与算法学习笔记
2018-09-25 13:55:49本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。 数据结构与算法思维导图 数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组... -
数据结构 Hash表(哈希表)
2018-05-20 01:23:34参考链接:数据结构(严蔚敏) 什么是Hash表 要想知道什么是哈希表,那得先了解哈希函数 哈希函数 对比之前博客讨论的二叉排序树 二叉平衡树 红黑树 B B+树,它们的查找都是先从根节点进行查找,从节点取出... -
为什么要学数据结构?
2019-11-19 09:45:23一、前言 在可视化化程序设计的今天,借助于...1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个... -
我以为我学懂了数据结构,直到看了这个导图才发现,我错了
2020-02-27 23:10:33数据结构与算法思维导图 -
《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理
2019-01-20 11:40:20写在前面: 恰逢期末复习,用了几天时间结合老师勾画的重点以及课件教材等,将全书重要内容做了个大整合。一方面便于自己复习记忆,另一方面po出来让更多需要的人也可以做个参考... 《数据结构》C语言版 (清华严... -
数据结构(C语言版 第2版)课后习题答案 严蔚敏 编著
2018-09-11 17:09:52... 数据结构(C语言版 第2版)课后习题答案 严蔚敏 等 编著,仅供参考,还是自己认真做了再看 ...(1)在数据结构中,从逻辑上可以把数据结构分成( C )。 A.动态结构和静态结构 B.紧凑... -
数据结构和算法视频教程
2015-01-29 08:45:17数据结构、算法视频培训课程,该教程主要是介绍在游戏开发中经常使用的数据结构,例如数组,链表,栈,队列,二叉树,递归等重要知识点讲解以及将它们里灵活的运用到算法里面。 -
Java数据结构和算法(一)——开篇
2014-09-15 07:03:40看的是——《Java数据结构和算法》一书,作者Robert Lafore。 目录 1)数据结构算法有什么用? 2)技术与通俗 3)驱动力学习 1)数据结构算法有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么... -
数据结构-顺序表基本操作的实现(含全部代码)
2018-09-13 22:14:57今天起开始编写数据结构中的各种数据结构及其算法的实现。 主要依据严蔚敏版数据结构教材以及王道数据结构考研辅导书。 今天是线性表中的顺序表的实现,主要实现函数如下,读者有需要可以评论,我可以适当加几个。... -
微软等数据结构+算法面试100题全部答案集锦
2011-10-15 00:28:43一年之前的10月14日,一个名叫July 的人在一个叫csdn 的论坛上开帖分享微软等公司数据结构+算法 面试100题,自此,与上千网友一起做,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法 算法之道的编程... -
数据结构与算法经典书籍——大话数据结构(带配套源码)
2018-10-26 00:20:03书本下载链接:链接:https://pan.baidu.com/s/1jgVnbBZoLgA8pshpxbapOQ 密码...虽说数据结构以美国人Mark Allen Weiss 写的《数据结构与算法分析——C语言实现》最好,但是我发现他的书让人很不容易理解,可能我们... -
数据结构(严蔚敏版)与算法的实现(含全部代码)
2018-09-13 22:18:14目录 基础 c/c++ 代码优化及常见错误 ...除树和图外的数据结构可以使用STL: C++ STL的使用 数据结构 线性表 顺序表 循环左移(2010联考真题) 单链表 单链表相邻结点逆置(2019北邮考研真... -
《数据结构》— 数据结构图文解析系列
2017-08-11 11:54:520. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构... -
覃超老师带你玩转数据结构与算法
2020-10-29 18:26:14让数据结构与算法真正成为你的职场竞争力
-
商业办公贸易响应式网页模板
-
奶牛牧场响应式网页模板
-
【计算机网络系列】网络层概述
-
PHP支付宝微信支付配置教程
-
我的Java
-
新东方股价跳水:市值蒸发约30亿美元,上半年净利润下滑13%
-
简单联系方式提交表单网页模板
-
头像资料切换标签网页模板
-
转行做IT-第7章 数组
-
【数据分析-随到随学】Python语法强化与数据处理
-
2021-01-22
-
转行做IT-第2章 HTML入门及高级应用
-
转行做IT-第6章 IDEA、方法
-
【计算机网络系列】链路层的差错控制与流量控制
-
透明登录注册框响应式网页模板
-
three.js入门速成
-
SPA理疗服务响应式网页模板
-
IT运维心得的JQKA一小套
-
matlab学习札记.20210122
-
火箭太空工业响应式网页模板