网上有关“数据结构有什么?”话题很是火热,小编也是针对数据结构有什么?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。
常用数据结构有哪些
数据元素相互之间的关系称为结构。有四类基本结构: *** 、线性结构、树形结构、图状结构;
*** 结构:除了同属于一种类型外,别无其它关系
线性结构:元素之间存在一对一关系常见类型有: 数组,链表,队列,栈,它们之间在操作上有所区别.例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,栈只能在栈顶进行插
入,删除操作.
树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等)
图形结构:元素之间存在多对多关系,图形结构中每个结点的前驱结点数和后续结点多个数可以任意
算法和数据结构有什么区别
数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的。往往是在发展一种算法的时候,构建了适合鼎这种算法的数据结构。一种数据结构如果脱离了算法,那还有什么用呢?实际上也不存在一本书单纯的讲数据结构,或者单纯的讲算法。当然两者也是有一定区别的,算法更加的抽象一些,侧重于对问题的建模,而数据结构则是具体实现方面的问题了,两者是相辅相成的。
什么是数据结构,数据之间的关系有几种
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等等的学科。
——《数据结构》(C语言版),严蔚敏,清华大学出版社。
数据之间的结构有线性的数据结构(计算机处理的对象之间如果存在着一种最简单的线性关系,则这类数学模型可称为线性的数据结构)和表、树和图之类的数据结构(描述非数值问题的数学模型时不能用数学方程)。
数据结构中*和&的区别是什么
应该是C++里的吧?没有在C语言版的数据结构中看见&吧?
在定义时,* 是一个标识符,声明该变量是一个指针,比如说int *p; 那p就是一个指向int型的指针;
在调用时,*p是指指针p指向的那个变量,比如说之前有int a=5;int *p=a;那么p的值是a的地址,也就是指针p指向a,*p则等于a的值,即*p=5。
而&,则是引用,比如说有定义int a=5;再定义int b=&a;那么这里的b则引用a的值,即b=5
,而再给b赋值:b=10,a的值也会变为10。
我想楼主会问*和&的区别,应该是针对函数定义里的参数而言吧,因为这里的这两者比较相似:
举几个简单例子:
先定义有int x=0;和int *p=x;
1、若定义函数: void fun_1(int a){ a=5;} , 则调用:fun_1(x); 之后,x还等于0;因为fun_1函数只改变了形参a的值,a只是fun_1函数里的局部变量,调用fun_1(x)相当于是“a=x;a=5;”,x没变;
2、若定义函数:void fun_2(int &a){ a=5;} , 则调用:fun_2(x); 之后,x等于5;因为这里的a引用了x的值;
3、若定义函数:void fun_3(int *a){ *a=5;} , 则调用:fun_3(p); 之后,x也等于5;因为fun_3函数的参数a是一个指针,相当于a=p;*a则与*p指向同一地址,改变*a即改变*p即x
数据结构都有哪些分类呢?
根据数据元素间关系的不同特性,将数据结构常分为下列四类基本的结构:
⑴ *** 结构。该结构的数据元素间的关系是“属于同一个 *** ”。
⑵线性结构。该结构的数据元素之间存在着一对一的关系。
⑶树型结构。该结构的数据元素之间存在着一对多的关系。
⑷图形结构。该结构的数据元素之间存在着多对多的关系,也称网状结构。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的 *** 。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构是什么?
呵呵,看你这样喜欢去想是什么的,将来肯定会知道的!但是既然问了,我就说一下我自己的见解!
其实,大家都说,数据结构+算法=程序!数据结构就是提供一个程序中数据的逻辑视图!什么逻辑视图呢?就是在你看起来你这样来组织你的数据!比如说一张地图!有很多城市,每个城市之间有很多路,每条路有距离!让你来求一下给定的两个城市的最短路!然后你就可用“无向图”来组织这张地图!就是用节点表示城市,边表示路,边的权表示路长度!接下来你的程序就可以用算法在这张图上(无向图)上来操作!可能用dijkstra算法来求两点之间的最短路!
数组是一种数据结构!虽然简单,但是她也是一种数据的存储方式,就是这样一个挨一个的存储!数组也有很多很好的性质!
说这么多呢!其实数据结构是数据的组织方式,为你的程序提供更高的效率,不管用
数组,链表(单向,双向,循环等等),堆栈(最大堆,最小堆),队列(优先级队列)树(二叉树,红黑树,AVL树,B+树等等)区间树,并查集,图等等都是对于特定的问题,来说你这样组织数据是你的程序更加高效而已!数据结构和算法,一个用来存储数据,一个用来操作数据!
什么是数据结构
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的 *** 。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
名词定义
数据结构是指相互之间存在着一种或多种关系的数据元素的 *** 和该 *** 中数据元素之间的关系组成。记为:
Data_Structure=(D,R)
其中D是数据元素的 *** ,R是该 *** 中所有元素之间的关系的有限 *** 。
其它定义
Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例和组成实 例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的 *** ”。
Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是ADT(抽象数据类型Abstract Data Type) 的物理实现。”
Robert L.Kruse在《数据结构与程序设计》一书中,将一个数据结构的设计过程分成抽象层、数据结构层和实现层。其中,抽象层是指抽象数据类型层,它讨论数据的逻辑结构及其运算,数据结构层和实现层讨论一个数据结构的表示和在计算机内的存储细节以及运算的实现。
数据结构具体指同一类数据元素中,各元素之间的相互关系,包括三个组成成分,数据的逻辑结构,数据的存储结构和数据运算结构。
研究对象
一、数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:
1. ***
2.线性结构
3.树形结构
4.图形结构
二、数据的物理结构:指数据的逻辑结构在计算机存储空间的存放形式。
三、数据结构的运算
数据结构有几种结构类型,分别是什么
如果指的是逻辑结构,分为4种: *** 、线性、树形、图形
如果指的是物理结构(也叫做存储结构),主要也是4种:顺序、链式、索引、散列
拓扑排序
队列是一种特殊的线性表,循环队列是将向量空间想象为一个首尾相接的圆环。
1、队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
2、循环队列是将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列。?在顺序队列中,当队尾指针已经到数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫做“假溢出”,解决假溢出的途径----采用循环队列。
扩展资料
判断队列满的情况:
1、count来计数;通常使用count
Count等于队列的MAXSIZE
2、Flag标志 int
入队列 flag=1 出队列flag=0
Front=rear&&flag==0
3、把一个存储单元空出来,不存放数据
Rear+1==front
注意事项:(不要) 顺序结构,SeqQueue myQueue;
百度百科—循环队列
1、堆栈
栈是一种特殊的线性表,插入或删除栈元素的运算只能在表的一端进行,称运算的一端为栈顶,另一端称为栈底。队列也是一种特殊的线性表(基本操作都是线性操作的子集)。
特点:后进先出
栈又称为“后进先出”的线性表,简称LIFO表。
栈的链式实现是以链表作为栈的存储结构,并在这种存储结构上实现栈的基本运算。栈的链式实现称为链栈。
2、有向无环图
描述含有公共子式的表达式的有效工具;
描述一项工程或系统的进行过程的有效工具。
3、一些概念
通常我们把计划、施工过程、生产流程、程序流程等都当成一个工程,一个大的工程常常被划分成许多较小的子工程,这些子工程称为活动。这些活动完成时,整个工程也就完成了。
我们用一种有向图来表示这些工程、计划等,在这种有向图中,顶点表示活动,有向边表示活动的优先关系,这种用顶点表示活动,用弧来表示活动间的优先关系的有向图叫做顶点表示活动的网络(Actire?On?Vertices)简称为AOV网。
拓扑排序:
假设G=(V,E)是一个具有n个顶点的有向图,V中顶点序列vl,v2,…,vn称做一个拓扑序列(TopologicalOrder),当且仅当该顶点序列满足下列条件:若在有向图G中存在从顶点vi到vj的一条路径,则在顶点序列中顶点vi必须排在顶点vj之前。通常,在AOV网中,将所有活动排列成一个拓扑序列的过程叫做拓扑排序(Topological?Sort)。
在AOV网中不应该出现有向环。因为环的存在意味着某项活动将以自己为先决条件,显然无法形成拓扑序列。
判定网中是否存在环的方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都出现在它的拓扑有序序列中,则该AOV网中一定不存在环。
4、拓扑排序的算法思想
输入AOV网络。令?n?为顶点个数。
(1)在AOV网络中选一个没有直接前驱的顶点,并输出之;
(2)从图中删去该顶点,?同时删去所有它发出的有向边;
重复以上步骤,直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。
5、拓扑排序算法的C语言描述
在实现拓扑排序的算法中,采用邻接表作为有向图的存储结构,每个顶点设置一个单链表,每个单链表有一个表头结点,在表头结点中增加一个存放顶点入度的域count,这些表头结点构成一个数组。
为了避免重复检测入度为0的点,另设一栈存放所有入度为0的点。
对于有n个顶点和e条边的有向图而言,for循环中建立入度为0的顶点栈时间为O(n);若在拓扑排序过程中不出现有向环,则每个顶点出栈、入栈和入度减1的操作在while循环语句中均执行e次,因此拓扑排序总的时间花费为O?(n+e)。
6、拓扑排序算法的C语言实现
#include"stdio.h"
#define?MAX_VERTEX_NUM20
#include"conio.h"
#include"stdlib.h"
#define?STACK_INIT_SIZE16
#define?STACKINCREMENT5
typedef? int?SElemType;
typedef?charVertexType;
typedef?struct
{
SElemType?*base;
SElemType?*top;
int?stacksize;
}SqStack;
//我们依然用邻接表来作图的存储结构
typedef?struct?ArcNode{
int?adjvex;
struct?ArcNode?*nextarc;
int?info;
}ArcNode;? //表结点类型
typedef?struct?VNode{
VertexType?data;
int?count;
ArcNode?*firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];//头结点
typedef?struct{
AdjList?vertices;? //邻接表
int?vexnum,arcnum;
}ALGraph;
int?InitStack(SqStack&S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)?exit(-1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return?1;
}//InitStack
int?Push(SqStack&S,SElemType?e)
{
if((S.top-S.base)>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base)?exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}//if
*(S.top)=e;
S.top++;
return?1;
}//Push
int?Pop(SqStack&S,SElemType?&e)
{
if(S.top==S.base)return?0;
--S.top;
e=*S.top;
return?1;
}//Pop
int?StackEmpty(SqStack&S)
{
if(S.top==S.base)return?1;
else?return?0;
}//StackEmpty
int?LocateVex(ALGraphG,char?u)
{
int?i;
for?(i=0;i<G.vexnum;i++)
{?if(u==G.vertices[i].data)?return?i;?}
if?(i==G.vexnum)?{printf("Error?u!\n");exit(1);}
return?0;
}
voidCreateALGraph_adjlist(ALGraph?&G)
{
int?i,j,k,w;
char?v1,v2,enter;
ArcNode?*p;
printf("Input?vexnum?&arcnum:\n");
scanf("%d",&G.vexnum);
scanf("%d",&G.arcnum);
printf("Input?Vertices(以回车隔开各个数据):\n");
for?(i=0;i<G.vexnum;i++)
{ ?scanf("%c%c",&enter,&G.vertices[i].data);//注意点,解说
G.vertices[i].firstarc=NULL;
}//for
printf("InputArcs(v1,v2,w)以回车分开各个数据:\n");
for?(k=0;k<G.arcnum;k++)
{
scanf("%c%c",&enter,&v1);
scanf("%c%c",&enter,&v2);
//scanf("%d",&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
//p->info?=?w;
p->nextarc=G.vertices[i].firstarc;?//前插法,即每次都插入到头结点的后面
G.vertices[i].firstarc=p;
printf("Next\n");
}//for
return;
}//CreateALGraph_adjlist
voidFindInDegree(ALGraph?&G)
{
int?i,j;
for(i=0;i<G.vexnum;i++)
{
G.vertices[i].count=0;
}//for
for(j=0;j<G.vexnum;j++)
{
//G.vertices[i].count++;
for(ArcNode*p=G.vertices[j].firstarc;p;p=p->nextarc)
G.vertices[p->adjvex].count++;
}//for
}//FindInDegree
int?TopoSort(ALGraph&G)
{
SqStack?S;
FindInDegree(G);
InitStack(S);
for(inti=0;i<G.vexnum;i++)
if(G.vertices[i].count==0)?Push(S,i);
int?countt=0;
while(!StackEmpty(S))
{
int?i,m;
m=Pop(S,i);
printf("?%c",G.vertices[i].data);?++countt;
for(ArcNode?*p=G.vertices[i].firstarc;p;p=p->nextarc)
{ int?k;
k=p->adjvex;
if(!(--G.vertices[k].count))?Push(S,k);
}//for
}//while
if(countt<G.vexnum)?return?0;
else?return?1;
}//TopoSort
int?main()
{
ALGraph?G;
CreateALGraph_adjlist(G);
TopoSort(G);
return?1;
}
7、malloc函数和realloc函数
realloc:?void?*realloc(void?*block,?size_t?size),将block所指存储块调整为大小size,返回新块的地址。如能满足要求,新块的内容与原块一致;不能满足要求时返回NULL,此时原块不变。
malloc:void?*malloc(size_t?size):分配一块足以存放大小为size的存储,返回该存储块的地址,不能满足时返回NULL。关于“数据结构有什么?”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!
本文来自作者[小凡]投稿,不代表璟盛号立场,如若转载,请注明出处:https://m.hoppeake.com/zixun/202602-914.html
评论列表(3条)
我是璟盛号的签约作者“小凡”
本文概览:网上有关“数据结构有什么?”话题很是火热,小编也是针对数据结构有什么?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。常用数据结构有哪些...
文章不错《数据结构有什么-》内容很有帮助