typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum;//图当前的点数和边数 }AMGraph; 在写G.vexs[i] = (VerTexType)malloc(sizeof(struct VerTexType));时遇到[Error] cast from 'void*' to 'VerTexType {aka char}' loses precision
时间: 2024-02-12 20:08:20 浏览: 30
在你的代码中,VerTexType被定义为一个结构体,而不是一个基本类型。所以,你需要将malloc返回的void指针转换为指向VerTexType结构体的指针类型,而不是转换为VerTexType类型。
下面是一种正确的写法:
```c
G.vexs[i] = malloc(sizeof(VerTexType));
```
这里不需要使用强制类型转换,因为malloc返回的是void指针,可以自动转换为任何指针类型。
需要注意的是,使用malloc分配的空间需要手动释放,否则会导致内存泄漏。在程序结束时,需要使用free函数释放G.vexs中所有元素所分配的空间。例如:
```c
for (int i = 0; i < G.vexnum; i++) {
free(G.vexs[i]);
}
```
这样就可以释放所有顶点所占用的空间了。
相关问题
实现无向图邻接矩阵的创建,并实现无向图邻接矩阵方式存储的广度优先遍历的算法,转换成程序并用C语言实现; //用两个数组分别存储顶点表和邻接矩阵 #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph;
以下是C语言实现无向图邻接矩阵的创建和广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct {
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
} AMGraph;
typedef struct {
int data[MVNum];
int front, rear;
} Queue;
void InitQueue(Queue *Q) {
Q->front = Q->rear = 0;
}
int QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
return 1;
} else {
return 0;
}
}
void EnQueue(Queue *Q, int x) {
Q->data[Q->rear++] = x;
}
int DeQueue(Queue *Q) {
return Q->data[Q->front++];
}
void CreateGraph(AMGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:");
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = MaxInt;
}
}
printf("请输入边的信息:\n");
for (k = 0; k < G->arcnum; k++) {
printf("请输入第%d条边的起点和终点:", k + 1);
scanf("%d%d", &i, &j);
printf("请输入第%d条边的权值:", k + 1);
scanf("%d", &G->arcs[i][j]);
G->arcs[j][i] = G->arcs[i][j]; // 无向图对称
}
}
void BFS(AMGraph G, int v, int visited[]) {
int i, u;
Queue Q;
InitQueue(&Q);
visited[v] = 1;
printf("%c ", G.vexs[v]);
EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
u = DeQueue(&Q);
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[u][i] != MaxInt && !visited[i]) {
visited[i] = 1;
printf("%c ", G.vexs[i]);
EnQueue(&Q, i);
}
}
}
}
void BFSTraverse(AMGraph G) {
int i;
int visited[MVNum];
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
}
int main() {
AMGraph G;
CreateGraph(&G);
printf("广度优先遍历结果为:");
BFSTraverse(G);
return 0;
}
```
注意:以上代码中的 `VerTexType` 和 `ArcType` 分别表示顶点数据类型和边权值类型,但这里并没有用到它们的具体定义,因此可以根据实际情况进行修改。另外,上面的代码中使用了一个队列来实现广度优先遍历,这里我们采用了循环队列的方式来实现。
#include <iostream> #include <fstream> using namespace std; #define MVNum 100//最大顶点数 typedef char VerTexType;//顶点的数据类型为字符型 typedef int ArcType;//边的权值类型为整型 //图的邻接矩阵 typedef struct{ … return 0; }
这段代码不完整,缺少结构体的定义和函数的实现。可以简单解释一下代码的意思:
1. 定义了一个最大顶点数为100的常量MVNum,表示图中顶点的最大数量。
2. 定义了顶点的数据类型为字符型,边的权值类型为整型。
3. 接下来应该是定义图的邻接矩阵的结构体,但是这部分代码没有给出。
4. 最后定义了一个main函数,但是函数体没有写完。