广工anyview数据结构第八章(2021.12)

广工anyview数据结构习题第八章,

在学习过程中部分题目参考了Giyn 、戮漠、雁过留痕等大佬的代码,在此感谢。

题目解法不是最优解,但希望能给大家有所启发。同时也发了文档资源,需要可自取。

如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是) 

(骗一下数据,说不定以后面试就过了,拜谢)

目录

DC08PE12

DC08PE15

DC08PE17

DC08PE21

DC08PE22

DC08PE32

DC08PE34


DC08PE12

编写算法,创建有向图的邻接数组存储结构。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED  0
#define VISITED    1  
#define MAX_VEX_NUM  4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
    VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
                // 对带权图,则为权值类型
    InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;//,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
  ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
  VexType vexs[MAX_VEX_NUM]; // 顶点数组
  int n, e;   // 顶点数和边(弧)数
  GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
typedef struct {
  VexType v, w;
  int inf;
} ArcInfo;
可调用以下基本操作:
Status InitGraph(MGraph &G, GraphKind kind, int n);
  // 初始化含n个顶点空间的kind类的空图G
int LocateVex(MGraph G, VexType v); // 查找顶点v在图G中的位序
要求实现以下函数:
Status CreateDG(MGraph &G, VexType *vexs, int n,  ArcInfo *arcs, int e)
/* 创建含n个顶点和e条边的有向图G,vexs为顶点信息,arcs为边信息 */

#include "allinclude.h"  //DO NOT edit this line
Status CreateDG(MGraph &G, VexType *vexs, int n,
                           ArcInfo *arcs, int e) 
{    // Add your code here
if(n<0 || (n>0 && vexs==NULL))
  return ERROR;

if(InitGraph(G,DG,n) != OK)
  return ERROR;
  
int i,vn,wn,info=1;
VexType v,w ; 
G.e=e;
G.n=n;
for(i=0;i<G.n;i++)
  G.vexs[i]=vexs[i];
for(i=0;i<G.e;i++)  
{  
  v=arcs[i].v;
  w=arcs[i].w;
  vn=LocateVex(G,v);
  wn=LocateVex(G,w);
  G.arcs[vn][wn].adj=info;
}

return OK;

}

DC08PE15

编写算法,在图G中,相对于k顶点的当前邻接顶点m顶点,求下一个邻接顶点。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED  0
#define VISITED    1  
#define MAX_VEX_NUM  4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
    VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
                        // 对带权图,则为权值类型
    InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;        //AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
  ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
  VexType vexs[MAX_VEX_NUM]; // 顶点数组
  int n, e;   // 顶点数和边(弧)数
  GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
要求实现以下函数:
int NextAdjVex(MGraph G, int k, int m)
/* 在图G中,相对于k顶点的当前邻接顶点m顶点,求下一个邻接顶点 */

#include "allinclude.h"  //DO NOT edit this line
int NextAdjVex(MGraph G, int k, int m) 
{   // Add your code here
if(G.n==0)
  return 0;
if(k<0 || k>G.n || G.e<2)
  return -1;
int i=m+1;
for(;i<G.n;i++)
{
  if(G.kind==UDG || G.kind==DG && (G.arcs[k][i].adj==1 ) &&(i!=k) )
    return i;
  if(G.arcs[k][i].adj!=INFINITY && (i!=k))
    return i;
}

return -1;

}

DC08PE17

编写算法,在图G中置顶点v到顶点w的弧或边。
图的邻接数组存储结构的类型定义如下:
#define UNVISITED  0
#define VISITED    1  
#define MAX_VEX_NUM  4
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef int VRType;
typedef char InfoType;
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct {
    VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;
                // 对带权图,则为权值类型
    InfoType *info; // 该弧相关信息的指针(可无)
}ArcCell;//,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
  ArcCell arcs[MAX_VEX_NUM][MAX_VEX_NUM]; // 关系数组
  VexType vexs[MAX_VEX_NUM]; // 顶点数组
  int n, e;   // 顶点数和边(弧)数
  GraphKind kind; // 图的类型
} MGraph; // 邻接数组类型
可调用以下基本操作:
int LocateVex(MGraph G, VexType v); // 查找顶点v在图G中的位序
要求实现以下函数:
Status SetArc(MGraph &G, VexType v, VexType w, ArcCell info)
/* 在图G中设置顶点v到顶点w的弧或边 */

