邻接矩阵与邻接表

简介: // 邻接矩阵#include<stdio.h>#include<string.h>#define MAXN 100int Edge[MAXN][MAXN];int main(){ // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); int
// 邻接矩阵
#include<stdio.h>
#include<string.h>
#define MAXN 100
int Edge[MAXN][MAXN];
int main()
{
   // freopen("input.txt","r",stdin);
    // freopen("output.txt","w",stdout);
    int m,n,i,j,id,od,u,v;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(m==0&&n==0)  break;
        memset(Edge,0,sizeof(Edge));
        for(i=0; i<m; i++)
        {
            scanf("%d%d",&u,&v);
            Edge[u-1][v-1]=1;
        }
        for(i=0; i<n; i++)
        {
            od=0;
            for(j=0; j<n; j++)
                od+=Edge[i][j];
            if(i==0) printf("%d",od);
            else printf(" %d",od);
        }
        printf("\n");
        for(i=0; i<n; i++)
        {
            id=0;
            for(j=0; j<n; j++)
                id+=Edge[j][i];
            if(i==0) printf("%d",id);
            else printf(" %d",id);
        }
        printf("\n");
    }
    return 0;
}
//邻接表
#define MAXN 100
#include<stdio.h>

struct arcnode   //边结点
{
    int adjvex;        //有向边的另一个邻接点的序号
    arcnode *nextarc;   //指向下一个边结点的指针
};
struct vnode     //  顶点
{
    int data;    //   顶点信息
    arcnode *head1;   // 出边表的表头指针
    arcnode *head2;   //  入边表的表头指针
};
struct lgraph              //图的邻接表存储结构
{
    vnode vertexs[MAXN];  //顶点数组
    int vexnum,arcnum;    //顶点数和边数
} lg;
void createlg()
{
    int i;
    arcnode *pi; //用来构造边链表的边结点指针
    int v1,v2;   // 有向边的2个顶点
    for(i=0; i<lg.vexnum; i++)
        lg.vertexs[i].head1=lg.vertexs[i].head2=NULL;
    for(i=0; i<lg.arcnum; i++)
    {
        scanf("%d%d",&v1,&v2);  //输入一条边的起点和终点
        v1--;
        v2--;
        pi=new arcnode;  //假设有足够空间
        pi->adjvex=v2;
        pi->nextarc=lg.vertexs[v1].head1; //插入链表
        lg.vertexs[v1].head1=pi;

        pi=new arcnode;  //假设有足够空间
        pi->adjvex=v1;
        pi->nextarc=lg.vertexs[v2].head2; //插入链表
        lg.vertexs[v2].head2=pi;
    }
}
void deletelg()
{
    int i;
    arcnode *pi;
    for(i=0; i<lg.vexnum; i++)
    {
        pi=lg.vertexs[i].head1;
        while(pi!=NULL)
        {
            lg.vertexs[i].head1=pi->nextarc;
            delete pi;
            pi=lg.vertexs[i].head1;
        }
        pi=lg.vertexs[i].head2;
        while(pi!=NULL)
        {
            lg.vertexs[i].head2=pi->nextarc;
            delete pi;
            pi=lg.vertexs[i].head2;
        }
    }
}
int main()
{
    //freopen("input.txt","r",stdin);
    int i,id,od;
    arcnode *pi;
    while(1)
    {
        lg.vexnum=lg.arcnum=0;
        scanf("%d%d",&lg.vexnum,&lg.arcnum);
        if(lg.vexnum==0) break;
        createlg();
        for(i=0;i<lg.vexnum;i++)
        {
            od=0;
           pi=lg.vertexs[i].head1;
           while(pi!=NULL)
           {
               od++;
               pi=pi->nextarc;
           }
           if(i==0) printf("%d",od);
           else  printf(" %d",od);
        }
        puts("");
        for(i=0;i<lg.vexnum;i++)
        {
            id=0;
            pi=lg.vertexs[i].head2;
            while(pi!=NULL)
            {
                id++;
                pi=pi->nextarc;
            }
           if(i==0) printf("%d",id);
           else  printf(" %d",id);
        }
        puts("");
        deletelg();
    }
    return 0;
}


目录
相关文章
|
6月前
|
存储 机器学习/深度学习 人工智能
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
图的存储及基本操作总结(邻接矩阵、邻接表)及C/C++代码实现
567 0
|
10月前
|
存储
图操作之邻接矩阵与邻接表的深度优先遍历
图操作之邻接矩阵与邻接表的深度优先遍历
108 0
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
141 0
拓扑排序(邻接表实现)
|
机器学习/深度学习
有向图,无向图的邻接矩阵和邻接表模板
有向图,无向图的邻接矩阵和邻接表模板
152 0
有向图,无向图的邻接矩阵和邻接表模板
邻接表
笔记
53 0
邻接矩阵
数据结构中无向图邻接矩阵的存储
邻接矩阵
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
|
存储 JavaScript 算法
邻接表详解(C/C++)
目录 一、概念 二、分类 1)无向图的邻接表 2)有向图的邻接表(出弧) 3)有向图的逆邻接表(入弧) 三.步骤 四、代码
548 0
邻接表详解(C/C++)