邻接矩阵转化为邻接链表——6-1 有向图邻接矩阵转换为邻接表 (10 分)

邻接矩阵转化为邻接链表——6-1 有向图邻接矩阵转换为邻接表 (10 分),第1张

邻接矩阵转化为邻接链表——6-1 有向图邻接矩阵转换为邻接表 (10 分)

邻接矩阵转化为邻接表
  • 1.邻接矩阵的数据类型描述:
  • 2.邻接链表的数据类型定义:
  • 3.代码思路:
  • 练习题6-1 有向图邻接矩阵转换为邻接表 (10 分)

1.邻接矩阵的数据类型描述:
#define MAXVEX 20
typedef char Vextype;
typedef struct
{
    int arcs[MAXVEX+1][MAXVEX+1];
    Vextype vex[MAXVEX+1];
    int vexnum;
    int arcnum;
}AdjMatrix;
2.邻接链表的数据类型定义:
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
typedef struct 
{
    Vextype vexdata;
    ArcNode *head;
}VertexNode;
typedef struct
{
    VertexNode vertex[MAXVEX];
    int vexnum;
    int arcnum;
}AdjList;
3.代码思路:

先将临界矩阵与邻接链表的顶点数目与边数目置为相等;
建立指向邻接链表的指针s,p;建立双重循环判断邻接矩阵中的arce[i][j]中的是否为1(1是图中没有带权值,且其对应的顶点之间有关系)再将矩阵中对应顶点关系的下标值赋值给邻接矩阵中的s所指的下标值。令p=vertex[i].head;
判断p是否为空,如果为空的话讲s赋值给p,若不为空将s中的值插到p的后面。

练习题6-1 有向图邻接矩阵转换为邻接表 (10 分)

编写算法实现将有向图的邻接矩阵转换为邻接表
输入说明:

第一行,输入顶点总数n

第二行,连续输入n个字符,无间隔,依次为各个顶点的信息

第三行,输入弧总数e

第四行,连续输入e条弧,例如:
输出说明:

依照顶点顺序输出各个顶点的邻接表,每个顶点一行。

每行先输出顶点序号,顶点信息,然后依次输出各个邻接点的编号(注意:各邻接点按顶点序号升序排列),详见输出样例。
裁判测试程序样例:

#include 
#include 


void Creat_AdjMatrix(AdjMatrix *G);  //创建邻接矩阵
int LocateVex_AdjMatrix(AdjMatrix *G,Vextype v);  

void Print_AdjList(AdjList *G);  //输出邻接表

void AdjMatrixToAdjList(AdjMatrix *M,AdjList *L);  //邻接矩阵转换为邻接表

main()
{
    AdjMatrix gM;
    AdjList gL;
    Creat_AdjMatrix(&gM);
    AdjMatrixToAdjList(&gM,&gL);
    Print_AdjList(&gL);
}

void Creat_AdjMatrix(AdjMatrix *G)//创建邻接矩阵
{
    int i,j,k;
    char v1,v2;
    scanf("%dn",&(G->vexnum));
    for(i=1;i<=G->vexnum;i++)
    { 
        scanf("%c",&(G->vex[i]));
        for(j=1;j<=G->vexnum;j++)
            G->arcs[i][j]=0;
    }
    scanf("%dn",&(G->arcnum));
    for(k=1;k<=G->arcnum;k++)
    {
        scanf("<%c,%c>",&v1,&v2);
        i=LocateVex_AdjMatrix(G,v1);
        j=LocateVex_AdjMatrix(G,v2);
        G->arcs[i][j]=1; 
    }
}

int LocateVex_AdjMatrix(AdjMatrix *G,Vextype v)//输出邻接表
{
    int i;
    for(i=1;i<=G->vexnum;i++)
        if(G->vex[i]==v) 
            return i;
    return 0;
}


void Print_AdjList(AdjList *G)
{
    int i;
    ArcNode *p;
    for(i=1;i<=G->vexnum;i++)
    { 
        printf("%d:(%c)",i,G->vertex[i].vexdata);
        for(p=G->vertex[i].head;p;p=p->next)
        {
            printf("->%d",p->adjvex);
        }
        printf("n");
    }
}


输入样例:

5
abcde
7

结尾无空行

输出样例:

1:(a)->2->5
2:(b)->3
3:(c)->4
4:(d)->1->2
5:(e)->3
结尾无空行

代码实现:

void AdjMatrixToAdjList(AdjMatrix *M,AdjList *L){
 L->vexnum=M->vexnum; 
 L->arcnum=M->arcnum;
 int i,j;
 ArcNode *p,*s;
 for(i=1;i<=L->vexnum;i++){
  L->vertex[i].vexdata=M->vex[i];
  L->vertex[i].head=NULL;
 }
 for(i=1;i<=M->vexnum;i++){
  for(j=1;j<=M->vexnum;j++){
   if(M->arcs[i][j]==1){
    s=(ArcNode*)malloc(sizeof(ArcNode));
    s->adjvex=j;
    s->next=NULL;
    p=L->vertex[i].head;
    if(p==NULL) 
    {
     L->vertex[i].head=s;
    }
    else{
     while(p->next)
      p=p->next;
     s->next=p->next;
     p->next=s;
    }
   }
  }
 }
} 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5635156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存