| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2368 人关注过本帖
标题:邻接表输出为什么出错?
只看楼主 加入收藏
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
结帖率:75%
收藏
 问题点数:0 回复次数:3 
邻接表输出为什么出错?
程序代码:
#include <stdio.h>  
#include <stdlib.h>
#include <assert.h>  
#define MAX_VERTEX_NUM 10  

typedef struct ArcNode{  
    int adjvex;//该边的另一个顶点的位置   
    struct ArcNode *nextarc; //指向下一条边   
}ANode;
  
typedef struct VexNode{  
    int data;//顶点的值   
    ANode *firstarc;//指向第一条依附该顶点的边的指针   
}AdjList; 

 
typedef struct Graph{  
    AdjList vertices[MAX_VERTEX_NUM];//顶点数组   
    int vexnum, arcnum;  
}ALGraph;
  
int LocateVex(ALGraph G, int v)      //定位函数 
{
    int i; 
     
    for(i=0; i < G.vexnum; i++)  
        if(v == G.vertices[i].data)
            return i;
    if(i == G.vexnum){
            printf("顶点错误!");
            exit(1);
    }  
}  

void CreateUDG(ALGraph G)
{  
    ANode *p,*q;  
    int i,j,k,v1,v2; 
     
    printf("分别输入顶点个数和边的数目:\n");  
    scanf("%d%d", &G.vexnum, &G.arcnum);  
    while(getchar() != '\n')
        continue;   
    printf("分别输入各个顶点值:\n");  
    for(i=0; i < G.vexnum; i++){  
        scanf("%d", &G.vertices[i].data);
           G.vertices[i].firstarc = NULL;//初始化   
    }
    while(getchar() != '\n')
        continue;   
    printf("分别输入各条边的两个顶点:\n");  
    for(k = 0; k < G.arcnum; k++){  
        scanf("%d%d", &v1, &v2);  
        i = LocateVex(G,v1);   //定位
        j = LocateVex(G,v2);   
        p = (ANode*)malloc(sizeof(ANode));//申请一个结点
        assert(p);   
        p->adjvex = j;//赋值   
        p->nextarc = G.vertices[i].firstarc;//连接后结点   
        G.vertices[i].firstarc = p;//连接前结点   
        q = (ANode*)malloc(sizeof(ANode));
        assert(p);  
        q->adjvex = i;  
        q->nextarc = G.vertices[j].firstarc;  
        G.vertices[j].firstarc = q;  
    }  
}  

void PrintUDG(ALGraph G)      //输出邻接表 
{  
    int m;  
    
    for(m=0; m < G.vexnum; m++){  
        printf("%d:", m);  
        ANode *p;  
        p = G.vertices[m].firstarc;  
        while(p != NULL){  
            printf("->%d", p->adjvex);  //此处出现错误!!! 
            p = p->nextarc;  
        }  
        printf("\n");  
    }  
}  

int main(void)
{  
    ALGraph G; 
     
    CreateUDG(G);  
    PrintUDG(G);  
    return 0;  
}  

2017-01-16 22:02
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:0 
回复 楼主 marlow
当我把createUDG()函数中的参数改为指针时,程序就能正常运行了。这是为什么呢?难道是"."运算符的结合顺序问题,当一行代码中存在两个“.”运算符就会出现未定义的情形??? 谁能帮忙解释一下?
修改后的函数如下:
void CreateUDG(ALGraph *G)
{  
    ANode *p;  
    int i,j,k,v1,v2;
     
    printf("分别输入顶点个数和边的数目:\n");  
    scanf("%d%d", &G->vexnum, &G->arcnum);  
    while(getchar() != '\n')
        continue;   
    printf("分别输入各个顶点值:\n");  
    for(i=0; i < G->vexnum; i++){  
        scanf("%d", &G->vertices[i].data);
           G->vertices[i].firstarc = NULL;//初始化   
    }
    while(getchar() != '\n')
        continue;   
    printf("分别输入各条边的两个顶点:\n");  
    for(k = 0; k < G->arcnum; k++){  
        scanf("%d %d", &v1, &v2);  
        i = LocateVex(*G,v1);   //定位
        j = LocateVex(*G,v2);   
        p = (ANode*)malloc(sizeof(ANode));//申请一个结点
        assert(p);   
        p->adjvex = j;//赋值   
        p->nextarc = G->vertices[i].firstarc;//连接后结点   
        G->vertices[i].firstarc = p;//连接前结点   
        p = (ANode*)malloc(sizeof(ANode));
        assert(p);  
        p->adjvex = i;  
        p->nextarc = G->vertices[j].firstarc;  
        G->vertices[j].firstarc = p;  
    }  
    while(getchar() != '\n')
        continue;   
}  

一切都在学习、尝试、摸索中
2017-01-17 21:24
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
typedef struct ArcNode{

    int adjvex;//该边的另一个顶点的位置  

    struct ArcNode *nextarc; //指向下一条边  

}ANode;
.   :访问结构体的成员
->   :访问结构体指针所指向的结构体的成员
这里你所声明的结构体ArcNode里面包含一个int和一个ArcNode指针
你可以用.访问adjvex和nextarc,但是如果你想用访问nextarc的成员的时候就必须使用->  因为它是指针,他没有成员



φ(゜▽゜*)♪
2017-01-30 17:24
marlow
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:125
专家分:419
注 册:2016-7-18
收藏
得分:0 
回复 3楼 书生牛犊
后来让CreateUDG()返回一个值,并把主程序改为:
int main(void)
 {  
     ALGraph G = CreateUDG(G);  
     PrintUDG(G);  
     return 0;  
 }  
程序同样能成功。
思考后得之:之前程序失败的原因是CreateUDG()调用后,仅在其内部对“G的备份”进行修改,对主函数中的G并没有影响,因此G并没有正确初始化,运行printUDG()函数当然也得不到正确的值。但如果CreateUDG()中的参数改为指针,那么CreateUDG()取得主函数中G的地址并对其修改,G实现初始化,因此程序运行正常。这就是为什么CreateUDG()参数改成指针形式能够正确运行的真正原因。

一切都在学习、尝试、摸索中
2017-02-28 22:21
快速回复:邻接表输出为什么出错?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025974 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved