邻接表

领接表及其实现:


1.why to creat?

 用邻接矩阵表示图,当e<n^2的时候,会产生存储空间的浪费(0的存储)。

2.when to use?

  邻接表适合存储稀疏矩阵(e<n(n-1)/2),表示形式不唯一,边表结点的链接次序取决于建立邻接表的算法以及边的输入次序。
  邻接矩阵表示稠密矩阵,表示形式唯一

3.how to realize?

  领接表分为两个部分,表头结点和边表结点
  表头结点(vertex (顶点) 数据域(表示结点存储值char);firstedeg 头指针域(指向链表的第一个指针域))
  边表结点(adjvex 邻接点域(表示与相关联头结点的顶点次序);链域(边表结点指向下一个结点))
  无向图的邻接表:
  ![无向图邻接表的表示](https://img-blog.csdn.net/20161114094849732)
  有向图:
    出边表:
    入边表:

4.the code is~

/*1.定义图的邻接表*/

/*表头*/
#include<stdio.h>
#include<stdlib.h>  //标准库函数
#define M 20    //定义图的最大顶点数

/*定义边表结点*/
typedef char DataType;      //给结点字符类型重命名
typedef struct node
{
   int adjvex;    //定义顶点数据域 结点值
   struct node *next;    //定义表头结点的链表域
}EdgeNode;

/*定义表头结点*/
typedef struct node
{
   DataType vertex;
   EdegNode *FirstEdge;
}VertexNode;

/*定义邻接表的存储结构*/
typedef struct 
{
   VertexNode adjlist[M];  //将表头结点连接成连续数组
   int n,e
}LinkedGraph;

/*2.创建图的邻接表*/
void creat (LinkGraph *g,char *filename,int c)
{
   int i,j,k; //i,j代表存储序号,k为循环变量
   EdgeNode *s; 
   //定义边表结构 传入的邻接表的存储结构含有表头结点 表头结点含有边表结点 引用要用三层 不能
   FILE *fp;
   fp=fopen(filename,"r");
   if(fp)
     {
         fscanf(fp,"%d%d",&g->n,&g->e); //读入边表结构里顶点数和边数
         for(i=0;i<g->n;i++)    //录入顶点信息
         {
              fscanf(fp,"%d%d",&g->adjlist[i].vretex);  //输入文件的顶点值
              g->adjlist[i].FirstEdge = NULL;   //边表置空
         }
         for(k=0;k<g->e;k++)    //建立边表
         {
         fscanf(fp,"%d%d",&i,&j);   //输入无序对
             s=(EdgeNode*)malloc(sizeof(EdgeNode));
             s->adjvex=j;   //输入边表结点的序号
             s->next=g->adjlist[i].FirstEdge;   //将边表结点和头结点连接起来
             g->adjlist[i].FirstEdge=s;   //将新的结点*s插入顶点边表头部   前插法连接边表结点
          }
           if(c==0//c用来判断是有向或者无向图  0 无向  
          {
              //邻接表中一个边的表示出现两次  所以i,j互换
              s=(EdgeNode*)malloc(sizeof(EdgeNode));
              s->adjvex=i;
              s->next=g->adjlist[j].FirstEdge;
              g->agjlist[j].FirstEdge=s;
           } 

         }
      fclose(fp);

     }
  else
      g->n=0;     //文件打开失败
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值