广工anyview数据结构习题第八章,
在学习过程中部分题目参考了Giyn 、戮漠、雁过留痕等大佬的代码,在此感谢。
题目解法不是最优解,但希望能给大家有所启发。同时也发了文档资源,需要可自取。
如果对你有帮助,可以给卑微的博主留个赞、关注、收藏 (不是)
(骗一下数据,说不定以后面试就过了,拜谢)
目录
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;
}