鱼C论坛

 找回密码
 立即注册
查看: 1620|回复: 14

指针指向结构体数组,结构体数组调用其内部数据编译失(问题代码已用红色标注)....

[复制链接]
发表于 2023-4-17 22:06:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
typedef struct _EdgeNode{
    int weight,adjacency;
    struct Edge* next;
}Edge;

typedef struct _HeadNode{
    VertexType name;
    Edge* first;
}Head;

typedef struct _ALGraph{
    int vertices;
    int edges;
    Head vertex[MAXVERTEX];
}ALGraph;

void Creat_UnALGraph_UnWeighted(AMGraph* G){
    //初始化边和顶点个数
    printf("请输入边数和顶点数\n");
    getchar();
    scanf("%d",G -> vertices);
    scanf("%d",G -> edges);

    for(int i = 0;i < G -> vertices;i++){
        printf("请输入每个顶点的名字\n");
        getchar();
        scanf("%c",&G -> vertex[i].name);
        G -> vertex[i].first;
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-17 22:08:15 | 显示全部楼层
scanf("%c",&G -> vertex[i].name)
这一段代码编译不通过,跪求各位大佬答疑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-17 22:15:19 | 显示全部楼层
本帖最后由 sfqxx 于 2023-4-17 22:25 编辑

在 `scanf("%c",&g -> vertex[i ].name);` 这一行代码中,应该在变量名 g 之后使用箭头符号 "->" ,而非点号"."。

因此正确的代码应该是 scanf("%c", &g->vertex[i ]->name);(把 i的空格去掉)
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-17 22:39:45 | 显示全部楼层
sfqxx 发表于 2023-4-17 22:15
在 `scanf("%c",&g -> vertex.name);` 这一行代码中,应该在变量名 g 之后使用箭头符号 "->" ,而非点号"." ...

G -> vertex[i] 这应该不是指针吧,结构体调用本身的数据不是用 -> 这个符号吧

而且问题描述是这样的:Member reference type 'char' is not a pointer
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-18 17:33:40 | 显示全部楼层
这个错误是因为结构体里的name成员应该是一个字符数组类型,而非一个字符类型。

我们可以将VertexType重新定义如下:


#define MAX_NAME_LEN 20 // 假设最大名字长度为20

typedef struct _vertex{
    char name[MAX_NAME_LEN];
} VertexType;


然后在代码中修改`Creat_UnALGraph_UnWeighted`函数中的读取name的部分:


void Creat_UnALGraph_UnWeighted(ALGraph* G){
    printf("请输入边数和顶点数\n");
    getchar();
    scanf("%d",&G -> vertices);
    scanf("%d",&G -> edges);

    for(int i = 0; i < G->vertices; ++i) {
        printf("请输入第 %d 个顶点的名字\n", i+1);
        getchar();
        scanf("%s", G->vertex[i].name);
        G->vertex[i].first = NULL;
    }
}


这样就可以正确读取每个顶点的名字了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-18 22:27:47 | 显示全部楼层
sfqxx 发表于 2023-4-18 17:33
这个错误是因为结构体里的name成员应该是一个字符数组类型,而非一个字符类型。

我们可以将VertexType重 ...

新的思路
但是可以不用将其拆解开来吗?
我注意到我标注出的代码在另一些人的机器上是可以编译并且运行的,
我不知道这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-19 11:02:22 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-4-19 17:20 编辑
多捞啊 发表于 2023-4-17 22:39
G -> vertex 这应该不是指针吧,结构体调用本身的数据不是用 -> 这个符号吧

而且问题描述是这样的:Me ...


Member reference type 'char' is not a pointer
提示说,是类型char和pointer不匹配,
VertexType name;
    Edge* first;         //这里是指针

scanf("%c",&G -> vertex[i].name);
G -> vertex[i].first;  //但是这里什么也没干,楼主是不是少写了点儿什么?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 15:22:07 | 显示全部楼层
本帖最后由 多捞啊 于 2023-4-19 15:24 编辑
两手空空儿 发表于 2023-4-19 11:02
Member reference type 'char' is not a pointer
提示说,是类型char和pointer不匹配,
VertexType nam ...

&G -> vertex[i].name
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-19 17:18:27 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-4-19 17:21 编辑

G -> vertex[i].first;  //这一句是想干什么,是不是少写了点儿什么???原码上有,这里没有发出来 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 20:37:44 | 显示全部楼层

原码在一楼

G是指向邻接表ALGraph的指针

vertex 是由头表 HeadNode 所创建的数组,头表包含一个 char类型的 name 和 指向边表的指针 *first

边表 包含 int类型的权重: weight 、 int类型的邻接点: adjacency 、 指向下一个边表的指针: *next
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-19 20:39:18 | 显示全部楼层


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 10:02:45 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-4-20 10:06 编辑
我看不出什么语法错误,但是你的机器报红了

Member reference type 'char' is not a pointer

VertexType name;  // 这个name是个自定义类型吧,它是char的么,我感觉它是个指针类型吧,所以才会报 is not a pointer 
scanf("%c",&G -> vertex[i].name);


G -> vertex[i].first;  //这句话有意义么?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 15:40:08 | 显示全部楼层
我在此之前已经定义:

typedef char VertexType;

我用的Clion,文件是.c结尾,但是那句话就是编译不过去,我看其他人也是这样写的,我没整明白为什么编译不过去

至于 G -> vertex[i].first; 这句就不用管了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 10:00:34 | 显示全部楼层
别人都能过,只自己的不行,那就换一个工具,干嘛和自己过不去
就算你把这个问题解决了,可能还有其它隐藏的问题,何苦为难自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-21 20:51:30 | 显示全部楼层
两手空空儿 发表于 2023-4-21 10:00
别人都能过,只自己的不行,那就换一个工具,干嘛和自己过不去
就算你把这个问题解决了,可能还有其它隐藏 ...

有道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表