怎么调用该函数:void CreateALGraph(ALGraph *&G) { int i,u,v,w; ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); printf("输入顶点数和边数,用逗号分隔:"); scanf("%d,%d",&G->n,&G->e); //G->n = 6; //G->e = 9; printf("依次输入各顶点的信息:"); for(i=0;i<G->n;i++) { getchar(); scanf("%c",&(G->adjlist[i].data.info));//给有头节点的数据域置初值 G->adjlist[i].firstarc=NULL;//给所有头节点的指针域置初值 } printf("依次输入各条边的起点编号、终点编号、权值,中间逗号分隔:\n"); for (i=0;i<G->e;i++) { getchar(); scanf("%d,%d,%d",&u,&v,&w); p=(ArcNode *)malloc(sizeof(ArcNode)); //创建节点*p p->adjvex=v; p->info=w; p->nextarc=G->adjlist[u].firstarc; //将*p链到链表头 G->adjlist[u].firstarc=p; } } void DispAdj(ALGraph *G) //输出邻接表G { int i; ArcNode *p; for (i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; printf("%c(%d): ",G->adjlist[i].data.info,i); while (p!=NULL) { printf("%3d(%2d)",p->adjvex,p->info); p=p->nextarc; } printf("\n"); } }
时间: 2024-01-07 18:04:42 浏览: 86
可以这样调用该函数:
```
int main() {
ALGraph *G;
CreateALGraph(G);
DispAdj(G);
return 0;
}
```
其中,`CreateALGraph` 函数用来创建一个无向图的邻接表,`DispAdj` 函数用来输出该邻接表。在 `main` 函数中,我们先定义了一个指向 `ALGraph` 类型的指针 `G`,然后调用 `CreateALGraph` 函数来创建邻接表,并将其赋值给 `G`。最后调用 `DispAdj` 函数输出邻接表。
相关问题
优化这段代码#include <iostream>#include <cstring>using namespace std;const int MVNum = 100;typedef int VertexType;struct ArcNode { int adjvex; struct ArcNode* nextarc;};struct VNode { VertexType data; ArcNode* firstarc;};typedef VNode AdjList[MVNum];struct ALGraph { AdjList vertices; int vexnum, arcnum;};void InputVertex(ALGraph& G) { for (int i = 0; i < G.vexnum; ++i) { cout << "请输入顶点信息:\n"; cin >> G.vertices[i].data; G.vertices[i].firstarc = nullptr; }}void InputEdge(ALGraph& G) { for (int k = 0; k < G.arcnum; ++k) { int i, j; ArcNode* p1, * p2; cout << "请输入每条边对应的两个顶点的序号:\n"; cin >> i >> j; p1 = new ArcNode; p1->adjvex = j; p1->nextarc = G.vertices[i].firstarc; G.vertices[i].firstarc = p1; p2 = new ArcNode; p2->adjvex = i; p2->nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = p2; }}void CreateUDG(ALGraph& G) { cout << "请输入顶点数和边数:\n"; cin >> G.vexnum >> G.arcnum; InputVertex(G); InputEdge(G);}bool visited[MVNum];void DFS(ALGraph G, int v) { cout << v; visited[v] = true; ArcNode* p = G.vertices[v].firstarc; while (p != nullptr) { int w = p->adjvex; if (!visited[w]) { DFS(G, w); } p = p->nextarc; }}int main() { memset(visited, false, sizeof(visited)); ALGraph G; CreateUDG(G); DFS(G, 0); return 0;}
这段代码存在一些可以优化的地方,以下是我提出的优化方案:
1. 对于结构体和变量的命名要有意义,让代码更易读。
2. 在输入边的时候,可以将两个顶点的序号存在一起,避免重复输入。
3. 在输入边的时候,可以通过指针的指向来减少代码量。
4. 在 DFS 函数中,可以将参数 G 改为引用传递,避免出现不必要的拷贝。
5. 在 DFS 函数中,可以将参数 v 改为 const 引用,避免对参数进行修改。
6. 在 DFS 函数中,可以使用范围 for 循环代替指针的遍历,代码更加简洁。
优化后的代码如下:
```
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_VERTEX_NUM = 100;
typedef int VertexType;
struct ArcNode {
int adjvex;
ArcNode* next;
};
struct VNode {
VertexType data;
ArcNode* firstarc;
};
typedef VNode AdjList[MAX_VERTEX_NUM];
struct ALGraph {
AdjList vertices;
int vexnum, arcnum;
};
void InputVertex(ALGraph& G) {
for (int i = 0; i < G.vexnum; ++i) {
cout << "请输入第 " << i << " 个顶点的信息:";
cin >> G.vertices[i].data;
G.vertices[i].firstarc = nullptr;
}
}
void InputEdge(ALGraph& G) {
for (int k = 0; k < G.arcnum; ++k) {
int i, j;
cout << "请输入第 " << k << " 条边对应的两个顶点的序号:";
cin >> i >> j;
ArcNode* p1 = new ArcNode;
p1->adjvex = j;
p1->next = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1;
ArcNode* p2 = new ArcNode;
p2->adjvex = i;
p2->next = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2;
}
}
void CreateUDG(ALGraph& G) {
cout << "请输入顶点数和边数:";
cin >> G.vexnum >> G.arcnum;
InputVertex(G);
InputEdge(G);
}
bool visited[MAX_VERTEX_NUM];
void DFS(const ALGraph& G, const int& v) {
cout << v;
visited[v] = true;
for (auto p = G.vertices[v].firstarc; p != nullptr; p = p->next) {
int w = p->adjvex;
if (!visited[w]) {
DFS(G, w);
}
}
}
int main() {
memset(visited, false, sizeof(visited));
ALGraph G;
CreateUDG(G);
DFS(G, 0);
return 0;
}
```
实现基于邻接表表示的深度优先遍历。 函数接口定义: void DFS(ALGraph G, int v); 其中 G 是基于邻接表存储表示的无向图,v表示遍历起点。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MVNum 10 int visited[MVNum]; typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; int info; }ArcNode; typedef struct VNode{ char data; ArcNode *firstarc; }VNode, AdjList[MVNum]; typedef struct{ AdjList vertices; int vexnum, arcnum; }ALGraph; int CreateUDG(ALGraph &G);//实现细节隐藏 void DFS(ALGraph G, int v); void DFSTraverse(ALGraph G){ int v; for(v = 0; v < G.vexnum; ++v) visited[v] = 0; for(v = 0; v < G.vexnum; ++v) if(!visited[v]) DFS(G, v); } int main(){ ALGraph G; CreateUDG(G); DFSTraverse(G); return 0; } /* 请在这里填写答案 */ 输入样例: 输入第1行为结点数vexnum和边数arcnum。第2行为结点的值,依次输入arcnum行,每行输入两个结点的值表示该两个结点互为邻接点。 8 8 ABCDEFGH A B A C B D B E C F C G D H E H 输出样例: 遍历序列。 A C G F B E H D
void DFS(ALGraph G, int v)
{
visited[v] = 1; // 标记当前节点已经访问过
printf("%c ", G.vertices[v].data); // 输出当前节点的值
ArcNode *p = G.vertices[v].firstarc; // 指向当前节点的第一条边
while (p != NULL) // 遍历与当前节点相邻的节点
{
int w = p->adjvex; // 获取当前节点的相邻节点
if (!visited[w]) // 如果该相邻节点未被访问过
{
DFS(G, w); // 递归访问该相邻节点
}
p = p->nextarc; // 指向当前节点的下一条边
}
}
注意,在调用 DFS 函数之前需要先将 visited 数组初始化为 0,表示所有节点都未被访问过。同时,如果图不是连通的,需要在 DFSTraverse 函数中使用循环遍历每个节点,以确保对所有节点都进行了遍历。
阅读全文