详细解释一下这段代码 int LocateVertex(AdjList* G, VertexData v) { int k; for (k = 0; k < G->vexnum; k++) { if (G->vertex[k].data == v) break; } return k; } int CreateAdjList(AdjList* G) { int i, j, k; VertexData v1, v2; ArcNode* p; printf("输入图的顶点数和弧数:"); scanf("%d%d", &G->vexnum, &G->arcnum); printf("输入图的顶点:"); for (i = 0; i < G->vexnum; i++) { G->vertex[i].firstarc = NULL; } for (k = 0; k < G->arcnum; k++) { printf("输入第%d条弧的两个顶点:", k + 1); scanf(" %c %c", &v1, &v2); i = LocateVertex(G, v1); j = LocateVertex(G, v2); p = (ArcNode*)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G->vertex[i].firstarc; G->vertex[i].firstarc = p; } }
时间: 2023-12-10 17:06:05 浏览: 171
这段代码是一个创建邻接表的函数,用于表示图的数据结构。它包括两个函数:LocateVertex和CreateAdjList。
LocateVertex函数用于在邻接表中查找指定顶点数据v的位置。它通过遍历邻接表中的顶点,逐个比较顶点的数据与v是否相等,如果相等则返回该顶点的位置k,否则继续查找。最后返回k。
CreateAdjList函数用于创建邻接表。首先,它会提示用户输入图的顶点数和弧数,并将输入的值保存到G的成员变量vexnum和arcnum中。然后,它会提示用户输入图的每个顶点,并将每个顶点的firstarc指针初始化为NULL。
接下来,它会循环读取用户输入的弧的两个顶点v1和v2,并通过调用LocateVertex函数找到它们在邻接表中的位置i和j。然后,它会动态分配一个新的ArcNode节点,并将j赋值给该节点的adjvex成员变量。接着,它将该节点插入到第i个顶点的firstarc指针所指向的链表的头部。最后,循环结束后,邻接表创建完成。
总体来说,这段代码实现了根据用户输入创建一个无向图的邻接表表示。
相关问题
完善以下代码 //算法6.2 采用邻接表表示法创建无向图 #include <iostream> using namespace std; #define MVNum 100 //最大顶点数 #define OK 1 typedef char VerTexType; //顶点信息 typedef int OtherInfo; //和边相关的信息 //- - - - -图的邻接表存储表示- - - - - typedef struct ArcNode{ //边结点 int adjvex; //该边所指向的顶点的位置 struct ArcNode *nextarc; //指向下一条边的指针 OtherInfo info; //和边相关的信息 }ArcNode; typedef struct VNode{ VerTexType data; //顶点信息 ArcNode *firstarc; //指向第一条依附该顶点的边的指针 }VNode, AdjList[MVNum]; //AdjList表示邻接表类型 typedef struct{ AdjList vertices; //邻接表 int vexnum, arcnum; //图的当前顶点数和边数 }ALGraph; int LocateVex(ALGraph G , VerTexType v){ //确定点v在G中的位置 for(int i = 0; i < G.vexnum; ++i) if(G.vertices[i].data == v) return i; return -1; }//LocateVex int CreateUDG(ALGraph &G){ }//CreateUDG int main(){ //cout << "************算法6.2 采用邻接表表示法创建无向图**************" << endl << endl; ALGraph G; CreateUDG(G); int i; cout << endl; //cout << "*****邻接表表示法创建的无向图*****" << endl; for(i = 0 ; i < G.vexnum ; ++i){ VNode temp = G.vertices[i]; ArcNode *p = temp.firstarc; if(p == NULL){ cout << G.vertices[i].data; cout << endl; } else{ cout << temp.data; while(p){ cout << "->"; cout << p->adjvex; p = p->nextarc; } } cout << endl; } return 0; }//main 测试输入: 3 2 A B V A B A V 预期输出: A->2->1 B->0 V->0
完善的代码如下:
```c++
#include <iostream>
using namespace std;
#define MVNum 100 //最大顶点数
#define OK 1
typedef char VerTexType; //顶点信息
typedef int OtherInfo; //和边相关的信息
//- - - - -图的邻接表存储表示- - - - -
typedef struct ArcNode{ //边结点
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
OtherInfo info; //和边相关的信息
}ArcNode;
typedef struct VNode{
VerTexType data; //顶点信息
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode, AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct{
AdjList vertices; //邻接表
int vexnum, arcnum; //图的当前顶点数和边数
}ALGraph;
int LocateVex(ALGraph G , VerTexType v){ //确定点v在G中的位置
for(int i = 0; i < G.vexnum; ++i)
if(G.vertices[i].data == v)
return i;
return -1;
}//LocateVex
int CreateUDG(ALGraph &G){
cin >> G.vexnum >> G.arcnum;
//读入顶点信息,建立顶点表
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){
VerTexType v1, v2;
cin >> v1 >> v2;
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
//头插法插入边结点
ArcNode *p = new ArcNode;
p->adjvex = j;
p->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p;
ArcNode *q = new ArcNode;
q->adjvex = i;
q->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = q;
}
return OK;
}
int main(){
cout << "************算法6.2 采用邻接表表示法创建无向图**************" << endl << endl;
ALGraph G;
CreateUDG(G);
int i;
cout << endl;
cout << "*****邻接表表示法创建的无向图*****" << endl;
for(i = 0 ; i < G.vexnum ; ++i){
VNode temp = G.vertices[i];
ArcNode *p = temp.firstarc;
if(p == NULL){
cout << G.vertices[i].data;
cout << endl;
}
else{
cout << temp.data;
while(p){
cout << "->";
cout << p->adjvex;
p = p->nextarc;
}
cout << endl;
}
}
return 0;
}
```
解释:
1. 首先,在 `CreateUDG` 函数中,我们需要读入顶点数和边数,并建立顶点表。对于每一个顶点,我们读入其数据,并将其邻接链表的头指针设为 `NULL`。
2. 然后,我们需要读入边表,并建立邻接表。对于每一条边 `(v1, v2)`,我们需要在邻接表中的 `v1` 和 `v2` 所对应的邻接链表中,分别插入一个新的边结点。由于是无向图,所以我们需要在两个邻接链表中都插入边结点。
3. 最后,在 `main` 函数中,我们按照邻接表的格式,输出整张无向图。对于每一个顶点,我们首先输出该顶点的数据,然后依次输出其邻接链表中的所有边。如果邻接链表为空,则直接输出该顶点的数据。注意,每一个顶点和其邻接链表中的边之间都要用箭头符号 `->` 连接。
int LocatVex(AdjList G, Data v) { int i; for (i = 0;i < G.vexnum;i++) { if (G.vertex[i].data == v) { return i; } } return -1; }实现找到图中结点的下标位置C语言如果用一个图的指针调用该函数,如何实现
如果要用一个图的指针来调用该函数,可以按以下方式实现:
```c
int LocatVex(AdjList *G, Data v) {
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i].data == v) {
return i;
}
}
return -1;
}
```
其中,`AdjList *G` 表示一个指向 `AdjList` 类型的指针,`G->vexnum` 表示通过指针访问结构体成员 `vexnum`,`G->vertex[i]` 表示通过指针访问结构体数组 `vertex` 的第 `i` 个元素。
阅读全文
相关推荐
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![pptx](https://img-home.csdnimg.cn/images/20241231044947.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)