领接表及其实现:
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~
#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;
void creat (LinkGraph *g,char *filename,int c)
{
int 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;
}
if(c==0)
{
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;
}