/*从顶点v到w的弧或边的信息为info变量*/

#include "allinclude.h"  //DO NOT edit this line
Status SetArc(MGraph &G, VexType v, VexType w, ArcCell info) 
{  // Add your code here
int vn,wn;
vn=LocateVex(G,v);
wn=LocateVex(G,w);
G.arcs[vn][wn]=info;
G.e++;
}

DC08PE21

编写算法,计算以邻接表方式存储的有向图G中k顶点的出度。
图的邻接表存储结构的类型定义如下:
#define UNVISITED  0
#define VISITED    1  
#define INFINITY MAXINT // 计算机允许的整数最大值,即∞
typedef char VexType;
typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网
typedef struct AdjVexNode {
  int adjvex;  // 邻接顶点在顶点数组中的位序
  struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)
  int info;    // 存储边(弧)相关信息,对于非带权图可不用
} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型
typedef struct VexNode {
  VexType data;    // 顶点值,VexType是顶点类型,由用户定义
  struct AdjVexNode *firstArc; // 邻接链表的头指针
} VexNode; // 顶点数组的元素类型
typedef struct {
  VexNode *vexs;  // 顶点数组,用于存储顶点信息
  int n, e;       // 顶点数和边(弧)数
  GraphKind kind; // 图的类型
  int *tags;      // 标志数组
} ALGraph;  // 邻接表类型
要求实现以下函数:
int outDegree(ALGraph G, int k) 
/* 求有向图G中k顶点的出度。若k顶点不存在,则返回-1 */

#include "allinclude.h"  //DO NOT edit this line
int outDegree(ALGraph G, int k) 
{  // Add your code here
if(k<0 || k>G.n)
  return -1;
int Degree=0;
AdjVexNode * temp= G.vexs[k].firstArc;
for(;temp!=NULL;temp=temp->next)
{
  Degree++;
}
return Degree;
}

DC08PE22

编写算法,计算以邻接表方式存储的有向图G中k顶点的入度。

图的邻接表存储结构的类型定义如下:

#define UNVISITED  0

#define VISITED    1  

#define INFINITY MAXINT // 计算机允许的整数最大值,即∞

typedef char VexType;

typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网

typedef struct AdjVexNode {

  int adjvex;  // 邻接顶点在顶点数组中的位序

  struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)

  int info;    // 存储边(弧)相关信息,对于非带权图可不用

} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型

typedef struct VexNode {

  VexType data;    // 顶点值,VexType是顶点类型,由用户定义

  struct AdjVexNode *firstArc; // 邻接链表的头指针

} VexNode; // 顶点数组的元素类型

typedef struct {

  VexNode *vexs;  // 顶点数组,用于存储顶点信息

  int n, e;       // 顶点数和边(弧)数

  GraphKind kind; // 图的类型

  int *tags;      // 标志数组

} ALGraph;  // 邻接表类型

要求实现以下函数:

int inDegree(ALGraph G, int k)

/* 求有向图G中k顶点的入度。若k顶点不存在,则返回-1 */

#include "allinclude.h"  //DO NOT edit this line
int inDegree(ALGraph G, int k) 
{   // Add your code here
if(k<0 || k>G.n)
  return -1;
int Degree=0,i=0;
AdjVexNode * temp;
for(;i<G.n;i++)
{
  if(i==k)
   continue;
  
  for(temp = G.vexs[i].firstArc;temp!=NULL;temp=temp->next)
  {
    if(temp->adjvex==k)
     {  Degree++;
        break;
     }
  }
}
return Degree;

}

DC08PE32

编写算法,创建有向图的邻接表存储结构。

图的邻接表存储结构的类型定义如下:

#define UNVISITED  0

#define VISITED    1  

#define MAX_VEX_NUM  4

#define INFINITY MAXINT // 计算机允许的整数最大值,即∞

typedef char VexType;

typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网

typedef struct AdjVexNode {

  int adjvex;  // 邻接顶点在顶点数组中的位序

  struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)

  int info;    // 存储边(弧)相关信息,对于非带权图可不用

} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型

typedef struct VexNode {

  VexType data;    // 顶点值,VexType是顶点类型,由用户定义

  struct AdjVexNode *firstArc; // 邻接链表的头指针

} VexNode; // 顶点数组的元素类型

