shotar0 2022-11-23 10:06 采纳率: 57.1%
浏览 25
已结题

数据结构-图的基本操作-打印邻接矩阵

问题遇到的现象和发生背景

数据结构-图的操作-打印其邻接矩阵

用代码块功能插入代码,请勿粘贴截图

这是我的图操作的头文件:

#include<stdio.h>
#include<stdlib.h>
#define MaxVertices 999
#define MaxSize 999
#define MaxWeight 999
typedef struct{
    int row;
    int col;
    int weight;
}RowColWeight;
//邻接矩阵的数据类型 

char vertex;//顶点的数据类型为char 

typedef char ElemType;

#include"Seqlist.h"
typedef struct{
    Seqlist Vertices;
    int edge[MaxVertices][MaxVertices];
    int numOfEdge;
}Graph;//图的数据类型 
void Initiate(Graph *G,int n)//初始化
{
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if(i==j)G->edge[i][j]=0;
            else G->edge[i][j]=MaxWeight;
        }
        G->numOfEdge=0;
        ListInitiate(&G->Vertices);
 } 
 void InsertVertex(Graph * G,char vertex,int pos)
 {
    ListInsert(&G->Vertices,pos,vertex);
 }//插入一个顶点 
 void InsertEdge(Graph *G,int v1,int v2,int weight)
 {
     if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size)
     {
         printf("参数v1或v2越界出错!\n");
         exit(1);
    }
    G->edge[v1][v2]=weight;
    G->numOfEdge++;
 }//插入一条边 
 void DeleteEdge(Graph *G,int v1,int v2)
 {
     if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size||v1==v2)
     {
         printf("参数出错!\n");
         exit(1);
    }
    G->edge[v1][v2]=MaxWeight;
    G->numOfEdge--;
 }//删除一条边 
 void DeleteVertex(Graph *G,int v)
 {
     int n=ListLength(G->Vertices),i,j;
     ElemType x;
     for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)
                G->numOfEdge--;
            for(i=v;i<n;i++)
                for(j=0;j<n;j++)
                    G->edge[i][j]=G->edge[i+1][j];
            for(i=v;i<n;i++)
                for(j=0;j<n;j++)
                    G->edge[i][j]=G->edge[i][j+1];
            ListDelete(&G->Vertices,v,&x);                
        }
 }//删除一个顶点 
 int GetFirstVex(Graph G,int v)
 {
     int col; 
     if(v<0||v>=G.Vertices.size)
     {
         printf("参数v越界出错\n");
         exit(1);
    }
    for(col=0;col<G.Vertices.size;col++)
    {
        if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)
            return col;
    }
    return -1;
 }//取第一个邻接顶点 
 int GetNextVex(Graph G,int v1,int v2)
 {
     int col;
     if(v1<0||v1>=G.Vertices.size||v2<0||v2>=G.Vertices.size)
     {
         printf("参数v1或v2越界出错\n");
         exit(1);
    }
    for(col=v2+1;col<=G.Vertices.size;col++)
        if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight)
            return col;
        return -1;
 }//取下一个邻接顶点 
 void CreateGraph(Graph *G,char V[],int n,RowColWeight E[],int e)
 {
     int i,k;
     Initiate(G,n);
     for(i=0;i<n;i++)
         InsertVertex(G,V[i],i);
     for(k=0;k<e;k++)
         InsertEdge(G,E[k].row,E[k].col,E[k].weight);
 }//创建图

顺序表头文件:


//顺序表头文件Seqlist.h
typedef struct
{
    ElemType list[MaxSize];
    int size;
 } Seqlist;
void ListInitiate(Seqlist *L)
{
    L->size=0;
}
int ListLength(Seqlist L)
{
    return L.size;
}
int ListInsert(Seqlist *L,int i,ElemType x)
{
    int j;
    if(L->size>=MaxSize)
    {
        printf("顺序表已满,无法插入!");
        return 0;
    }
    else if(i<0||i>L->size)
    {
        printf("参数不合法!");
        return 0;
    }
    else 
    {
        for(j=L->size;j>i;j--)
        {
            L->list[j]=L->list[j-1];
        }
        L->list[i]=x;
        L->size++;
        return 1;
    }
}
int ListDelete(Seqlist *L,int i,ElemType *x)
{
    int j;
    if(L->size<=0)
    {
        printf("顺序表已空,无数据可删除!");
        return 0;
    }
    else if(i<0||i>L->size-1)
    {
        printf("参数i不合法!");
        return 0;
    }
    else
        {
            *x=L->list[i];
            for(j=i+1;j<=L->size-1;j++)
                L->list[j-1]=L->list[j];
                L->size--;
                return 1;
        }
}
int ListGet(Seqlist L,int i,ElemType *x)
{
    if(i<0||i>L.size-1)
    {
        printf("参数i不合法!");
        return 0;
    }
    else
    {
        *x=L.list[i];
        return 1;
    }
}
int listput(Seqlist *L)
{
    int i;
    for(i=0;i<L->size;i++)
    {
        printf("%d",L->list[i]);
    }
}

主函数:

 int main()
 {
    Graph g;
    int i;
    char a[]={'A','B','C','D','E','F'};
    RowColWeight rcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,4,18},{5,3,10}};
    int n=6;int e=9;
    CreateGraph(&g,a,n,rcw,e);
    printf("顶点的集合为:");
    for(i=0;i<g.Vertices.size;i++)
    {
        printf("%5c",g.Vertices.list[i]);
    }
 }

运行结果及报错内容

img

我想要达到的结果

输出正确的邻接矩阵

  • 写回答

6条回答 默认 最新

  • 心脏dance 2022-11-24 21:26
    关注

    你好,是你的变量定义太大了。把这个改小点就可以了。
    #define MaxVertices 100

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 修改了问题 11月23日
  • 修改了问题 11月23日
  • 展开全部

悬赏问题

  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn