文章目录
- 1. 引言
- 2. 邻接表表示图的原理
- 2.1 有向权图
- 2.2 无向权图
- 2.3 无向非权图
- 2.1 有向非权图
- 3. 实验内容
- 3.1 实验题目
- (一)数据结构要求
- (二)输入要求
- (三)输出要求
- 3.2 算法实现
- 4. 实验结果
1. 引言
图是一种常见的数据结构,用于表示对象之间的关系。在图的表示方法中,邻接表是一种常用的形式,特别适用于稀疏图。
本实验将介绍如何使用邻接表表示图,并通过C语言实现图的邻接表创建。
2. 邻接表表示图的原理
邻接表是一种图的表示方法,其中每个顶点都与一个链表相关联,链表中包含了与该顶点相邻的所有顶点。对于有向图,邻接表中的链表表示了每个顶点的出边。
在邻接表中,顶点由一个结构体表示,包含顶点的名称(或编号)以及指向与该顶点相邻的第一个顶点的指针。每个相邻的顶点由一个链表节点表示,包含相邻顶点的编号以及指向下一个相邻顶点的指针。
2.1 有向权图
2.2 无向权图
2.3 无向非权图
2.1 有向非权图
3. 实验内容
3.1 实验题目
将邻接矩阵存储转换为邻接表存储
(一)数据结构要求
邻接表中的顶点表用Head
数组存储,顶点表中元素的两个域的名字分别为 VerName
和 Adjacent
,边结点的两个域的名字分别为 VerAdj
和 link
。边链表中的边结点按照顶点序号从小到大的顺序存储。
(二)输入要求
{0,1,1,1,1,0,0},
{0,0,1,1,0,0,0},
{1,0,0,0,0,0,0},
{0,0,1,0,0,0,0},
{0,0,0,0,0,1,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}
(三)输出要求
按照顶点编号从小到大的顺序,依次输出每个顶点的边链表。形如:
“顶点 0 的边链表为:1->2->3->4->5->6->7->8”
3.2 算法实现
#include<stdio.h>
#include<stdlib.h>
#define N 7
int A[N][N]={
{0,1,1,1,1,0,0},
{0,0,1,1,0,0,0},
{1,0,0,0,0,0,0},
{0,0,1,0,0,0,0},
{0,0,0,0,0,1,1},
{0,0,0,0,0,0,1},
{0,0,0,0,0,0,0}
};
typedef struct P{
int VerAdj ;
struct P *link;
}P;
typedef struct Q{
int VerName;
P *Adjacent;
}Q;
typedef struct{
Q Head[20];
}Graph;
void Create(Graph *g)
{
int i,j,n,t;
for(i=0;i<N;i++)
{
g->Head[i].VerName=i;
g->Head[i].Adjacent=NULL;
P *p=(P*)malloc(sizeof(P));
t=0;
for(j=0;j<N;j++){
if(A[i][j]){
if(t==0){
//printf("%d&%d ",A[i][j],j);
g->Head[i].Adjacent=p;
p->VerAdj =j;
p->link=NULL;
t=1;
}
else{
//printf("%d&%d ",A[i][j],j);
P *q=(P*)malloc(sizeof(P));
q->VerAdj =j;
q->link=NULL;
p->link=q;
p=q;
}
}
}
}
}
void Output(Graph g)
{
int i;
for(i=0;i<N;i++)
{
printf("顶点%d的边链表为:",i);
P *p=g.Head[i].Adjacent;
while(p)
{
printf("%d",p->VerAdj );
p=p->link;
if(p) printf("—>");
}
printf("\n");
}
}
int main()
{
Graph g;
Create(&g);
Output(g);
}