数据结构图的存储结构及基本操作
- 格式:pdf
- 大小:207.68 KB
- 文档页数:13
数据结构中常用的逻辑结构和存储结构一、概念数据是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。
结构是元素之间的关系的集合。
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。
数据结构有逻辑上的数据结构和物理上的数据结构之分。
逻辑上的数据结构反映成分数据之间的逻辑关系即逻辑结构,而物理上的数据结构反映成分数据在计算机内部的存储安排即存储结构。
数据结构是数据存在的形式。
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。
因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。
通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
因而研究数据结构的逻辑结构与存储结构显得十分重要。
二、结构分析(一)逻辑结构数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构。
逻辑结构形式地定义为(K,R)(或(D,S)),其中,K是数据元素的有限集,R是K上的关系的有限集。
逻辑结构元素决定输入、存储、发送、处理和信息传递的基本操作功能,常将逻辑结构元素称为逻辑模块。
逻辑结构元素可以是计算机操作系统、终端模块、通信程序模块等。
逻辑结构元素还可以是相关的几个逻辑模块联合起来的更复杂的实体。
分析逻辑结构元素的相互作用,应考虑整个系统的操作,研究处理与信息流有关的进程(操作系统中的一个概念,表示程序的一次执行),并决定系统的逻辑资源。
逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。
表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现。
中原工学院《数据结构》实验报告学院:计算机学院专业:计算机科学与技术班级:计科112姓名:康岩岩学号:201100814220 指导老师:高艳霞2012-11-22实验五图的基本操作一、实验目的1、使学生可以巩固所学的有关图的基本知识。
2、熟练掌握图的存储结构。
3、熟练掌握图的两种遍历算法。
二、实验内容[问题描述]对给定图,实现图的深度优先遍历和广度优先遍历。
[基本要求]以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。
以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
【测试数据】由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作1、掌握图的相关概念。
2、掌握图的逻辑结构和存储结构。
3、掌握图的两种遍历算法的实现。
四、实验报告要求1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
【设计思路】【代码整理】#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;typedef int Status;#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX_SIZE 20typedef enum{DG,DN,UDG,UDN}Kind;typedef struct ArcNode{int adjvex; //顶点位置struct ArcNode *nextarc; //下一条弧int *info; //弧信息};typedef struct{char info[10]; //顶点信息ArcNode *fistarc; //指向第一条弧}VNode,AdjList[MAX_SIZE];typedef struct{AdjList vertices;int vexnum,arcnum; //顶点数,弧数int kind; //图的种类,此为无向图}ALGraph;//这是队列的节点,仅用于广度优先搜索typedef struct Node{int num;struct Node* next;};//队列的头和尾typedef struct{Node * front;Node *rear;}PreBit;int LocateV ex(ALGraph G,char info[]);//定位顶点的位置Status addArcNode(ALGraph &G,int adjvex); //图中加入弧Status CreatGraph(ALGraph&G);//创建图的邻接表Status DFSTraverse(ALGraph G);//深度优先搜索Status BFSTraverse(ALGraph G);//广度优先搜索Status DFS(ALGraph G,int v);//深度优先搜索中的数据读取函数,用于递归bool visited[MAX_SIZE]; // 访问标志数组//初始化队列Status init_q(PreBit&P_B){P_B.front=P_B.rear=(Node*)malloc(sizeof(Node));if(!P_B.front){exit(OVERFLOW);}P_B.front->next=NULL;}//将数据入队Status en_q(PreBit & P_B,int num){Node *p=(Node*)malloc(sizeof(Node));if(!p){exit(OVERFLOW);}p->num=num;p->next=NULL;P_B.rear->next=p;P_B.rear=p;return OK;}//出队Status de_q(PreBit & P_B){if(P_B.front==P_B.rear){return ERROR;}Node* p=P_B.front->next;P_B.front->next=p->next;if(P_B.rear==p){P_B.rear=P_B.front;}free(p);return OK;}Status CreatGraph(ALGraph&G){cout<<"请输入顶点数目和弧数目"<<endl;cin>>G.vexnum>>G.arcnum;//依次输入顶点信息for(int i=0;i<G.vexnum;i++){cout<<"请输入顶点名称"<<endl;cin>>G.vertices[i].info;G.vertices[i].fistarc=NULL;}//依次输入弧信息for(int k=1;k<=G.arcnum;k++){char v1[10],v2[10]; //用于表示顶点名称的字符数组int i,j; //表示两个顶点的位置BACK: //返回点cout<<"请输入第"<<k<<"条弧的两个顶点"<<endl;cin>>v1>>v2;i=LocateV ex(G,v1); //得到顶点v1的位置j=LocateV ex(G,v2); //得到顶点v2的位置if(i==-1||j==-1){ //头信息不存在则返回重输cout<<"不存在该节点!"<<endl;goto BACK; //跳到BACK 返回点}addArcNode(G,i); //将弧的顶点信息插入表中addArcNode(G,j);}return OK;}//倒序插入弧的顶点信息Status addArcNode(ALGraph &G,int adjvex){ArcNode *p; //弧节点指针p=(ArcNode*)malloc(sizeof(ArcNode));p->adjvex=adjvex;p->nextarc=G.vertices[adjvex].fistarc;//指向头结点的第一条弧G.vertices[adjvex].fistarc=p; //头结点的第一条弧指向p,即将p作为头结点的第一条弧return OK;}//定位顶点的位置int LocateV ex(ALGraph G,char info[]){for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertices[i].info,info)==0){ //头结点名称与传入的信息相等,证明该头节点存在return i; //此时返回位置}}return -1;}//深度优先搜索Status DFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int i;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;i=LocateV ex(G,v1);if(i==-1){cout<<"不存在该节点!"<<endl;goto BACK;}DFS(G,i);return OK;}//深度优先搜索递归访问图Status DFS(ALGraph G,int v){visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息ArcNode *p;p=G.vertices[v].fistarc; //向头节点第一条while(p) //当弧存在{if(!visited[p->adjvex]){DFS(G,p->adjvex); //递归读取}p=p->nextarc;}return OK;}//广度优先搜索Status BFSTraverse(ALGraph G){for(int v=0;v<G.vexnum;v++){visited[v]=false;}char v1[10];int v;BACK:cout<<"请输入首先访问的顶点"<<endl;cin>>v1;v=LocateV ex(G,v1);if(v==-1){cout<<"不存在该节点!"<<endl;goto BACK;}PreBit P_B;init_q(P_B);ArcNode *p;visited[v]=true;cout<<G.vertices[v].info<<" ";//输出信息en_q(P_B,v); //将头位置v入队while(P_B.front!=P_B.rear){//当队列不为空时,对其进行访问int w=P_B.front->next->num;//读出顶点位置de_q(P_B);//顶点已经访问过,将其出队列p=G.vertices[w].fistarc;//得到与顶点相关的第一条弧while(p){if(!visited[p->adjvex]){en_q(P_B,p->adjvex);//将弧入队,但不读取,只是将其放在队尾}p=p->nextarc;}}return OK;}int _tmain(int argc, _TCHAR* argv[]){ALGraph G;CreatGraph(G);cout<<"深度优先搜索图:"<<endl;DFSTraverse(G);cout<<endl;cout<<"广度优先搜索图:"<<endl;BFSTraverse(G);cout<<endl;system("pause");return 0;}。
数据结构图知识点总结高中一、线性结构1. 线性表线性表是数据结构中最基本的一种结构,它是由零个或多个数据元素构成的有限序列。
其中每个数据元素都只有一个前驱元素和一个后继元素,除了第一个和最后一个元素外,其他元素都有且仅有一个前驱和一个后继。
线性表有两种基本的存储结构,分别是顺序存储结构和链式存储结构。
顺序存储结构是利用一组地址连续的存储单元来存放线性表的数据元素,而链式存储结构是通过指针来表示数据元素之间的逻辑关系。
2. 栈栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。
栈有一个被称为栈顶的元素,只能在栈顶进行插入和删除操作。
栈有两种经典的存储结构,分别是顺序栈和链式栈。
顺序栈是利用数组来实现栈的存储和操作,而链式栈则是利用链表来实现栈的存储和操作。
3. 队列队列也是一种特殊的线性表,它只能在表的两端进行插入和删除操作。
队列有一个被称为队头和队尾的元素,只能在队头进行删除操作,只能在队尾进行插入操作。
队列也有两种经典的存储结构,分别是顺序队列和链式队列。
顺序队列是利用数组来实现队列的存储和操作,而链式队列则是利用链表来实现队列的存储和操作。
4. 串串是线性表的一种特殊形式,它是由零个或多个字符构成的有限序列。
串的存储结构有两种常见的形式,分别是顺序存储结构和链式存储结构。
顺序存储结构是利用数组来存储串的字符序列,而链式存储结构是利用链表来存储串的字符序列。
二、非线性结构1. 树树是一种非线性结构,它是由n (n ≥ 1) 个节点组成的有限集合,这些节点之间存在着明确的层次关系。
树的存储结构通常有两种形式,分别是双亲表示法和孩子表示法。
双亲表示法通过数组来存储树的节点和节点之间的关系,而孩子表示法则通过链表来存储树的节点和节点之间的关系。
树有许多种特殊形式,如二叉树、平衡二叉树、多路查找树等。
其中,二叉树是一种特殊的树,它的每个节点最多有两个子节点,这两个子节点被称为左子树和右子树。
2. 图图是一种非线性结构,它是由一组顶点和一组边组成的数据结构。
数据结构流程图数据结构是计算机科学中非常重要的概念之一,它用于描述数据元素之间的关系和存储方式。
而流程图则是一种用于表示算法、操作过程或系统设计的图形化工具。
在计算机科学领域中,流程图常用于描述算法和程序设计过程。
本文将探讨数据结构流程图的相关概念和使用方法。
一、概述数据结构流程图是一种使用标准符号和连线来表示数据结构及其操作的图形化工具。
它包括了各种数据结构的表示方法和基本操作的实现流程。
通过使用数据结构流程图,人们可以清晰地了解数据元素之间的关系以及各种操作的执行过程。
二、符号表示数据结构流程图使用了一系列标准化的符号来表示不同类型的数据结构和操作。
下面是几种常用的符号表示:1. 开始/结束符号:用于表示程序的开始和结束点,通常使用圆角矩形来表示。
2. 输入/输出符号:用于表示输入或输出操作,通常使用矩形或平行四边形来表示。
3. 过程符号:用于表示具体的执行过程,通常使用矩形来表示。
4. 判断符号:用于表示条件分支和判断操作,通常使用菱形来表示。
5. 箭头线:用于表示不同符号之间的流向,表示数据或控制信息的传输方向。
三、使用方法数据结构流程图的使用方法可以分为以下几个步骤:1. 定义数据结构:根据实际需求,确定所需的数据结构类型,例如数组、链表、栈、队列等。
2. 设计算法流程:根据数据结构的特点和需求,设计相应的算法流程,包括数据的插入、删除、查找等操作。
3. 表示数据结构:使用符号表示数据结构及其属性,例如使用方框表示数组,使用箭头表示指针等。
4. 表示算法流程:使用符号表示算法流程,包括条件判断、循环操作、数据的移动等。
5. 绘制流程图:根据之前的设计,将数据结构和算法流程以符号形式绘制在图形界面上,使用箭头线表示数据流向。
6. 调试和改进:通过对流程图的分析和调试,发现问题并进行改进,保证算法的正确性和高效性。
四、实例演示以下是一个使用数据结构流程图描述数组插入操作的示例:思路:1. 输入待插入的元素和插入位置;2. 检查插入位置是否合法;3. 如果合法,将插入位置后的元素依次向后移动一个位置;4. 将待插入的元素放入插入位置处;5. 输出修改后的数组。
数据结构图的存储结构及基本操作数据结构图的存储结构及基本操作1·引言数据结构图是一种用来描述数据元素之间关系的图形结构,它可以表示实体之间的联系和依赖关系。
本文将介绍数据结构图的存储结构及基本操作。
2·存储结构2·1 邻接矩阵邻接矩阵是使用二维数组来表示数据结构图中各个节点之间的关系。
矩阵的行和列代表节点,如果两个节点之间存在边,则矩阵相应位置的值为1,否则为0。
2·2 邻接表邻接表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有一个链表,链表中的每个元素表示与该节点相邻的节点。
2·3 十字链表十字链表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有两个链表,一个表示该节点指向的节点,另一个表示指向该节点的节点。
2·4 邻接多重表邻接多重表是使用链表来表示数据结构图中各个节点之间的关系。
每个节点都有一个链表,链表中的每个元素表示与该节点相邻的边。
3·基本操作3·1 创建图创建一个空的数据结构图,根据需要选择适当的存储结构。
3·2 插入节点在数据结构图中插入一个节点,并建立与其他节点的关系。
3·3 删除节点从数据结构图中删除一个节点,并删除与其他节点的关系。
3·4 插入边在数据结构图中插入一条边,连接两个节点。
3·5 删除边从数据结构图中删除一条边,断开两个节点的连接。
3·6 遍历图按照某种规则遍历整个数据结构图,访问每个节点。
本文档涉及附件:无本文所涉及的法律名词及注释:1·邻接矩阵:用于表示图的存储结构,矩阵的行和列代表图的节点,矩阵的值表示节点之间的连接关系。
2·邻接表:用于表示图的存储结构,每个节点都有一个链表,链表中的每个元素表示与该节点相邻的节点。
3·十字链表:用于表示图的存储结构,每个节点都有两个链表,一个表示该节点指向的节点,另一个表示指向该节点的节点。