数据结构C语言实现----图

2021-04-07 07:25

阅读:460

标签:图片   出队   初始   loading   一个   算法   mamicode   size_t   ext   

 邻接表储存结构

/*邻接表的边*/
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
/*邻接表的结点*/
typedef struct VNode
{
    char date;
    ArcNode *firstarc;
}VNode;

  

创建一个邻接表储存结构的图

//创建一个邻接表类型的图
void CreatArcGraph(int count , VNode G[])
{
    ArcNode *p , *q;
    char c; //储存结点内数据
    int number; //储存要连接的结点
    printf("请输入各个结点的数据:\n");
    for (size_t i = 0; i 

  

图的遍历(1)-----深度优先搜索

//深度优先搜索一个连通图
void DFS(VNode G[] , int v)
{
    int w;
    printf("%c" , G[v].date); //访问当前结点
    printfed[v] = 1;
    w = FirstAdj(G , v);
    while (w!=-1)
    {
        if (printfed[w]==0)
        DFS(G,w);
        w = NextAdj(G , v);
    }
}
//对图G = (V,E)进行深度优化搜索的主算法
void Travel_DFS(VNode G[] , int n)
{
    for (size_t i = 0; i 

  

深度优先搜索实例

#include
#include
/*邻接表的边*/
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
/*邻接表的结点*/
typedef struct VNode
{
    char date;
    ArcNode *firstarc;
}VNode;

//创建一个邻接表类型的图
void CreatArcGraph(int count , VNode G[])
{
    ArcNode *p , *q;
    char c; //储存结点内数据
    int number; //储存要连接的结点
    printf("请输入各个结点的数据:\n");
    for (size_t i = 0; i next = NULL;
            p->adjvex = number;
            if (G[i].firstarc == NULL)
            {
                G[i].firstarc = p;
            }else
            {
                q->next = p;
            }
            q = p;
            scanf("%d" , &number);
        }
    }
}
int printfed[3];
//寻找第一个邻接点
int FirstAdj(VNode G[] , int v)
{
    return G[v].firstarc->adjvex;
}
//寻找下一个邻接点
int NextAdj(VNode G[] , int v)
{
    ArcNode *p;
    p = G[v].firstarc->next;
    while (p->next!=NULL )
    {
        p = p->next;
        if (printfed[p->adjvex]==0)
        {
            return p->adjvex;
        }
    }
    return -1;
}
//深度优先搜索一个连通图
void DFS(VNode G[] , int v)
{
    int w;
    printf("%c" , G[v].date); //访问当前结点
    printfed[v] = 1;
    w = FirstAdj(G , v);
    while (w!=-1)
    {
        if (printfed[w]==0)
        DFS(G,w);
        w = NextAdj(G , v);
    }
}
//对图G = (V,E)进行深度优化搜索的主算法
void Travel_DFS(VNode G[] , int n)
{
    for (size_t i = 0; i 

  

运行结果

技术图片

 

 

图的遍历(2)-------广度优先搜索

 

//广度优先搜索一个连通图
void BFS(VNode G[] , int v)
{
    initQueue(&q);
    //首先访问当前结点
    printf("%c" , G[v].date);
    visited[v] = 1;     //访问标记
    EnQueue(&q , v);     //入队列
    //
    int w;
    while (q.front==q.rear)
    {
        DeQueue(&q , &v);
        w = Firstadj(G , v);
        while (w!=-1)
        {
            if (visited[w]==0)
            {
                printf("%c",G[w].date);
                EnQueue(&q , w);
                visited[w] = 1;
            }
            w = Nextadj(G,v);
        }
    }
}
//广度优先搜索的主算法
void Travel_BFS(VNode G[] , int v)
{
    for (size_t i = 0; i 

  

广度优先搜索实例

如图:

技术图片

 

 

 

#include
#include
//////////////////////////////////////////////////////////////////////////////
//储存类型定义
//图边
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode *next;
}ArcNode;
//图结点
typedef struct VNode
{
    char date;
    ArcNode *firstarc;
}VNode;
//队列结点
typedef struct QNode
{
    int date;
    struct QNode *next;
}QNode , *QueuePtr;
//队列指针
typedef struct 
{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
////////////////////////////////////////////////////////////////////////////////
//队列操作
//创建队列
void initQueue(LinkQueue *q)
{
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
    if(!q->front) exit(0);
    q->front->next = NULL;
}
//入队列
void EnQueue(LinkQueue *q , int v )
{
    QueuePtr p;
    p = (QueuePtr)malloc(sizeof(QNode));
    if(!q->front) exit(0);
    p->date = v;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
}
//出队列
void DeQueue(LinkQueue *q , int *v)
{
    if (q->front==q->rear)
    {
        exit(0);
    }
    QueuePtr p;
    p = q->front->next;
    *v = p->date;
    q->front->next = p->next;
    if (q->rear==p)
    {
        q->front = q->rear =NULL;
    }
    free(p);
}
/////////////////////////////////////////////////////////////////////////////////////
//图操作
//创建一个图(邻接表)
void CreatArcNode(VNode G[] , int count)
{
    //为结点数组输入数据
    char c;
    printf("请输入要在各个结点存入的字符...");
    for (size_t i = 0; i adjvex = number;
            p->next = NULL;
    
            if (G[i].firstarc==NULL)
            {
                G[i].firstarc = p;
            }else
            {
                q->next = p;
            }
            q = p;
            scanf("%d",&number);
        }   
    }
}
/***********************************全局变量****************************************/
int visited[100];
LinkQueue q;


/////////////////////////////////////////////////////////////////////////////////
//广度优先搜索操作
//寻找第一个邻接点
int Firstadj(VNode G[] , int v)
{
    return G[v].firstarc->adjvex;
}
//寻找下一个邻接点
int Nextadj(VNode G[] , int v)
{
    ArcNode *p;
    p = G[v].firstarc->next;
    while (!p->next)
    {
        p = p->next;
        if (visited[p->adjvex]==0)
        {
            return p->adjvex;
        }
    }
    return -1;
}
//广度优先搜索一个连通图
void BFS(VNode G[] , int v)
{
    initQueue(&q);
    //首先访问当前结点
    printf("%c" , G[v].date);
    visited[v] = 1;     //访问标记
    EnQueue(&q , v);     //入队列
    //
    int w;
    while (q.front==q.rear)
    {
        DeQueue(&q , &v);
        w = Firstadj(G , v);
        while (w!=-1)
        {
            if (visited[w]==0)
            {
                printf("%c",G[w].date);
                EnQueue(&q , w);
                visited[w] = 1;
            }
            w = Nextadj(G,v);
        }
    }
}
//广度优先搜索的主算法
void Travel_BFS(VNode G[] , int v)
{
    for (size_t i = 0; i ",p->adjvex,G[p->adjvex].date);
                p = p->next;
            }
        }while(p!=NULL);
        putchar(‘\n‘);
    }
    //广度优先搜索
    Travel_BFS(G , count);
    getchar();
    return 0;
}

  

运行结果:

技术图片

 

数据结构C语言实现----图

标签:图片   出队   初始   loading   一个   算法   mamicode   size_t   ext   

原文地址:https://www.cnblogs.com/jerryleesir/p/13391243.html


评论


亲,登录后才可以留言!