图的邻接表存储 c实现

来源:互联网 发布:淘宝买csgo安全吗 编辑:程序博客网 时间:2024/05/21 02:20

 

                       图的邻接表存储 c实现 (转载)

 

 

用到的数据结构是

一个是顶点表,包括顶点和指向下一个邻接点的指针

一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针

刚开始的时候把顶点表初始化,指针指向null。然后边表插入进来,是插入到前一个,也就是直接插入到firstedge指向的下一个,而后面的后移

 

#define MaxVertexNum 100typedef int VertexType;typedef struct node       //边表结点{    int adjvex;           //邻接点域    struct node* next;   //链域    //若要表示边上的权,则应增加一个数据域} EdgeNode;typedef struct vnode     //顶点表结点{    VertexType vertex;   //顶点域    EdgeNode* firstedge;  //边表头指针    int count;} VertexNode;typedef VertexNode AdjList[MaxVertexNum];//AdjList是邻接表类型typedef struct{    AdjList adjlist;     //邻接表    int n,e;            //顶点数和边数} ALGraph;            //对于简单的应用,无需定义此类型,可直接使用AdjList类型



以下建立的是无向图的邻接表,有向图的更简单了

 

#include <stdio.h>#include <stdlib.h>#define  MaxVertexNum 100typedef char VertexType;typedef struct node   //边表节点{   int adjvex;   node* next;}EdgeNode;typedef struct     //顶点表节点{   VertexType vertex;   EdgeNode* firstedge;}VertexNode;typedef VertexNode AdjList[MaxVertexNum];typedef struct { AdjList adjlist;int n,e;}ALGraph;void create(ALGraph*);void main(){   ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));   create(G);   for (int i=0;i< G->n;i++)   {   printf("%d->",i);   while(G->adjlist[i].firstedge!=NULL)   {printf("%d->",G->adjlist[i].firstedge->adjvex);G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;   }   printf("\n");   }}void create(ALGraph* G){    int i,j,k,w,v;    EdgeNode *s;printf("读入顶点数和边数");    scanf("%d,%d",&G->n,&G->e);     for (i=0;i<G->n;i++)   {   fflush(stdin);   printf("建立顶点表");   G->adjlist[i].vertex=getchar();   G->adjlist[i].firstedge=NULL;   }   printf("建立边表\n");   for (k=0;k<G->e;k++)   {   printf("读入(vi-vj)的顶点对序号");   scanf("%d,%d",&i,&j);   s=(EdgeNode*)malloc(sizeof(EdgeNode));   s->adjvex=j;   s->next=G->adjlist[i].firstedge;  //插入表头   G->adjlist[i].firstedge=s;   s=(EdgeNode*)malloc(sizeof(EdgeNode));   s->adjvex=i;   s->next=G->adjlist[j].firstedge;   G->adjlist[j].firstedge=s;   }}


 

 

原创粉丝点击