邻接表表示图的基本思想是只存储相关信息,适合存储稀疏图,由表头结点表和边表两部分组成。对图中的每个顶点建立一个带头结点的边链表,每个边链表的头结点又构成一个表头结点表,具体结构如下
以下为存储结构
typedef char ElemType;
//边表结点
typedef struct ArcNode{
int adjvex; //该弧指向定点的位置
struct ArcNode *nextarc; //指向下一弧的指针
int info;//权值
}ArcNode;
//表头结点
typedef struct VertexNode{
ElemType data;//顶点数据
ArcNode *firstarc;//指向该顶点第一条弧的指针
}VertexNode;
//表头结点表
typedef struct{
VertexNode vertex[N];
int vexnum,arcnum;//图的顶点数和弧数
int kind;//图的种类标志 0表示无向图
}AdjList;
深度优先搜索是指按照深度方向搜索,基本思想是
1、从图中某个顶点v0出发,首先访问v0
2、找出刚访问过的顶点v0的第一个未被访问的邻接点,然后访问该顶点,以该顶点为新的顶点,重复此步骤,直到刚访问过的顶点没有未被访问的邻接点为止。
3、返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点,访问该顶点;然后执行步骤2
相关函数如下
//深度优先搜索
void DepthFirstSearch(AdjList *L,int V[],int n){
printf("V%d ",n);
V[n]=1;
ArcNode *p=L->vertex[n].firstarc;
while(p!=NULL){
if(V[p->adjvex]==0){
DepthFirstSearch(L,V,p->adjvex);
}
p=p->nextarc;
}
}
广度优先搜索是指按照广度方向搜索,基本思想是
1、从图中某个顶点v0出发,首先访问v0;
2、依次访问v0到各个未被访问的邻接点;
3、分别从这些邻接点出发,依次访问它们的各个未被访问的邻接点
相关函数如下,
//定义队列
typedef struct{
int Q[M];
int front;
int rear;
}Queue;
//初始化队列
void InitQueue(Queue *Q){
Q->front=Q->rear=0;
}
//入队
void EnterQueue(Queue *Q,int n){
if((Q->rear+1)%M==Q->front){
printf("入队出错\n");
}else{
Q->Q[Q->rear]=n;
Q->rear=(Q->rear+1)%M;
}
}
//判断队列是否为空
i