帮我修改一下以下代码int FirstAdjVertex(AdjList G,int v) { ArcNode *p=G.vertex[v].firstarc; if(p!=NULL) { return p->adjvex; } return -1; } int NextAdjVertex(AdjList G,int v,int w) { ArcNode *p=G.vertex[v].firstarc;; while(p!=NULL&&p->adjvex==w) { p=p->nextarc; } if(p==NULL) { return -1; } return p->nextarc->adjvex; }
时间: 2024-02-04 19:02:21 浏览: 70
以下是修改后的代码:
```c
int FirstAdjVertex(AdjList G, int v) {
ArcNode *p = G.vertex[v].firstarc;
if (p != NULL) {
return p->adjvex;
}
return -1;
}
int NextAdjVertex(AdjList G, int v, int w) {
ArcNode *p = G.vertex[v].firstarc;
while (p != NULL && p->adjvex != w) {
p = p->nextarc;
}
if (p == NULL || p->nextarc == NULL) {
return -1;
}
return p->nextarc->adjvex;
}
```
修改点:
1. 第二个函数中的 `while` 循环条件应该是 `p->adjvex != w`,表示找到当前节点的下一个节点。
2. 在第二个函数中,需要判断 `p->nextarc` 是否为 `NULL`,如果是,则说明当前节点是最后一个节点,返回值为 `-1`。
相关问题
帮我修改一下这段代码int NextAdjVertex(AdjList G,int v,int w) { ArcNode *p; p=G->vertex[v].firstarc; while(p!=NULL&&p.adjvex!=w) { p=p->nextarc; return p->nextarc; } return -1; }
好的,根据你提供的代码,我看出其中存在一些错误,我帮你修改一下:
```c
int NextAdjVertex(AdjList G, int v, int w) {
ArcNode *p = G->vertex[v].firstarc;
while (p != NULL && p->adjvex != w) {
p = p->nextarc;
}
if (p == NULL) {
// 没有找到相邻的节点 w
return -1;
}
return p->nextarc->adjvex;
}
```
主要修改如下:
1. 在 while 循环中,应该将 `return p->nextarc;` 移到循环外面,以便遍历完所有的相邻节点后再返回相应的结果。
2. 在返回相邻节点时,应该返回 `p->nextarc->adjvex`,因为 `p->nextarc` 才是相邻节点的信息。
希望这份修改后的代码能够帮助到你!
优化这段代码#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;
}
```
阅读全文