while(!x)相当于x!=1;
while(x)相当于x==1;
#define MAXV 100
typedef struct {
int no;//定点编号
char info;//定点其他信息
}VertexType;//定点定义
typedef struct {
int adjMatrix[MAXV][MAXV];//邻接矩阵
int vexnum,arcnum;//定点数,弧数
VertexType Vexs[MAXV];//存放定点信息
}MGragh;//图定义
- 算法思路
- 1.输入总顶点数和总边数(为vexnum和arcnum赋值)
- 2.依次输入点的信息存入顶点表中(为vexs[i]赋值)。
- 3.初始化邻接矩阵,使每个权值初始化为极大值。
- 4.构造邻接矩阵
#include
#include
#define Max 999999//无穷大
MGragh CreateAdjMatrix(){
MGragh G;
int v1,v2,w;
scanf("%d %d",&G.vexnum,&G.arcnum);//输入总顶点数,总边数
for(int i=0;i的权值为w,边的权值为w
}
return (G);
}
void PrintMG(MGraph MG)// 输出邻接矩阵
{
int i, j;
for (i = 0; i < MG.vexnum; i++) {
for (j = 0; j < MG.vexnum; j++)
printf("%d", MG.edges[i][j]);
printf("\n");
}
}
#include
#include
#include
#define MAXV 9999
typedef struct ANode{
int adjvex;//该弧的终点位置
struct ANode *nextarc;//指向下一条弧的指针
char info;//该弧的相关信息可为weight
}ArcNode;//定义弧结点
typedef struct Vnode{
char data;//顶点域,存储顶点信息
ArcNode *firstarc;//指向第一条弧的表头指针
} VNode;//定义结点
typedef struct {
VNode AdjList[MAXV];//邻接表
int Vernum,arcnum;//定点数,边数
int kind;//图的种类标志
}ALGraph;//定义图类型
- 算法思路
- 1.输入总顶点数和总边数(为vexnum和arcnum赋值)
- 2.依次输入点的信息存入顶点表中(为AdjList[i].data赋值)。同时初始化邻接表,使每个结点的头指针初始化为NULL。
- 4.构造邻接表:输入每一条边的两个定点v1,v2。利用中间弧结点s(将s的终点置为v2,s->info赋值为G.AdjList[v2].data),再将s头插进G.AdjList[v1]。(无向图还要构造v1)
ALGraph CreatAdjList(ALGraph G){
scanf("%d %d",&G.Vernum,&G.arcnum);//输入图中顶点总数,弧总数
scanf("%d",&G.kind);getchar();//kind为0则G为无向图,若kind为1则G为有向图
for(int i=0;iadjvex=v2;//弧结点s的终点结点为v2
s->info=G.AdjList[v2].data;
s->nextarc=G.AdjList[v1].firstarc;//头插
G.AdjList[v1].firstarc=s;//头插
if(G.kind==0){//无向图的对称性
ArcNode *t;
t=(ArcNode*)malloc(sizeof(ArcNode));
t->adjvex=v1;
t->info=G.AdjList[v1].data;
t->nextarc=G.AdjList[v2].firstarc;
G.AdjList[v2].firstarc=t;
}
}
return (G);
}
void showALGraph(ALGraph *G){
for(int v=0;vVernum;v++){
printf("%c",G->AdjList[v].data);
ArcNode *p=G->AdjList[v].firstarc;
while(p){
printf("%c",p->info);
p=p->nextarc;
}
printf("\n");
}
}
算法思想:借助visited[MAXV]={0}数组
- 从起点开始,访问与其相邻的第一个未被访问的节点。
- 如果该节点未被访问,则将其标记为已访问(visited=1)(并将其加入到栈中)。
- 继续访问该节点的下一个未被访问的相邻节点,重复步骤2。
- 如果该节点没有未被访问的相邻节点,(则从栈中弹出该节点)并返回到上一个节点,重复步骤3。
// 深度优先遍历
void DFS(ALGraph G,int v,int visited[]){
visited[v]=1;// 标记当前顶点已经访问过
printf("%d ",G.AdjList[v].data);
ArcNode *p=G.AdjList[v].firstarc;
while(p!=NULL){
if(visited[p->adjvex]!=1){
//如果邻接顶点未被访问过,则递归调用DFS函数继续遍历
DFS(G, p->adjvex,visited);
}
p=p->nextarc;
}
}
int main(){
ALGraph G;
G=CreatAdjList(G);
int d;scanf("%d",&d);
int visited[MAXV]={0};
DFS(G,d-1,visited);
return 0;
}
void DFS(MGragh G,int v,int visited[]){
visited[v]=1;//标记已经访问的结点
printf("%d ",G.Vexs[v].no);
for(int w=0;w
int main(){
MGragh G;
G=CreateAdjMatrix();
int visited[MAXV]={0};
int v0;scanf("%d",&v0);//从V0开始遍历
DFS(G,v0-1,visited);
return 0;
}
算法思想:借助visited[MAXV]数组和队列
- 从起点开始,将起点加入到队列中。
- 从队列中取出队首元素,并访问与其相邻的所有未被访问的节点。
- 将这些节点标记为已访问,并将其加入到队列中。
- 重复步骤2和3,直到队列为空。
int main(){
ALGraph G;
G=CreatAdjList(G);
int d;scanf("%d",&d);//输入遍历初始点d
int visited[MAXV]={0};
BFS(G,d-1,visited);
return 0;
}
typedef struct{
int data[MAXV+1];
int front,rear;
}SqQueue;//队列
SqQueue initSqQueue(){//初始化队列
SqQueue q;
q.front=0;
q.rear=0; // 队头和队尾指针
return q;
}
// 广度优先遍历
void BFS(ALGraph G, int v, int visited[]) {
SqQueue Q; // 定义队列
Q=initSqQueue();
printf("%d ", G.AdjList[v].data); // 访问初始顶点v并打印顶点值
visited[v] = 1; // 标记顶点v已访问
Q.data[Q.rear++] = v; // 顶点v入队
while (Q.front != Q.rear) { // 队列不空
int j = Q.data[Q.front++]; // 出队
ArcNode *p = G.AdjList[j].firstarc;
while (p != NULL) {
if (visited[p->adjvex]!=1) {//结点未被访问
printf("%d ", G.AdjList[p->adjvex].data); // 打印顶点值
visited[p->adjvex] = 1; // 标记顶点已访问
Q.data[Q.rear++] = p->adjvex; // 该顶点入队
}
p = p->nextarc;
}
}
}