【数据结构】— —邻接矩阵和邻接表存储图结构

简介: 【数据结构】— —邻接矩阵和邻接表存储图结构

🎯目的:

1、掌握图结构的静态及操作特点;

2、掌握图结构的静态存储和常见操作在C语言环境中的实现方法;

3、掌握图结构的遍历算法在C语言环境中的实现方法。

4、理解求最小生成树、最短路径、关键路径的算法实现。


🎯内容:

1、会使用邻接矩阵的方式存储图片,并实现相应操作。

2、会使用邻接表的方式存储图片,并实现相应操作。


🎯环境:

TC或VC++。

🎯步骤:

要求:

内容1——邻接矩阵

(1)使用邻接矩阵的方式存储上边无向图;

(2)以矩阵的形式输出无向图;

(3)在邻接矩阵的基础上实现深度优先遍历和广度优先遍历。

邻接矩阵存储图代码:

#include "iostream"
using namespace std;
#define MaxInt 0
#define MVNum 100
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int Status;
typedef struct{
  VerTexType vexs[MVNum];//顶点 
  ArcType arcs[MVNum][MVNum];//邻接矩阵 
  int vexnum,arcnum;//当前的点数和边数 
}AMGraph;
Status CreateUDN(AMGraph &G){
  cout<<"请输入总顶点数和总边数:"<<endl; 
  cin>>G.vexnum>>G.arcnum;//输入总顶点数和总边数
  cout<<"请输入各点的信息:"<<endl;
  for(int i=0;i<G.vexnum;i++)//输入各点信息 
    cin>>G.vexs[i];
  for(int i=0;i<G.vexnum;i++) //初始化邻接矩阵
    for(int j=0;j<G.vexnum;j++)
      G.arcs[i][j]=MaxInt;
  for(int k=0;k<G.arcnum;k++){
    int i,j,v1,v2,w;
    cout<<"请输入两个点的信息及权值:"<<endl;
    cin>>v1>>v2>>w;
    i=v1-1;j=v2-1;
    G.arcs[i][j]=w;
    G.arcs[j][i]=G.arcs[i][j];
  } 
  return OK;
}
int main(){
  AMGraph g;
  CreateUDN(g);
  cout<<"无向图邻接矩阵如下:"<<endl;
  for(int i=0;i<g.vexnum;i++){
    for(int j=0;j<g.vexnum;j++)
      printf("%5d",g.arcs[i][j]);
    cout<<endl;
 }  
}


内容2——邻接表

(1)使用邻接表的方式存储图;

(2)以邻接表的形式输出该图;

(3)(选做)实现深度优先遍历和广度优先遍历。

邻接表存储图代码:

#include "iostream"
using namespace std;
#define MVNum 100
#define OK 1
typedef int OtherInfo;
typedef int Status;
typedef int VerTexType;
typedef struct ArcNode{//边结点 
  int adjvex;//该边所指向的顶点位置
  struct ArcNode *nextarc;//指向下一条边的指针
  OtherInfo info;//和边相关的信息 
}ArcNode;
typedef struct VNode//顶点信息 
{
  VerTexType data; 
  ArcNode *firstarc;//指向第一条依附于带顶点的边和指针 
}VNode,AdjList[MVNum];
typedef struct{
  AdjList vertices;
  int vexnum,arcnum;//图的当前顶点数和边数 
}ALGraph;
Status CreateUDG(ALGraph &G){
  cout<<"输入顶点数和总边数"<<endl;
  cin>>G.vexnum>>G.arcnum;
  cout<<"输入各点"<<endl;
  for(int i=0;i<G.vexnum;i++){//输入各点,构建表头结点
    cin>>G.vertices[i].data;
    G.vertices[i].firstarc=NULL;
  }  
  for(int k=0;k<G.arcnum;k++)//输入各边,构造边表 
  { int v1,v2,i,j;
    cout<<"请输入一条边依附的两个顶点:"<<endl; 
    cin>>v1>>v2;
    i=v1-1;
    j=v2-1;
    ArcNode *p1;
    p1=new ArcNode;
    p1->adjvex=j;//邻接点的序号为j;
    p1->nextarc=G.vertices[i].firstarc;
    G.vertices[i].firstarc=p1;
    ArcNode* p2=new ArcNode;
    p2->adjvex=i;
    p2->nextarc=G.vertices[j].firstarc;
    G.vertices[j].firstarc=p2;
  }
  return OK;
}
  Status PrintUDG(ALGraph G) {    //邻接表输出图
    for(int i = 0; i < G.vexnum; i++){     //遍历图中每一个点
        cout << i+1 << "(" << G.vertices[i].data << "):";    //输出当前点的标号和值
        ArcNode *p = G.vertices[i].firstarc;    //指向当前点的第一条边
        while(p) {      //输出与当前点相连的所有点的标号和值
            cout << p->adjvex + 1 << "(" << G.vertices[p->adjvex].data << ")" << "->";
            p = p->nextarc;
        }
        cout << "NULL" << endl;
    }
    return OK;
}
int main(){
  ALGraph g;
  CreateUDG(g);
  PrintUDG(g);
}
相关文章
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
3月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
149 16
|
5月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
4月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
4月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
4月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
4月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
53 1
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77

热门文章

最新文章