转载地址:https://blog.csdn.net/qq_39630587/article/details/77409869
邻接表数据结构类型如下:
#define MaxVertices 100
typedef struct node //建立边表
{
int adjvex; //该边所指向的节点位置
node* next; //指向下一条边
// int info; //可用存储该边的权值
} ArcNode;
typedef struct //建立顶点表
{
int data;
ArcNode *first;
} VerNode;
typedef struct //建立邻接表
{
VerNode adjList[MaxVertices]; //邻接表的顶点
int n,e; //总顶点数和边数
} AdjList;
注:边表为链表结构,插入元素有头插法和尾插法两种,这里以头插法为例。
对应的,我们得到如下的结构:
我们以无向图为例:
写出相应的邻接矩阵:
运行结果:(输入从0开始)
邻接表生成函数:
void CreateGraph(AdjList *L) //生成邻接表
{
int i,a,b;
ArcNode *s; //声明一个边表类型的指针
printf("请输入总顶点和总边数:\n");
scanf("%d %d",&L->n,&L->e);
printf("建立顶点表:\n");
for(i=0; i<L->n; i++)
{
scanf("%d",&L->adjList[i].data); //给顶点的数据域赋初值
L->adjList[i].first = NULL; //初始顶点表的指针域置空
}
//采用头插法创建
printf("建立边表:\n");
for(i=0; i<L->e; i++)
{
//输入顶点从0开始
printf("请输入有连接的顶点:\n");
scanf("%d %d",&a,&b);
//输入顶点大于0
// a-=1;
// b-=1;
//无向图和邻接矩阵的无向图一样,是对称的
s = (ArcNode*)malloc(sizeof(ArcNode)); //为新建边表申请堆空间
s->adjvex = b; //边表的数据域赋初值,指示边表的节点位置
s->next = L->adjList[a].first; //头插法
L->adjList[a].first = s;
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjvex = a;
s->next = L->adjList[b].first;
L->adjList[b].first = s;
}
}
邻接表打印函数:
void DisGraph(AdjList *L)
{
for(i=0;i<L->n;i++)
{
// printf("%d->",i+1);
printf("%d->",i); //输入从0开始
while(1)
{
if(L->adjList[i].first == NULL)
{
printf("^");
break;
}
// printf("%d->",L->adjList[i].first->adjvex+1);
printf("%d->",L->adjList[i].first->adjvex); //输入从0开始
L->adjList[i].first = L->adjList[i].first->next;
}
printf("\n");
}
}
注:①②处是由于边表的顺序是对应的是顶点表数组的顺序,所以起始数组为G->adjlist[0],但是按照人们的输入习惯,我们从1开始,所以对于每个输入的i,j进行减1处理存储,再对于输出的G->adjlist[i].edgenext->adjvex进行加1处理,保证输入输出的统一性
具体代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MaxVertices 100
typedef struct node //建立边表
{
int adjvex; //该边所指向的节点位置
node* next; //指向下一条边
// int info; //可用存储该边的权值
} ArcNode;
typedef struct //建立顶点表
{
int data;
ArcNode *first;
} VerNode;
typedef struct //建立邻接表
{
VerNode adjList[MaxVertices]; //邻接表的顶点
int n,e; //总顶点数和边数
} AdjList;
void CreateGraph(AdjList *L) //生成邻接表
{
int i,a,b;
ArcNode *s; //声明一个边表类型的指针
printf("请输入总顶点和总边数:\n");
scanf("%d %d",&L->n,&L->e);
printf("建立顶点表:\n");
for(i=0; i<L->n; i++)
{
scanf("%d",&L->adjList[i].data); //给顶点的数据域赋初值
L->adjList[i].first = NULL; //初始顶点表的指针域置空
}
//采用头插法创建
printf("建立边表:\n");
for(i=0; i<L->e; i++)
{
//输入顶点从0开始
printf("请输入有连接的顶点:\n");
scanf("%d %d",&a,&b);
//输入顶点大于0
// a-=1;
// b-=1;
//无向图和邻接矩阵的无向图一样,是对称的
s = (ArcNode*)malloc(sizeof(ArcNode)); //为新建边表申请堆空间
s->adjvex = b; //边表的数据域赋初值,指示边表的节点位置
s->next = L->adjList[a].first; //头插法
L->adjList[a].first = s;
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjvex = a;
s->next = L->adjList[b].first;
L->adjList[b].first = s;
}
}
void DisGraph(AdjList *L)
{
int i;
for(i=0;i<L->n;i++)
{
// printf("%d->",i+1);
printf("%d->",i); //输入从0开始
while(1)
{
if(L->adjList[i].first == NULL)
{
printf("^");
break;
}
// printf("%d->",L->adjList[i].first->adjvex+1);
printf("%d->",L->adjList[i].first->adjvex); //输入从0开始
L->adjList[i].first = L->adjList[i].first->next;
}
printf("\n");
}
}
int main()
{
AdjList *L = (AdjList*)malloc(sizeof(AdjList)); //为邻接表申请堆空间
CreateGraph(L);
DisGraph(L);
}
邻接表有向图
运行结果:
加入权值后:
邻接表生成函数:
void CreateGraph(AdjList *L)
{
int i,a,b;
ArcNode *s;
printf("请输入总顶点数和边数:\n");
scanf("%d %d",&L->n,&L->e);
printf("建立顶点表:\n");
for(i=0;i<L->n;i++)
{
scanf("%d",&L->adjList[i].data);
L->adjList[i].first = NULL;
}
printf("建立边表:\n");
for(i=0;i<L->e;i++)
{
printf("请输入有连接的顶点:\n");
scanf("%d %d",&a,&b);
//输入从1开始
a-=1;
b-=1;
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjvex = b;
s->next = L->adjList[a].first;
L->adjList[a].first = s;
}
}
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://i-blog.csdnimg.cn/blog_migrate/b0f23fadd5c64e0d249014ac956413c3.png)
全部代码:
#include <stdio.h>
#include <stdlib.h>
#define MaxVertices 100
typedef struct node //边表
{
int adjvex;
node* next;
//int info; //存储权值
}ArcNode;
typedef struct //顶点表
{
int data;
ArcNode* first;
}VerNode;
typedef struct //邻接表
{
VerNode adjList[MaxVertices];
int n,e;
}AdjList;
void CreateGraph(AdjList *L)
{
int i,a,b;
ArcNode *s;
printf("请输入总顶点数和边数:\n");
scanf("%d %d",&L->n,&L->e);
printf("建立顶点表:\n");
for(i=0;i<L->n;i++)
{
scanf("%d",&L->adjList[i].data);
L->adjList[i].first = NULL;
}
printf("建立边表:\n");
for(i=0;i<L->e;i++)
{
printf("请输入有连接的顶点:\n");
scanf("%d %d",&a,&b);
//输入从1开始
a-=1;
b-=1;
s = (ArcNode*)malloc(sizeof(ArcNode));
s->adjvex = b;
s->next = L->adjList[a].first;
L->adjList[a].first = s;
}
}
void DisGraph(AdjList *L)
{
int i;
for(i=0;i<L->n;i++)
{
printf("%d->",i+1);
while(1)
{
if(L->adjList[i].first == NULL)
{
printf("^");
break;
}
printf("%d->",L->adjList[i].first->adjvex+1);
L->adjList[i].first = L->adjList[i].first->next;
}
printf("\n");
}
}
int main()
{
AdjList *L = (AdjList*)malloc(sizeof(AdjList));
CreateGraph(L);
DisGraph(L);
}
![点击并拖拽以移动 wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==](https://i-blog.csdnimg.cn/blog_migrate/b0f23fadd5c64e0d249014ac956413c3.png)