typedef struct {

  VexNode vexs[MAX_VEX_NUM];  // 顶点数组,用于存储顶点信息

  int n, e;       // 顶点数和边(弧)数

  GraphKind kind; // 图的类型

  int *tags;      // 标志数组

} ALGraph;  // 邻接表类型

可调用以下基本操作:

int LocateVex(ALGraph G, VexType v); // 查找顶点v在图G中的位序

要求实现以下函数:

Status CreateDG(ALGraph &G, VexType *vexs, int n, ArcInfo *arcs, int e)

/* 创建含n个顶点和e条边的有向图G,vexs为顶点信息,arcs为边信息 */

#include "allinclude.h"  //DO NOT edit this line
Status CreateDG(ALGraph &G, VexType *vexs, int n,
                            ArcInfo *arcs, int e) 
{  // Add your code here
if(n<0 || (n>0 && vexs==NULL) )
  return ERROR;
int i,vn,wn;
VexType v,w;
G.n=n;
G.e=e;

for(i=0;i<G.n;i++)
{
  G.vexs[i].data=vexs[i];
  G.vexs[i].firstArc=NULL;
}

for(i=0;i<G.e;i++)
{
  v=arcs[i].v;
  w=arcs[i].w;
  vn=LocateVex(G,v);
  wn=LocateVex(G,w);
  AdjVexNode * newnode=(AdjVexNode*)malloc(sizeof(AdjVexNode) );
  newnode->adjvex=wn;
  newnode->next=G.vexs[vn].firstArc;
  G.vexs[vn].firstArc=newnode;
  
}

return OK;
}

DC08PE34

编写算法,创建无向图的邻接表存储结构。

图的邻接表存储结构的类型定义如下:

#define UNVISITED  0

#define VISITED    1  

#define MAX_VEX_NUM  4

#define INFINITY MAXINT // 计算机允许的整数最大值,即∞

typedef char VexType;

typedef enum {DG,DN,UDG,UDN} GraphKind; // 有向图,有向网,无向图,无向网

typedef struct AdjVexNode {

  int adjvex;  // 邻接顶点在顶点数组中的位序

  struct AdjVexNode *next; // 指向下一个邻接顶点(下一条边或弧)

  int info;    // 存储边(弧)相关信息,对于非带权图可不用

} AdjVexNode, *AdjVexNodeP; // 邻接链表的结点类型

typedef struct VexNode {

  VexType data;    // 顶点值,VexType是顶点类型,由用户定义

  struct AdjVexNode *firstArc; // 邻接链表的头指针

} VexNode; // 顶点数组的元素类型

typedef struct {

  VexNode vexs[MAX_VEX_NUM]; //*vexs; 顶点数组,用于存储顶点信息

  int n, e;       // 顶点数和边(弧)数

  GraphKind kind; // 图的类型

  int *tags;      // 标志数组

} ALGraph;  // 邻接表类型

可调用以下基本操作:

int LocateVex(ALGraph G, VexType v);  // 查找顶点v在图G中的位序

要求实现以下函数:

Status CreateUDG(ALGraph &G, VexType *vexs, int n, ArcInfo *arcs, int e)

/* 创建含n个顶点和e条边的无向图G,vexs为顶点信息,arcs为边信息 */

#include "allinclude.h"  //DO NOT edit this line
Status CreateUDG(ALGraph &G, VexType *vexs, int n,
                             ArcInfo *arcs, int e) 
{  // Add your code here
if(n<0 || (n>0 && vexs==NULL) )
  return ERROR;
int i,vn,wn;
VexType v,w;
G.n=n;
G.e=e;
AdjVexNode* temp;
AdjVexNode* temp1;
for(i=0;i<G.n;i++)
{
  G.vexs[i].data=vexs[i];
  G.vexs[i].firstArc=NULL;
}

 for(i=0;i<G.e;i++)
 {
        v = arcs[i].v; w = arcs[i].w;
        vn=LocateVex(G,v);
        wn=LocateVex(G,w);
        if(vn<0||wn<0) return ERROR;
        temp=(AdjVexNode*)malloc(sizeof(AdjVexNode));
        
        temp->adjvex = wn;
        temp->next=G.vexs[vn].firstArc;
        G.vexs[vn].firstArc = temp; 
        
        temp1= (AdjVexNode*)malloc(sizeof(AdjVexNode));
       
        temp1->adjvex = vn;
        temp1->next=G.vexs[wn].firstArc;
        G.vexs[wn].firstArc = temp1;
  }
    return OK;

}

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凛_Lin~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值