完善以下代码 //算法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
时间: 2023-11-22 14:54:17 浏览: 92
算法功能:采用邻接表存储结构建立无向图.pdf
完善的代码如下:
```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` 函数中,我们按照邻接表的格式,输出整张无向图。对于每一个顶点,我们首先输出该顶点的数据,然后依次输出其邻接链表中的所有边。如果邻接链表为空,则直接输出该顶点的数据。注意,每一个顶点和其邻接链表中的边之间都要用箭头符号 `->` 连接。
阅读全文