邻接表

来源:互联网 发布:优化的南洋金珠会掉色 编辑:程序博客网 时间:2024/05/20 10:53

领接表及其实现:


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 邻接点域(表示与相关联头结点的顶点次序);链域(边表结点指向下一个结点))  无向图的邻接表:  ![无向图邻接表的表示](http://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