图(Graph)

while(!x)相当于x!=1;

while(x)相当于x==1;

一,图的存储方法;

1邻接矩阵存储方法:

1.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.2用邻接矩阵创建带权无向图:

  • 算法思路
    • 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);
}

1.3输出:

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");
    }
}

2.邻接表存储方法

2.1类型定义:

#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;//定义图类型

2.2用邻接表构造无权图

  • 算法思路
    • 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);
}

2.3输出:

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");
    }
}

二,图的遍历

1.深度优先遍历DFS

算法思想:借助visited[MAXV]={0}数组

  1. 从起点开始,访问与其相邻的第一个未被访问的节点。
  2. 如果该节点未被访问,则将其标记为已访问(visited=1)(并将其加入到栈中)。
  3. 继续访问该节点的下一个未被访问的相邻节点,重复步骤2。
  4. 如果该节点没有未被访问的相邻节点,(则从栈中弹出该节点)并返回到上一个节点,重复步骤3。

 

1.1以邻接表为存储结构的DFS

// 深度优先遍历
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;
}

 图(Graph)_第1张图片图(Graph)_第2张图片

1.2以邻接矩阵为存储结构的DFS

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;
}

 

2.广度优先遍历BFS

算法思想:借助visited[MAXV]数组和队列

  1. 从起点开始,将起点加入到队列中。
  2. 从队列中取出队首元素,并访问与其相邻的所有未被访问的节点
  3. 将这些节点标记为已访问,并将其加入到队列中。
  4. 重复步骤2和3直到队列为空

2.1以邻接表为存储结构的BFS

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;
        }
    }
}

图(Graph)_第3张图片图(Graph)_第4张图片

你可能感兴趣的:(数据结构,C,算法)